不带表头节点的循环单向链表

来源:互联网 发布:航天信息a3软件下载 编辑:程序博客网 时间:2024/05/12 20:59
  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.     Link tmp;  
  21.     tmp = *head;  
  22.   
  23.     if(NULL == *head)  
  24.     {  
  25.         new_node->next = new_node;  
  26.         *head = new_node;  
  27.         return;  
  28.     }  
  29.     else  
  30.     {  
  31.         while(tmp->next != *head)  
  32.         {  
  33.             tmp = tmp->next;  
  34.         }  
  35.         tmp->next = new_node;  
  36.         new_node->next = *head;  
  37.         *head = new_node;  
  38.     }  
  39. }  
  40.   
  41. void display_node(Link head)  
  42. {  
  43.     Link tmp;  
  44.     tmp = head;  
  45.     if(NULL == head)  
  46.     {  
  47.         printf("link is empty!\n");  
  48.         return;  
  49.     }  
  50.   
  51.     while(tmp->next != head)  
  52.     {  
  53.         printf("num = %d\n",tmp->num);  
  54.         tmp = tmp->next;  
  55.     }  
  56.     printf("num = %d\n",tmp->num);  
  57. }  
  58.   
  59. void is_malloc_ok(Link new_node)  
  60. {  
  61.      if(new_node == NULL)  
  62.     {  
  63.         printf("malloc error!\n");  
  64.         exit(-1);  
  65.     }  
  66. }  
  67.   
  68. void create_newnode(Link * new_node)  
  69. {  
  70.     *new_node = (Link) malloc(sizeof(Node));  
  71.     is_malloc_ok(*new_node);  
  72. }  
  73.   
  74. void insert_node_tail(Link *head,Link new_node)  
  75. {  
  76.     Link tmp;  
  77.   
  78.     tmp = *head;  
  79.   
  80.     if(*head == NULL)  
  81.     {  
  82.         new_node->next = new_node;  
  83.         *head = new_node;  
  84.     }  
  85.     else   
  86.     {  
  87.         while(tmp->next != *head)  
  88.         {  
  89.             tmp = tmp->next;  
  90.         }  
  91.         tmp->next = new_node;  
  92.         new_node->next = *head;  
  93.         *head = new_node;  
  94.     }  
  95. }  
  96.   
  97. void makeEmpty(Link *head)  
  98. {  
  99.     Link tmp;  
  100.     Link head_old;  
  101.     head_old = *head;  
  102.   
  103.     tmp = *head;  
  104.     if(NULL == *head)  
  105.     {  
  106.         printf("Link is empty!\n");  
  107.         return;  
  108.     }  
  109.   
  110.     /*while (tmp != NULL) 
  111.     { 
  112.         *head = tmp->next; 
  113.         free(tmp); 
  114.         tmp = tmp->next; 
  115.     }*/  
  116.     while(tmp->next != head_old)  
  117.     {  
  118.         *head = (*head)->next;  
  119.         free(tmp);  
  120.         tmp = *head;  
  121.     }  
  122.     free(tmp);  
  123.     *head = NULL;  
  124. }  
  125. void insert_node_mid(Link *head,Link new_node,int num)  
  126. {  
  127.     Link tmp;  
  128.     Link p;  
  129.   
  130.     tmp = *head;  
  131.     p = *head;  
  132.   
  133.     if(NULL == *head)  
  134.     {  
  135.         new_node->next = new_node;  
  136.         *head = new_node;  
  137.         return;  
  138.     }  
  139.     else  
  140.     {  
  141.         while((num > tmp->num) &&(tmp->next != *head))  
  142.         {  
  143.             p = tmp;  
  144.             tmp = tmp->next;  
  145.         }  
  146.         if(num <= tmp->num)  
  147.         {  
  148.             if(tmp == *head)  
  149.             {  
  150.                 new_node->next = tmp;  
  151.                 *head = new_node;  
  152.             }  
  153.             else  
  154.             {  
  155.                 p->next = new_node;  
  156.                 new_node->next = tmp;  
  157.             }  
  158.                
  159.         }  
  160.         if((num > tmp->num)&&(tmp->next == *head))  
  161.         {  
  162.             tmp->next = new_node;  
  163.             new_node->next = *head;  
  164.         }  
  165.     }  
  166. }  
  167. void reverse_link(Link *head)  
  168. {  
  169.     Link p1 = NULL;  
  170.     Link p2 = NULL;  
  171.     Link p3 = NULL;  
  172.     Link old_p3 = NULL;  
  173.   
  174.     if(NULL == *head || (*head)->next == *head)  
  175.     {  
  176.         printf("No need reverse!\n");  
  177.         return;  
  178.     }  
  179.     else  
  180.     {  
  181.         p3 = *head;  
  182.         p2 = p3->next;  
  183.         if(p2->next == *head)  
  184.         {  
  185.             p2->next = p3;  
  186.             *head = p2;  
  187.             p3->next = *head;  
  188.             return;  
  189.         }  
  190.         p1 = p2->next;  
  191.         old_p3 = p3;  
  192.         while(p1->next != *head)  
  193.         {  
  194.             p2->next = p3;  
  195.             p3 = p2;  
  196.             p2 = p1;  
  197.             p1= p1->next;  
  198.         }  
  199.         p2->next = p3;  
  200.         p1->next = p2;  
  201.         *head = p1;  
  202.         old_p3->next = *head;  
  203.     }  
  204. }  
  205.   
  206. int main()  
  207. {  
  208.     Link head = NULL;  
  209.     Link new_node = NULL;  
  210.     int i;  
  211.   
  212.     create_link(&head);  
  213.       
  214.     for(i = 0; i < 10;i++)  
  215.     {  
  216.         create_newnode(&new_node);  
  217.         new_node->num = i;  
  218.           
  219.         //insert_node_mid(&head,new_node,new_node->num);  
  220.         insert_node_head(&head,new_node);  
  221.           
  222.         //insert_node_tail(&head,new_node);  
  223.     }  
  224.       
  225.   
  226.     display_node(head);  
  227.       
  228.     //makeEmpty(&head);  
  229.   
  230.    reverse_link(&head);  
  231.   
  232.     display_node(head);  
  233.   
  234.     return 0;  
  235. }  
0 0
原创粉丝点击