1. //Time : 2013-01-07  
  2. //List  
  3. //reference by nowamagic  
  4. #include<stdio.h>  
  5.  
  6. #include"malloc.h"  
  7.  
  8. #include<stdlib.h>  
  9.  
  10. #include"time.h"  
  11.  
  12. #define ERROR   0  
  13. #define OK      1  
  14. #define FALSE   0  
  15. #define TRUE    1  
  16.  
  17. #define MemoryAllocFail printf("\nMemory allocation failure\n")  
  18. #define ERRORINSERT     printf("\nERRORINSERT\n")  
  19. #define ERRORDELETE     printf("\nERRORDELETE\n")  
  20. #define GETELEMERROR    printf("\nGETELEMERROR\n")  
  21. #define Status  int  
  22.  
  23.  
  24. typedef int ListElemType;  
  25. typedef struct ListNode  
  26. {  
  27.     ListElemType    iData;  
  28.     struct ListNode *next;  
  29. }ListNode,*LinkList;  
  30.  
  31.  
  32. //List Initial  
  33. Status InitList(LinkList *L)  
  34. {  
  35.     //  Note  
  36.     // *L is HeadNode  
  37.     //  L is HeadPointer  
  38.     *L = (LinkList)malloc(sizeof(ListNode));  
  39.     if(!(*L))  
  40.     {  
  41.         MemoryAllocFail;  
  42.         return ERROR;  
  43.     }  
  44.     (*L)->next = NULL;  
  45.  
  46.     return OK;  
  47. }  
  48.  
  49.  
  50. //Get the Length of List  
  51. int ListLength(LinkList L)  
  52. {  
  53.     LinkList p;  
  54.     int iLength;  
  55.  
  56.     p = L->next;// pointer 'p' points to the first node of the list L  
  57.     iLength = 0;//the counter of the length  
  58.  
  59.     while(p)  
  60.     {  
  61.         ++iLength;  
  62.         p = p->next;  
  63.     }  
  64.  
  65.     return iLength;  
  66. }  
  67.  
  68.  
  69. //print the one elem of the list  
  70. Status visit(ListElemType e)  
  71. {  
  72.     printf("->%d",e);  
  73.     return OK;  
  74. }  
  75.  
  76.  
  77. //traverse the list  
  78. Status ListTraverse(LinkList L)  
  79. {  
  80.     //if(L->next == NULL)  
  81.     LinkList p;  
  82.     p = L->next;  
  83.     while(p)  
  84.     {  
  85.         visit(p->iData);  
  86.         p = p->next;  
  87.     }  
  88.     printf("\n");  
  89.  
  90.     return OK;  
  91. }  
  92.  
  93.  
  94. //Insert 'e' into the list  
  95. Status ListInsert(LinkList *L,int i,ListElemType e)  
  96. {  
  97.     int j;  
  98.     LinkList p,s;  
  99.  
  100.     p = *L;  
  101.     j = 0;  
  102.     while(p && j<i)  
  103.     {  
  104.         p = p->next;  
  105.         j++;  
  106.     }  
  107.  
  108.     if(!p || j>i)  
  109.     {  
  110.         ERRORINSERT;  
  111.         return ERROR;  
  112.     }  
  113.  
  114.     s = (LinkList)malloc(sizeof(ListNode));  
  115.     s->iData = e;  
  116.     s->next = p->next;  
  117.     p->next = s;  
  118.  
  119.     return OK;  
  120. }  
  121.  
  122.  
  123. //delete  
  124. Status ListDelete(LinkList *L,int i,ListElemType *e)  
  125. {  
  126.     int j;  
  127.     LinkList p,q;  
  128.  
  129.     p = *L;  
  130.     j = 1;  
  131.     while(p->next && j<i)  
  132.     {  
  133.         ++j;  
  134.         p = p->next;  
  135.     }  
  136.  
  137.     if(!(p->next) || j>i)  
  138.     {  
  139.         ERRORDELETE;  
  140.         return ERROR;  
  141.     }  
  142.  
  143.     q = p->next;  
  144.     *e = q->iData;  
  145.  
  146.     free(q);//free the node which has been deleted  
  147.  
  148.     return OK;  
  149. }  
  150.  
  151.  
  152. //get elem ('i' locatin) of the list  
  153. Status GetElem(LinkList L,int i,ListElemType *e)  
  154. {  
  155.     int j;  
  156.     LinkList p;  
  157.       
  158.     j = 1;  
  159.     p = L->next;  
  160.  
  161.     while(p && j<i)  
  162.     {  
  163.         p = p->next;  
  164.         ++j;  
  165.     }  
  166.  
  167.     if(!p || j>i)  
  168.     {  
  169.         GETELEMERROR;  
  170.         return ERROR;  
  171.     }  
  172.  
  173.     *e = p->iData;  
  174.  
  175.     return OK;  
  176. }  
  177.  
  178.  
  179.  
  180. //Location  
  181. Status LocateElem(LinkList L,ListElemType e)  
  182. {  
  183.     int i;  
  184.     LinkList p;  
  185.  
  186.     i = 0;  
  187.     p = L->next;  
  188.  
  189.     while(p)  
  190.     {  
  191.         ++i;  
  192.         if(p->iData == e)  
  193.         {  
  194.             return i;  
  195.         }  
  196.         p = p->next;  
  197.     }  
  198.  
  199.     return ERROR;  
  200. }  
  201.  
  202.  
  203.  
  204. //clear list  
  205. Status ClearList(LinkList *L)  
  206. {  
  207.     LinkList p,q;  
  208.     p = (*L)->next;  
  209.     while(p)  
  210.     {  
  211.         q = p->next;  
  212.         free(p);  
  213.         p = q;  
  214.     }  
  215.  
  216.     (*L)->next = NULL;  
  217.  
  218.     return OK;  
  219. }  
  220.  
  221.  
  222.  
  223. //Create list   
  224. Status CreateListFromHead(LinkList *L,int n)  
  225. {  
  226.     LinkList s;  
  227.     int i;  
  228.     srand(time(0));  
  229.     *L = (LinkList)malloc(sizeof(ListNode));  
  230.  
  231.     (*L)->next = NULL;  
  232.     for(i=0;i<n;i++)  
  233.     {  
  234.         s = (LinkList)malloc(sizeof(ListNode));  
  235.         s->iData = rand()%100 + 1;  
  236.         s->next = (*L)->next;  
  237.         (*L)->next = s;  
  238.     }  
  239.  
  240.     return OK;  
  241. }  
  242.  
  243. //CreateList  
  244. Status CreateListFromHail(LinkList *L,int n)  
  245. {  
  246.     LinkList p,r;  
  247.     int i;  
  248.     srand(time(0));  
  249.  
  250.     *L = (LinkList)malloc(sizeof(ListNode));  
  251.     r=*L;  
  252.     for(i=0;i<n;i++)  
  253.     {  
  254.         p = (LinkList)malloc(sizeof(ListNode));  
  255.         p->iData = rand()%100 + 1;  
  256.         r->next = p;  
  257.         r = p;  
  258.     }  
  259.     r->next = NULL;  
  260.  
  261.     return OK;  
  262. }  
  263.  
  264.  
  265. //ListReverse2  
  266. LinkList ListReverse2(LinkList L)  
  267. {  
  268.     LinkList current,p;  
  269.     if(L == NULL)  
  270.     {  
  271.         return L;  
  272.     }  
  273.     current=L->next;  
  274.     while(current->next != NULL)  
  275.     {  
  276.         p=current->next;  
  277.         current->next = p->next;  
  278.         p->next = L->next;  
  279.         L->next = p;  
  280.     }  
  281.     return L;  
  282. }  
  283.  
  284.  
  285. //getlastn  
  286. LinkList getlastn(LinkList L,int n)  
  287. {  
  288.     if(n<= 0 || n > ListLength(L))  
  289.     {  
  290.         printf("\nERROR\n");  
  291.         exit(0);  
  292.     }  
  293.     int i;  
  294.     LinkList firstNode,secNode;  
  295.     i=0;  
  296.     firstNode = L;  
  297.     //firstNode 先走n步  
  298.     while(i<n && firstNode->next != NULL)  
  299.     {  
  300.         //正数N个节点,firstNode指向正的第N个节点  
  301.         i++;  
  302.         firstNode = firstNode->next;  
  303.         //printf("%d\n",i);  
  304.     }  
  305.     secNode = L;  
  306.     //然后两个指针一起走  
  307.     while(firstNode != NULL)  
  308.     {  
  309.         firstNode = firstNode->next;  
  310.         secNode = secNode->next;  
  311.     }  
  312.     return secNode;//secNode即为倒数第n个结点  
  313. }  
  314.  
  315.  
  316.  
  317. //GetMidNode  
  318. Status GetMidNode(LinkList L,ListElemType *e)  
  319. {  
  320.     LinkList search,mid;  
  321.     mid = search = L;  
  322.     while(search->next != NULL)  
  323.     {  
  324.         if(search->next ->next != NULL)  
  325.         {  
  326.             search=search->next ->next ;  
  327.             mid = mid->next ;  
  328.         }  
  329.         else 
  330.         {  
  331.             search = search->next ;  
  332.         }  
  333.     }  
  334.     *e = mid->next ->iData ;  
  335.     return OK;  
  336. }  
  337.  
  338.  
  339. //Loop  
  340. int HasLoop1(LinkList L)  
  341. {  
  342.     int step1 = 1;  
  343.     int step2 = 2;  
  344.     LinkList p = L;  
  345.     LinkList q = L;  
  346.       
  347.     while (p != NULL && q != NULL && q->next != NULL)  
  348.     {  
  349.         p = p->next;  
  350.         if (q->next != NULL)  
  351.             q = q->next->next;  
  352.         printf("p:%d, q:%d \n", p->iData, q->iData);  
  353.         if (p == q)  
  354.             return 1;  
  355.     }  
  356.     return 0;  
  357. }  
  358.  
  359. //loop  
  360. int HasLoop3(LinkList L)  
  361. {  
  362.     int step1 = 1;  
  363.     int step2 = 2;  
  364.     LinkList p = L;  
  365.     LinkList q = L;  
  366.     while(p != NULL && q != NULL && q->next != NULL)  
  367.     {  
  368.         p = p->next ;  
  369.         if(q->next != NULL)  
  370.             q = q->next ->next ;  
  371.         if(p == q)  
  372.             return 1;  
  373.     }  
  374.     return 0;  
  375. }  
  376.  
  377. //loop  
  378. int HasLoop2(LinkList L)  
  379. {  
  380.     LinkList cur1 = L;  
  381.     int pos1 = 0;  
  382.     while(cur1)  
  383.     {          
  384.         LinkList cur2 = L;  
  385.         int pos2 = 0;  
  386.         pos1 ++;  
  387.         while(cur2)  
  388.         {          
  389.             pos2 ++;   
  390.             if(cur2 == cur1)  
  391.             {     
  392.                 if(pos1 == pos2)  
  393.                     break;   
  394.                 else         
  395.                     return 1;  
  396.             }  
  397.             cur2 = cur2->next;  
  398.         }  
  399.         cur1 = cur1->next;  
  400.     }  
  401.     return 0;  
  402. }  
  403.  
  404. //buildloop  
  405. Status BuildListLoop(LinkList *L,int num)  
  406. {  
  407.     int i=0;  
  408.     LinkList cur = *L;   
  409.     LinkList tail = NULL;  
  410.  
  411.     if(num<=0 || L==NULL)  
  412.     {  
  413.         return ERROR;  
  414.     }  
  415.  
  416.     for(i = 1;i<num;i++)  
  417.     {  
  418.         if(cur==NULL)  
  419.         {  
  420.             return ERROR;  
  421.         }  
  422.         cur = cur->next ;  
  423.     }  
  424.     tail = cur;  
  425.     while(tail->next)  
  426.     {  
  427.         tail = tail->next ;  
  428.     }  
  429.     tail->next = cur;  
  430.  
  431.     return OK;  
  432. }  
  433.  
  434.  
  435. //remove node which duplicate  
  436. LinkList RemoveDupNode(LinkList L)  
  437. {  
  438.     LinkList p,q,r;  
  439.     p=L->next;  
  440.     while(p)  
  441.     {  
  442.          q=p;  
  443.          while(q->next)  
  444.          {  
  445.              if(q->next->iData==p->iData)  
  446.              {  
  447.                  r=q->next;   
  448.                  q->next=r->next;  
  449.                  free(r);  
  450.              }  
  451.              else 
  452.                  q=q->next;  
  453.          }  
  454.          p=p->next;  
  455.     }  
  456.     return L;  
  457. }  
  458.  
  459. //remove node which duplicate  
  460. LinkList RemoveDupNode2(LinkList L)  
  461. {  
  462.     LinkList p,q,r;  
  463.     p=L->next ;  
  464.     while(p)  
  465.     {  
  466.         q=p;  
  467.         while(q->next)  
  468.         {  
  469.             if(q->next ->iData == p->iData )  
  470.             {  
  471.                 r=q->next ;  
  472.                 q->next = r->next ;  
  473.                 free(r);  
  474.             }  
  475.             else 
  476.                 q=q->next ;  
  477.         }  
  478.         p=p->next ;  
  479.     }  
  480.     return L;  
  481. }  
  482.  
  483.  
  484. //main  
  485. Status main(void)  
  486. {  
  487.     LinkList L;  
  488.  
  489.     //LinkList tmp;  
  490.  
  491.     int elem;  
  492.  
  493.     //InitList(&L);  
  494.     //CreateListFromHead(&L,7);  
  495.     //ListTraverse(L);  
  496.  
  497.  
  498.     //BuildListLoop(&L,3);  
  499.  
  500.     //if(HasLoop2(L))  
  501.         //printf("\nthe list has loop\n");  
  502.  
  503.     //tmp = getlastn(L,8);  
  504.     //GetMidNode(L,&elem);  
  505.     //printf("\n%d\n",elem);  
  506.     //printf("\n%d\n",tmp->iData);  
  507.  
  508.     //RemoveDupNode2(L);  
  509.     //ListTraverse(L);  
  510.  
  511.     return OK;  
  512. }