ZT C语言链表操作(新增单向链表的逆序建立)

这个不好懂,不如看 转贴:C语言链表基本操作http://www.cnblogs.com/jeanschen/p/3542668.html

ZT 链表逆序http://www.cnblogs.com/jeanschen/p/3538966.html

 

C语言链表操作(新增单向链表的逆序建立)

分类: C/C++ 1017人阅读 评论(0) 收藏 举报
众所周知,链表是数据结构的基础,掌握链表很重要http://blog.csdn.net/liushuaikobe/article/details/6785964
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. typedef struct NODE  
  5. {  
  6.     int e;  
  7.     struct NODE *next;  
  8. }node, *LinkList;  
  9.   
  10. LinkList build_linklist()  
  11. {  
  12.     FILE *fp;  
  13.     if ((fp=fopen("number.txt","r"))==NULL)  
  14.     {  
  15.         printf("Can not open the file!");  
  16.         exit (1);  
  17.     }  
  18.     int t;  
  19.     LinkList r,p,head=NULL;  
  20.     while (fscanf(fp,"%d",&t)>0)  
  21.     {  
  22.         p=(LinkList)malloc(sizeof(node));  
  23.         p->e=t;  
  24.         p->next=NULL;  
  25.         if (!head)  
  26.             head=p;  
  27.         else  
  28.             r->next=p;  
  29.         r=p;  
  30.     }  
  31.     return head;  
  32. }  
  33.   
  34. void search(LinkList head,int toSearch)  
  35. {  
  36.     int count=0;  
  37.     int flag=0;  
  38.     LinkList r=head;  
  39.     while (r!=NULL)  
  40.     {  
  41.         count++;  
  42.         if (r->e==toSearch)  
  43.         {  
  44.             printf("已经找到该元素,在第%d个位置 ",count);  
  45.             flag=1;  
  46.             break;  
  47.         }  
  48.         r=r->next;  
  49.     }  
  50.     if (!flag)  
  51.         printf("没有找到该元素! ");  
  52. }  
  53.   
  54. void del(LinkList *head,int toDel)  
  55. {  
  56.     if (!(*head))  
  57.     {  
  58.         printf("请先创建链表! ");  
  59.         return ;  
  60.     }  
  61.     LinkList r=*head;  
  62.     LinkList p=NULL;  
  63.     int flag=0;  
  64.     while (r!=NULL)  
  65.     {  
  66.         if ((r==*head)&&(r->e==toDel))  
  67.         {  
  68.             (*head)=(*head)->next;  
  69.             flag=1;  
  70.             break;  
  71.         }  
  72.         if ((r!=*head)&&(r->e==toDel))  
  73.         {  
  74.             flag=1;  
  75.             for (p=*head;p!=NULL;p=p->next)  
  76.             {  
  77.                 if (p->next==r)  
  78.                 {  
  79.                     break;  
  80.                 }  
  81.             }  
  82.             p->next=r->next;  
  83.             free(r);  
  84.             break;  
  85.         }  
  86.         r=r->next;  
  87.     }  
  88.     if (!flag)  
  89.         printf("未找到该元素! ");  
  90. }  
  91.   
  92. void insert(LinkList head,int n,int toInsert)  
  93. {  
  94.     if (!head)  
  95.     {  
  96.         printf("请先创建链表!");  
  97.         return ;  
  98.     }  
  99.     int count=0;  
  100.     LinkList p=head;  
  101.     while (p!=NULL)  
  102.     {  
  103.         if ((count++)==n)  
  104.         {  
  105.             LinkList r=(LinkList)malloc(sizeof(node));  
  106.             r->e=toInsert;  
  107.             r->next=p->next;  
  108.             p->next=r;  
  109.             break;  
  110.         }  
  111.         p=p->next;  
  112.     }  
  113. }  
  114.   
  115. int getLengh(LinkList head)  
  116. {  
  117.     LinkList p=head;  
  118.     int i=0;  
  119.     while (p!=NULL)  
  120.     {  
  121.         i++;  
  122.         p=p->next;  
  123.     }  
  124.     return i;  
  125. }  
  126.   
  127. void show(LinkList head)  
  128. {  
  129.     LinkList p=head;  
  130.     while (p!=NULL)  
  131.     {  
  132.         printf("%d  ",p->e);  
  133.         p=p->next;  
  134.     }  
  135.     printf(" ");  
  136. }  
  137.   
  138. void rebuild(LinkList *head)  
  139. {  
  140.     LinkList r,p;  
  141.     p=(*head)->next;  
  142.     r=p->next;  
  143.     (*head)->next=NULL;  
  144.     while(p!=NULL)  
  145.     {  
  146.         p->next=*head;  
  147.         *head=p;  
  148.         p=r;  
  149.         if (r==NULL)  
  150.             continue;  
  151.         else  
  152.             r=r->next;  
  153.     }  
  154. }  
  155.   
  156. void sort_linklist(LinkList head)  
  157. {  
  158.     LinkList r,p;  
  159.     int temp=0;  
  160.     for (r=head;r->next!=NULL;r=r->next)  
  161.      for (p=r->next;p!=NULL;p=p->next)  
  162.          if ((r->e)>(p->e))  
  163.          {  
  164.              temp=r->e;  
  165.              r->e=p->e;  
  166.              p->e=temp;  
  167.          }  
  168. }  
  169.   
  170. int main()  
  171. {  
  172.     LinkList head=build_linklist();  
  173.     printf("链表已建立!原链表: ");  
  174.     show(head);  
  175.     sort_linklist(head);  
  176.     printf("链表已经按照从小到大的顺序排好!排序后: ");  
  177.     show(head);  
  178.     printf(" ");  
  179.     int c=0;  
  180.     while (1)  
  181.     {  
  182.         printf("1.查找指定元素 ");  
  183.         printf("2.插入一个给定元素 ");  
  184.         printf("3.删除一个指定元素 ");  
  185.         printf("4.统计链表的长度 ");  
  186.         printf("5.输出线性链表 ");  
  187.         printf("6.实现安逆序链表的重建 ");  
  188.         printf("请选择:");  
  189.         scanf("%d",&c);  
  190.         switch (c)  
  191.         {  
  192.             case 1:  
  193.             {  
  194.                 printf("请输入要查找的元素:");  
  195.                 int t;  
  196.                 scanf("%d",&t);  
  197.                 search(head,t);  
  198.                 printf(" ");  
  199.                 break;  
  200.             }  
  201.             case 2:  
  202.             {  
  203.                 printf("请输入要插入的元素的值:");  
  204.                 int toi;  
  205.                 scanf("%d",&toi);  
  206.                 printf("请输入要插入的位置:");  
  207.                 int position;  
  208.                 scanf("%d",&position);  
  209.                 insert(head,position,toi);  
  210.                 printf(" ");  
  211.                 break;  
  212.             }  
  213.             case 3:  
  214.             {  
  215.                  printf("请输入要删除的元素的值:");  
  216.                  int tod;  
  217.                  scanf("%d",&tod);  
  218.                  del(&head,tod);  
  219.                  printf(" ");  
  220.                  break;  
  221.             }  
  222.             case 4:  
  223.             {  
  224.                 printf("链表的长度是:%d ",getLengh(head));  
  225.                 printf(" ");  
  226.                 break;  
  227.             }  
  228.             case 5:  
  229.             {  
  230.                 show(head);  
  231.                 printf(" ");  
  232.                 break;  
  233.             }  
  234.             case 6:  
  235.             {  
  236.                 rebuild(&head);  
  237.                 show(head);  
  238.                 printf(" ");  
  239.                 break;  
  240.             }  
  241.             default:  
  242.             {  
  243.                 exit(0);  
  244.             }  
  245.         }  
  246.     }  
  247.     return 0;  
  248. }  
原文地址:https://www.cnblogs.com/jeanschen/p/3538817.html