链表操作

来源:互联网 发布:java 招聘 大街 编辑:程序博客网 时间:2024/04/30 07:53




 

24、链表操作



题目:

链表操作,
(1)单链表就地逆置,
(2)合并链表





  1. #include <cstdio>  
  2. #include <stdlib.h>  
  3.   
  4. typedef struct node  
  5. {  
  6.     struct node *next;  
  7.     int value;  
  8. }LinkList;  
  9.   
  10. void CreateList(LinkList *L);  
  11. void Reverse(LinkList *L);  
  12. void Output(LinkList *L);  
  13.   
  14. int main()  
  15. {  
  16.     LinkList *L=(LinkList*)malloc(sizeof(LinkList)); //L为空头结点  
  17.     L->next=NULL;  
  18.   
  19.     CreateList(L);  
  20.     printf("Before reverse,the items are: \n");  
  21.     Output(L);  
  22.   
  23.     Reverse(L);  
  24.     printf("After reverse,the items are:  \n");  
  25.     Output(L);  
  26.   
  27.     return 0;  
  28. }  
  29.   
  30. void CreateList(LinkList *L) //头插法建立单链表  
  31. {  
  32.     int value;  
  33.     LinkList *tail=L,*newNode=NULL; //tail为链表尾结点  
  34.     printf("Please input values:\n");  
  35.     while (scanf("%d",&value)!=EOF)  
  36.     {  
  37.         newNode=(LinkList*)malloc(sizeof(LinkList));  
  38.         newNode->value=value;  
  39.         newNode->next=NULL;  
  40.   
  41.         tail->next=newNode;  
  42.         tail=newNode;  
  43.     }  
  44. }  
  45.   
  46. void Reverse(LinkList *L)  //把链表结点拆开,重新按尾插法建立单链表  
  47. {  
  48.     LinkList*tail=L->next,*head=NULL,*s=NULL;  //tail为链表尾部,head为断开的链表头结点,s为head后一个结点  
  49.   
  50.     if (tail==NULL)  
  51.     {  
  52.         return;  
  53.     }  
  54.     head=tail->next;  
  55.     tail->next=NULL;  
  56.   
  57.     while (head!=NULL)  
  58.     {  
  59.         s=head->next;  
  60.         head->next=tail;  
  61.         L->next=head;  
  62.         tail=head;  
  63.   
  64.         head=s;  
  65.     }  
  66. }  
  67.   
  68. void Output(LinkList *L)  
  69. {  
  70.     LinkList *r=L->next;  
  71.     while (r!=NULL)  
  72.     {  
  73.         printf("%d  ",r->value);  
  74.         r=r->next;  
  75.     }  
  76.     printf("\n");  
  77. }  

解释一下逆置算法:



还有一种方法:


从一本书上截了一张图


关键代码如下:

[cpp] view plaincopy
  1. LinkList *p=head,*q;  
  2.     head=NULL;  
  3.     while (p!=NULL)  
  4.     {  
  5.         q=p->next;  
  6.         p->next=head;  
  7.         head=p;  
  8.         p=q;  
  9.     }  


给出完整代码:

[cpp] view plaincopy
  1. #include <cstdio>  
  2. #include <stdlib.h>  
  3.   
  4. typedef struct node  
  5. {  
  6.     struct node *next;  
  7.     int value;  
  8. }LinkList;  
  9.   
  10. void CreateList(LinkList *L);  
  11. void Reverse(LinkList *L);  
  12. void Output(LinkList *L);  
  13.   
  14. int main()  
  15. {  
  16.     LinkList *L=(LinkList*)malloc(sizeof(LinkList)); //L为空头结点  
  17.     L->next=NULL;  
  18.   
  19.     CreateList(L);  
  20.     printf("Before reverse,the items are: \n");  
  21.     Output(L);  
  22.   
  23.     Reverse(L);  
  24.     printf("After reverse,the items are:  \n");  
  25.     Output(L);  
  26.   
  27.     return 0;  
  28. }  
  29.   
  30. void CreateList(LinkList *L) //头插法建立单链表  
  31. {  
  32.     int value;  
  33.     LinkList *tail=L,*newNode=NULL; //tail为链表尾结点  
  34.     printf("Please input values:\n");  
  35.     while (scanf("%d",&value)!=EOF)  
  36.     {  
  37.         newNode=(LinkList*)malloc(sizeof(LinkList));  
  38.         newNode->value=value;  
  39.         newNode->next=NULL;  
  40.   
  41.         tail->next=newNode;  
  42.         tail=newNode;  
  43.     }  
  44. }  
  45.   
  46. void Reverse(LinkList *L)  //把链表结点拆开,重新按尾插法建立单链表  
  47. {  
  48.     LinkList*head=L->next,*p=NULL,*q=NULL;  //tail为链表尾部,head为断开的链表头结点,s为head后一个结点  
  49.   
  50.     if (head==NULL)  
  51.     {  
  52.         return;  
  53.     }  
  54.   
  55.     p=head;  
  56.     head=NULL;  
  57.     while (p!=NULL)  
  58.     {  
  59.         q=p->next;  
  60.         p->next=head;  
  61.         head=p;  
  62.   
  63.         if (q==NULL)  //如果p为最后一个结点,则把头结点指向它  
  64.         {  
  65.             L->next=p;  
  66.         }  
  67.   
  68.         p=q;  
  69.     }  
  70. }  
  71.   
  72. void Output(LinkList *L)  
  73. {  
  74.     LinkList *r=L->next;  
  75.     while (r!=NULL)  
  76.     {  
  77.         printf("%d  ",r->value);  
  78.         r=r->next;  
  79.     }  
  80.     printf("\n");  
  81. }  


原创粉丝点击