Chinaunix首页 | 论坛 | 博客
  • 博客访问: 625278
  • 博文数量: 262
  • 博客积分: 8433
  • 博客等级: 中将
  • 技术积分: 2141
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-31 09:37
文章分类

全部博文(262)

文章存档

2012年(1)

2011年(168)

2010年(92)

2009年(1)

分类: C/C++

2011-01-26 15:58:06

  1. /*
  2.  *单链表的操作
  3.  */
  4. #include <stdio.h>
  5. #include <stdlib.h>

  6. #define OK 0
  7. #define ERROR -1

  8. typedef int ElemType;
  9. typedef int Status;

  10. typedef struct ListNode{
  11.     ElemType data;
  12.     ListNode* next;
  13. }ListNode;

  14. //创建一个空链表

  15. Status ListInit(ListNode** L)                    //注意:这里由于要改变L,所以要传递&L,用双指针来传递

  16. {
  17.     *L = (ListNode*)malloc(sizeof(ListNode));    //1、分配内存

  18.     if(!*L)
  19.     {
  20.         printf("L malloc err! \n");
  21.         return ERROR;
  22.     }
  23.     (*L)->next = NULL;                            //2、制定尾节点为空


  24.     return OK;
  25. }

  26. Status ListCreatT(ListNode* L)
  27. {
  28.     ListNode* P;    //始终指向尾节点

  29.     P = L;

  30.     printf("请输入元素,ctrl+z,ENTER,结束\n");
  31.     ElemType e;
  32.     while(scanf("%d",&e)!=EOF)
  33.     {
  34.         printf("data:%d \n",e);
  35.         ListNode* Q;    //存储尾元素

  36.         Q = (ListNode*)malloc(sizeof(ListNode));
  37.         Q->data = e;
  38.         P->next = Q;
  39.         P = Q;
  40.     }

  41.     P->next = NULL;        //添加尾节点



  42.     return OK;
  43. }

  44. Status ListCreat(ListNode *L,ElemType e)
  45. {
  46.     ListNode* P;
  47.     P = L;        //指向头节点


  48.     //寻找尾节点

  49.     while(P->next)
  50.     {
  51.         P = P->next;
  52.     }

  53.     //创建新节点

  54.     ListNode* Q;
  55.     Q = (ListNode*)malloc(sizeof(ListNode));
  56.     Q->data = e;
  57.     P->next = Q;    //指向尾节点

  58.     Q->next = NULL;

  59.     return OK;
  60. }

  61. Status ListDestroy(ListNode *L)
  62. {
  63.     ListNode* P;
  64.     while(L->next)
  65.     {
  66.         P = L->next;    //定义临时变量来存储下一个节点的内存

  67.         free(L);
  68.         L = P;
  69.     }
  70.     return OK;
  71. }

  72. //在第i(0

  73. Status ListInsert(ListNode* L,int i,ElemType e)
  74. {
  75.     ListNode* P;
  76.     P = L;
  77.     //找到要插入的位置的前驱节点

  78.     int j;
  79.     for(j=0;j<i;j++)
  80.         P = P->next;
  81.     //插入元素e

  82.     ListNode* Q;
  83.     Q = (ListNode*)malloc(sizeof(ListNode));
  84.     if(!Q)
  85.     {
  86.         printf("malloc err! \n");
  87.         return ERROR;
  88.     }
  89.     Q->data = e;
  90.     Q->next = P->next;
  91.     P->next = Q;

  92.     return OK;
  93. }

  94. //删除第i个元素,并由e返回其值

  95. Status ListDelete(ListNode* L,int i,ElemType* e)
  96. {
  97.     ListNode* P;
  98.     P = L;

  99.     //找到前驱节点

  100.     while(--i)
  101.     {
  102.         P = P->next;
  103.     }

  104.     //删除制定的节点

  105.     ListNode* Q;    //制定当前节点

  106.     Q = P->next;
  107.     *e = Q->data;
  108.     P->next = Q->next;
  109.     free(Q);
  110.     
  111.     return OK;
  112. }


  113. void main()
  114. {
  115.     //单链表初始化

  116.     ListNode *L;
  117.     if(ListInit(&L))    //在这里,L代表链表首地址,但是我们要通过ListInit函数来改变L,所以说我们还要索取地址的地址

  118.         printf("ListCreat Err! \n");
  119.     printf("ListInit OK!L's addr is %p \n",*L);

  120.     //单链表尾插法创建各个节点

  121. //    ListCreatT(L);


  122.     //单个元素创建链表

  123.     printf("请输入要加入链表的值:ctrl+z结束: \n");
  124.     ElemType e;
  125.     while(scanf("%d",&e) != EOF)    //scanf用法卡了我一下午,基础不够劳啊

  126.     {
  127.         printf("NodeData:%d \n",e);
  128.         ListCreat(L,e);
  129.     }

  130.     //打印创建后的单链表元素

  131.     ListNode *A=L;
  132.     while(A->next)
  133.     {
  134.         A = A->next;
  135.         printf("List data:%d \n",A->data);
  136.     
  137.     }

  138.     //插入元素e

  139.     int i;    //插入的位置

  140.     ElemType a;
  141.     printf("请输入要插入的位置i= \n");
  142.     scanf("%d",&i);
  143.     printf("请输入要插入的元素e= \n");
  144.     scanf("%d",&a);
  145.     if(ListInsert(L,i,a))
  146.         printf("ListInsert Err! \n");
  147.     printf("插入后的各个元素为: \n");
  148.     //打印插入后的元素

  149.     ListNode* C;
  150.     C = L;
  151.     while(C->next)
  152.     {
  153.         C = C->next;
  154.         printf("List Data:%d \n",C->data);
  155.     }

  156.     //删除第i个元素

  157.     printf("请输入要删除的位置i= \n");
  158.     scanf("%d",&i);
  159.     ElemType b;
  160.     if(ListDelete(L,i,&b))
  161.         printf("List delete err! \n");
  162.     printf("删除的元素为:%d \n",b);
  163.     printf("删除后的单链表为:\n");

  164.     C = L;
  165.     while(C->next)
  166.     {
  167.         C = C->next;
  168.         printf("List Data:%d \n",C->data);
  169.     }


  170.     //销毁单链表

  171.     if(ListDestroy(L))
  172.         printf("List Destroy Err! \n");

  173.     printf("List Destroy OK! \n");
  174. }
 List.rar   
阅读(832) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~