首页 > 其他 > 详细

单链表的相关操作

时间:2014-04-10 21:49:08      阅读:475      评论:0      收藏:0      [点我收藏+]

单链表的创建及相关的操作.(单链表的创建,删除,插入,排序,逆置,测长)
第一步:创建单链表的节点

1 typedef struct Node
2 {
3     int     data;
4     struct  node* next;
5 }node,*pnode;//node = struct Node,pnode = struct node*

第二步:创建链表

bubuko.com,布布扣
 1 //创建一个新的链表,并返回头指针
 2 pnode create_list()
 3 {
 4     int data;
 5     pnode pHead = (pnode)malloc(sizeof(node));
 6     pnode pCurrent = pHead;
 7     pCurrent->next = NULL;
 8     if(NULL == pHead)
 9     {
10         printf("pHead malloc failed !\n");
11         exit(-1);
12     }
13     printf("Input data (q to quit):\n");
14     while(scanf("%d",&data)==1)
15     {
16         pnode pnew = (pnode)malloc(sizeof(node));
17         if(NULL == pnew)
18         {
19             printf("malloc failed!\n");
20             exit(-1);
21         }
22         pnew->data = data;
23         pCurrent->next = pnew;
24         pnew->next = NULL;
25         pCurrent = pnew;
26     }
27     return pHead;
28 }
bubuko.com,布布扣

第三步:遍历这个链表并打印

bubuko.com,布布扣
 1 //遍历链表
 2 void travel_list(pnode pHead)
 3 {
 4     pnode pCurrent = pHead->next;
 5     printf("the list are :\n");
 6     while(pCurrent != NULL)
 7     {
 8      printf("%d ",pCurrent->data);
 9      pCurrent = pCurrent->next;
10     }
11     printf("\n");
12 }
bubuko.com,布布扣

第四步:单链表的插入
在链表中插入你个节点,可能有四种情况
①在链表的中间位置插入
②在链表的起始位置插入
③在链表的尾部插入
④原链表为空,即插入到起始位置,有时结束位置

bubuko.com,布布扣
 1 //在链表的第i个位置插入元素value
 2 pNode insert(pNode pHead, int value, int i)
 3 {
 4     pNode pre = pHead;
 5     for (int k = 1; k < i;k++)
 6     {
 7         pre = pre->link;
 8     }
 9     pNode pnew = (pNode)malloc(sizeof(pNode));
10     pnew->data = value;
11     /*
12        pnew->link = pre->link;
13        pre->link  是当前节点,即让新建的节点指向当前节点
14        再让前驱结点指向新建的节点
15        等同于
16        pNode pcurrent;//当前节点
17        pnew->link = pcurrent;
18        pre->link = pnew;
19        */
20     pnew->link = pre->link;
21     pre->link = pnew;
22     return pHead;
23 }
bubuko.com,布布扣

第五步:删除
在单链表中删除值为value的节点

bubuko.com,布布扣
 1 pNode delete_list(pNode pHead, int value)
 2 {
 3     pNode pre = NULL;//pcurrent为目标结点
 4     pNode pcurrent = pHead->link;//pre前驱结点
 5     if (pHead==NULL)
 6     {
 7         return NULL;
 8     }
 9     while (pcurrent->data != value&&pcurrent->link != NULL)
10     {
11         pre = pcurrent;
12         pcurrent = pcurrent->link;
13     }
14     pre->link = pcurrent->link;//删除操作
15     free(pcurrent);
16     return pHead;
17 }
bubuko.com,布布扣

第六步:单链表的测长

bubuko.com,布布扣
 1 int length_list(pNode pHead)
 2 {
 3     pNode pcurrent = pHead->next;
 4     while(pcurrent != NULL)
 5     {
 6         count++;
 7         pcurrent = pcurrent->next;
 8     }
 9     return count;
10 }
bubuko.com,布布扣

第七步:对链表进行冒泡排序

bubuko.com,布布扣
 1 void bubblesort_list(pNode pHead)
 2 {
 3     pNode i,k;//声明两个临时变量,用于for循环
 4     int temp;
 5     for(i = pHead->next;i != NULL;i = i->next)
 6         for(k = i->next;k != NULL;k = k->next)
 7         {
 8             if(i->data > k->data)
 9             {
10                 temp = i->data;
11                 i->data = k->data;
12                 k->data = temp;
13             }
14         }
15     return ;
16 }
bubuko.com,布布扣

第八步:单链表的逆置(有很多种方法,递归,循环)

bubuko.com,布布扣
 1 pNode reverse2(pNode head)
 2 {
 3     pNode F,S,T;
 4     F = head;
 5     S = F->link;
 6     T = S->link;
 7     head->link = NULL;
 8     while(T!=NULL)
 9     {
10         S->link = F;
11         F = S;
12         S = T;
13         T = T->link;
14     }
15     S->link = F;
16     return S;
17 }
bubuko.com,布布扣

 

 

单链表的相关操作,布布扣,bubuko.com

单链表的相关操作

原文:http://www.cnblogs.com/weixuancome/p/3656282.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!