无表头节点的单向链表

  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3.   
  4. struct node  
  5. {  
  6.     int num;  
  7.     struct node *next;  
  8. };  
  9.   
  10. typedef struct node Node;  
  11. typedef struct node * Link;  
  12.   
  13. void create_link(Link *head)  
  14. {  
  15.     *head = NULL;  
  16. }  
  17.   
  18. void insert_node_head(Link *head,Link new_node)  
  19. {  
  20.     new_node->next = *head;  
  21.     *head = new_node;  
  22. }  
  23.   
  24. void display_node(Link head)  
  25. {  
  26.     Link tmp;  
  27.     tmp = head;  
  28.     if(NULL == head)  
  29.     {  
  30.         printf("link is empty!\n");  
  31.         return;  
  32.     }  
  33.   
  34.     while(tmp != NULL)  
  35.     {  
  36.         printf("num = %d\n",tmp->num);  
  37.         tmp = tmp->next;  
  38.     }  
  39. }  
  40.   
  41. void is_malloc_ok(Link new_node)  
  42. {  
  43.      if(new_node == NULL)  
  44.     {  
  45.         printf("malloc error!\n");  
  46.         exit(-1);  
  47.     }  
  48. }  
  49.   
  50. void create_newnode(Link * new_node)  
  51. {  
  52.     *new_node = (Link)malloc(sizeof(Node));  
  53.     is_malloc_ok(*new_node);  
  54. }  
  55.   
  56. void insert_node_tail(Link *head,Link new_node)  
  57. {  
  58.     Link tmp;  
  59.   
  60.     tmp = *head;  
  61.   
  62.     if(*head == NULL)  
  63.     {  
  64.         new_node->next = *head;  
  65.         *head = new_node;  
  66.     }  
  67.     else   
  68.     {  
  69.         while(tmp->next != NULL)  
  70.         {  
  71.             tmp = tmp->next;  
  72.         }  
  73.         tmp->next = new_node;  
  74.         new_node->next = NULL;  
  75.     }  
  76. }  
  77.   
  78. /*void insert_node_mid(Link *head,Link new_node,int num) 
  79. { 
  80.     Link tmp; 
  81.     tmp = *head; 
  82.      
  83.     if(NULL == *head) 
  84.     { 
  85.         printf("link is empty!\n"); 
  86.         return; 
  87.     } 
  88.     else 
  89.     { 
  90.         while(tmp->num != num && tmp->next != NULL) 
  91.         { 
  92.             tmp = tmp->next; 
  93.         } 
  94.         if(tmp->num == num) 
  95.         { 
  96.             new_node->next = tmp->next; 
  97.             tmp->next = new_node; 
  98.         } 
  99.         else 
  100.         { 
  101.             printf("no such node!\n"); 
  102.         } 
  103.     } 
  104.  
  105. }*/  
  106.   
  107. void delete_node(Link *head,int num)  
  108. {  
  109.     Link tmp;  
  110.     Link p;  
  111.     tmp = p = *head;  
  112.   
  113.     if(NULL == *head)  
  114.     {  
  115.         printf("link is empty!\n");  
  116.         return;  
  117.     }  
  118.   
  119.     while(tmp->num != num && tmp->next != NULL)  
  120.     {  
  121.         p = tmp;  
  122.         tmp = tmp->next;  
  123.     }  
  124.   
  125.     if(tmp->num == num)  
  126.     {  
  127.         if(tmp == *head)  
  128.         {  
  129.             *head = tmp->next;  
  130.             free(tmp);  
  131.         }  
  132.         else  
  133.         {  
  134.             p->next = tmp->next;  
  135.             free(tmp);  
  136.         }  
  137.     }  
  138.     else  
  139.     {  
  140.         printf("no such node!\n");  
  141.     }  
  142. }  
  143.   
  144. void release(Link *head)  
  145. {  
  146.     Link tmp;  
  147.   
  148.     tmp = *head;  
  149.   
  150.     /*while (tmp != NULL) 
  151.     { 
  152.         *head = tmp->next; 
  153.         free(tmp); 
  154.         tmp = tmp->next; 
  155.     }*/  
  156.     while(tmp != NULL)  
  157.     {  
  158.         *head = (*head)->next;  
  159.         free(tmp);  
  160.         tmp = *head;  
  161.     }  
  162. }  
  163. void insert_node_mid(Link *head,Link new_node,int num)  
  164. {  
  165.     Link tmp;  
  166.     Link p;  
  167.   
  168.     tmp = *head;  
  169.     p = *head;  
  170.   
  171.     if(NULL == *head)  
  172.     {  
  173.         new_node->next = *head;  
  174.         *head = new_node;  
  175.     }  
  176.     else  
  177.     {  
  178.         while((num > tmp->num) &&(tmp->next != NULL))  
  179.         {  
  180.             p = tmp;  
  181.             tmp = tmp->next;  
  182.         }  
  183.         if(num <= tmp->num)  
  184.         {  
  185.             if(tmp == *head)  
  186.             {  
  187.                 new_node->next = tmp;  
  188.                 *head = new_node;  
  189.             }  
  190.             else  
  191.             {  
  192.                 p->next = new_node;  
  193.                 new_node->next = tmp;  
  194.             }  
  195.                
  196.         }  
  197.         if((num > tmp->num)&&(tmp->next == NULL))  
  198.         {  
  199.             tmp->next = new_node;  
  200.             new_node->next = NULL;  
  201.         }  
  202.     }  
  203. }  
  204. void reverse_link(Link *head)  
  205. {  
  206.     Link p1 = NULL;  
  207.     Link p2 = NULL;  
  208.     Link p3 = NULL;  
  209.   
  210.     if(NULL == *head || (*head)->next == NULL)  
  211.     {  
  212.         printf("No need reverse!\n");  
  213.         return;  
  214.     }  
  215.     else  
  216.     {  
  217.         p3 = *head;  
  218.         p2 = p3->next;  
  219.         if(p2->next == NULL)  
  220.         {  
  221.             p2->next = p3;  
  222.             p3->next = NULL;  
  223.             *head = p2;  
  224.             return;  
  225.         }  
  226.         p1 = p2->next;  
  227.         p3->next = NULL;  
  228.         while(p1->next != NULL)  
  229.         {  
  230.             p2->next = p3;  
  231.             p3 = p2;  
  232.             p2 = p1;  
  233.             p1= p1->next;  
  234.         }  
  235.         p2->next = p3;  
  236.         p1->next = p2;  
  237.         *head = p1;  
  238.     }  
  239. }  
  240.   
  241. int main()  
  242. {  
  243.     Link head = NULL;  
  244.     Link new_node = NULL;  
  245.     int i;  
  246.     //int num;  
  247.   
  248.     create_link(&head);  
  249.     //printf("Enter 10 number!\n");  
  250.     for(i = 0; i < 10;i++)  
  251.     {  
  252.         create_newnode(&new_node);  
  253.         new_node->num = i;  
  254.         //scanf("%d",&(new_node->num));  
  255.         insert_node_mid(&head,new_node,new_node->num);  
  256.         //insert_node_head(&head,new_node);  
  257.         //insert_node_tail(&head,new_node);  
  258.     }  
  259.   
  260.     //printf("please input a num!\n");  
  261.     //scanf("%d",&num);  
  262.   
  263. //  create_newnode(&new_node);  
  264. //  new_node->num =  num;  
  265.   
  266. //  insert_node_mid(&head,new_node,10);  
  267.       
  268. //  delete_node(&head,num);  
  269.   
  270.     display_node(head);  
  271.       
  272.     //release(&head);  
  273.   
  274.     reverse_link(&head);  
  275.   
  276.     display_node(head);  
  277.   
  278.     return 0;  
  279. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值