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

  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 = *head;  
  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->next;  
  43.     if(tmp == head)  
  44.     {  
  45.         printf("Link is empty!\n");  
  46.         return;  
  47.     }  
  48.   
  49.     while(tmp != head)  
  50.     {  
  51.         printf("num = %d\n",tmp->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.   
  64.     while(tmp->next != *head)  
  65.     {  
  66.         tmp = tmp->next;  
  67.     }  
  68.     tmp->next = new_node;  
  69.     new_node->next = *head;  
  70.   
  71. }  
  72.   
  73. /*void insert_node_mid(Link *head,Link new_node,int num) 
  74. { 
  75.     Link tmp; 
  76.     tmp = *head; 
  77.      
  78.     if(NULL == *head) 
  79.     { 
  80.         printf("link is empty!\n"); 
  81.         return; 
  82.     } 
  83.     else 
  84.     { 
  85.         while(tmp->num != num && tmp->next != NULL) 
  86.         { 
  87.             tmp = tmp->next; 
  88.         } 
  89.         if(tmp->num == num) 
  90.         { 
  91.             new_node->next = tmp->next; 
  92.             tmp->next = new_node; 
  93.         } 
  94.         else 
  95.         { 
  96.             printf("no such node!\n"); 
  97.         } 
  98.     } 
  99.  
  100. }*/  
  101.   
  102. void delete_node(Link *head,int num)  
  103. {  
  104.     Link tmp;  
  105.     Link p;  
  106.     tmp = (*head)->next;  
  107.     p = *head;  
  108.   
  109.     if(tmp == *head)  
  110.     {  
  111.         printf("link is empty!\n");  
  112.         return;  
  113.     }  
  114.   
  115.     while(tmp->num != num && tmp->next != *head)  
  116.     {  
  117.         p = tmp;  
  118.         tmp = tmp->next;  
  119.     }  
  120.   
  121.     if(tmp->num == num)  
  122.     {  
  123.         p->next = tmp->next;  
  124.         free(tmp);  
  125.     }  
  126.     else  
  127.     {  
  128.         printf("no such node!\n");  
  129.     }  
  130. }  
  131.   
  132. void release(Link *head)  
  133. {  
  134.     Link tmp;  
  135.   
  136.     tmp = (*head)->next;  
  137.   
  138.     /*while (tmp != NULL) 
  139.     { 
  140.         *head = tmp->next; 
  141.         free(tmp); 
  142.         tmp = tmp->next; 
  143.     }*/  
  144.     while(tmp != *head)  
  145.     {  
  146.         (*head)->next = tmp->next;  
  147.         free(tmp);  
  148.         tmp = (*head)->next;  
  149.     }  
  150. }  
  151. void insert_node_mid(Link *head,Link new_node,int num)  
  152. {  
  153.     Link tmp;  
  154.     Link p;  
  155.   
  156.     tmp = (*head)->next;  
  157.     p = *head;  
  158.   
  159.     if(tmp == *head)  
  160.     {  
  161.         new_node->next = (*head)->next;  
  162.         (*head)->next = new_node;  
  163.         return;  
  164.     }  
  165.     else  
  166.     {  
  167.     while((num > tmp->num) &&(tmp->next != *head))  
  168.     {  
  169.         p = tmp;  
  170.         tmp = tmp->next;  
  171.     }  
  172.     if( tmp->next == *head)  
  173.     {  
  174.         if(num > tmp->num)  
  175.         {  
  176.             tmp->next = new_node;  
  177.             new_node->next = *head;  
  178.         }  
  179.         else  
  180.         {  
  181.             p->next = new_node;  
  182.             new_node->next = tmp;  
  183.         }  
  184.     }  
  185.     else  
  186.     {  
  187.         p->next = new_node;  
  188.         new_node->next = tmp;  
  189.     }  
  190.     }  
  191.   
  192. }  
  193. void reverse_link(Link *head)  
  194. {  
  195.     Link p1 = NULL;  
  196.     Link p2 = NULL;  
  197.     Link p3 = NULL;  
  198.   
  199.     if((*head)->next == *head ||(*head)->next->next == *head)  
  200.     {  
  201.         printf("No need reverse!\n");  
  202.         return;  
  203.     }  
  204.     else  
  205.     {  
  206.         p3 = (*head)->next;  
  207.         p2 = p3->next;  
  208.         if(p2->next == *head)  
  209.         {  
  210.             p2->next = p3;  
  211.             p3->next = *head;  
  212.             (*head)->next = p2;  
  213.             return;  
  214.         }  
  215.         p1 = p2->next;  
  216.         p3->next = *head;  
  217.         while(p1->next != *head)  
  218.         {  
  219.             p2->next = p3;  
  220.             p3 = p2;  
  221.             p2 = p1;  
  222.             p1= p1->next;  
  223.         }  
  224.         p2->next = p3;  
  225.         p1->next = p2;  
  226.         (*head)->next = p1;  
  227.     }  
  228. }  
  229.   
  230. int main()  
  231. {  
  232.     Link head = NULL;  
  233.     Link new_node = NULL;  
  234.     int i;  
  235.     int num;  
  236.   
  237.     create_link(&head);  
  238.   
  239.     for(i = 0; i < 10;i++)  
  240.     {  
  241.         create_newnode(&new_node);  
  242.         new_node->num = i;  
  243.         //insert_node_mid(&head,new_node,new_node->num);  
  244.         insert_node_head(&head,new_node);  
  245.         //insert_node_tail(&head,new_node);  
  246.     }  
  247.   
  248.     printf("please input a num!\n");  
  249.     scanf("%d",&num);  
  250.   
  251.     //create_newnode(&new_node);  
  252.     //new_node->num =  num;  
  253.       
  254.     //insert_node_mid(&head,new_node,num);  
  255.     delete_node(&head,num);  
  256.       
  257.     display_node(head);  
  258.   
  259.     release(&head);  
  260.   
  261.     //reverse_link(&head);  
  262.   
  263.     display_node(head);  
  264.   
  265.     return 0;  
  266. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值