带头结点的单向链表

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