链表 的 增删改查(源码分析)

来源:互联网 发布:行知实践基地感受作文 编辑:程序博客网 时间:2024/06/05 09:41

链表 的 增删改查(源码分析)

Code:
  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <string.h>   
  4.   
  5. struct Node   
  6. {   
  7.     char *City;   
  8.     int Temp;   
  9.     struct Node *Next;   
  10. };   
  11.   
  12. typedef struct Node *Link;   
  13. Link Head;   
  14. int NodeCount;   
  15.   
  16. int AddNodeAscend(Link);   
  17. int DuplicateNode(Link,Link);   
  18. void CreateList(void);   
  19. int DeleteNode(Link);   
  20.   
  21. void FreeNode(Link);   
  22. void ShowNodes(void);   
  23. int NodeCmp(Link,Link);   
  24.   
  25. /* -----function definition*/  
  26. int AddNodeAscend(Link to_add)   
  27. {   
  28.     Link pn,   
  29.          prev,   
  30.          curr;   
  31.     struct Node dummy;   
  32.     int i;   
  33.     pn = (Link)malloc(sizeof(struct Node));   
  34.     if(NULL== pn)   
  35.     {   
  36.         return 0;   
  37.     }   
  38.     memcpy(pn,to_add,sizeof(struct Node));   
  39.     /*--set up a dummy node to simply logic*/  
  40.     dummy.Next = Head;   
  41.     prev = &dummy;   
  42.     curr = Head;   
  43.     /* ---insert node pn--*/  
  44.     for( ; ;prev = curr,curr = curr->Next)   
  45.     {   
  46.         if(NULL == curr)   
  47.         break;   
  48.         i = NodeCmp(pn,curr);   
  49.         if(i<=0)   
  50.         break;   
  51.     }   
  52.     if(0==curr && i)   
  53.      if(DuplicateNode(curr,pn)==0)   
  54.        return (1);   
  55.     prev->Next = pn;   
  56.     pn->Next = curr;   
  57.     Head = dummy.Next;   
  58.     return (1);   
  59. }   
  60. int DuplicateNode(Link inlist,Link duplicate)   
  61. {   
  62.     FreeNode(duplicate);   
  63.     return (0);   
  64. }   
  65.   
  66. int DeleteNode(Link to_delete)   
  67. {   
  68.     Link curr,   
  69.          prev;   
  70.     int i;   
  71.    /*Is there anything in the list?----*/  
  72.    if(NULL == Head)   
  73.       return (0);   
  74.    for(prev = NULL,curr = Head;   
  75.        curr !=NULL&&(i=NodeCmp(to_delete,curr))>0;   
  76.        prev =curr,curr = curr->Next)   
  77.    /*Find a match ,so delete it ---*/  
  78.    if(curr !=NULL&&i==0)   
  79.    {   
  80.        if(prev)   
  81.          prev->Next = curr->Next;   
  82.        else  
  83.          Head = curr->Next;   
  84.       FreeNode(curr);   
  85.       NodeCount -=1;   
  86.       return (1);   
  87.    }   
  88.    return (0);   
  89. }   
  90.   
  91. int NodeCmp(Link a,Link b)   
  92. {   
  93.     /*returns 1,0,-1 ,depending on whether  
  94.     *the data in a is  
  95.     *greater,equal,or less than b  
  96.     *  
  97.     */  
  98.     if(a->Temp!=b->Temp)   
  99.       return (a->Temp-b->Temp);   
  100.     else  
  101.       return strcmp(a->City,b->City);   
  102. }   
  103.   
  104. void CreateList(void)   
  105. {   
  106.     Head =NULL;   
  107.     NodeCount = 0;   
  108. }   
  109. void FreeNode(Link n)   
  110. {   
  111.     free(n->City);   
  112.     free(n);   
  113. }   
  114.   
  115. void ShowNodes(void)   
  116. {   
  117.     Link pn;   
  118.     int count,median;   
  119.     for(count=0,pn=Head; pn; pn= pn->Next)   
  120.     count+=1;   
  121.   //compute the median Node;   
  122.     median =count/2+1;   
  123.     if(count)   
  124.     {   
  125.         count = 0;   
  126.         for(pn=Head; pn ; pn=pn->Next)   
  127.         {   
  128.             printf("%-20s:%3d",pn->City,pn->Temp);   
  129.             count+=1;   
  130.             if(count == median)   
  131.             printf("---Median---");   
  132.             printf("/n");   
  133.         }   
  134.     }   
  135.     else  
  136.     {   
  137.         printf("Empty list /n");   
  138.     }   
  139. }   
  140.   
  141.   
  142. int main(int argc,char *argv[])   
  143. {   
  144.     FILE *fin;   
  145.     char buffer[120];   
  146.   
  147.     struct Node n;   
  148.     if(argc !=2)   
  149.     {   
  150.         fprintf(stderr,"Usage:citytemp filename.ext/n");   
  151.         exit(EXIT_FAILURE);   
  152.     }   
  153.     fin = fopen(argv[1],"rt");   
  154.     if(fin == NULL)   
  155.     {   
  156.         fprintf(stderr,"Cannot open/find %s/n",argv[2]);   
  157.         exit(EXIT_FAILURE);   
  158.     }   
  159.     while (!feof(fin))   
  160.     {   
  161.         if(fgets(buffer,127,fin)==NULL)   
  162.         break;   
  163.         buffer[strlen(buffer-1)]='/0';   
  164.         n.City = strdup(buffer+3);   
  165.         buffer[3] = '/0';   
  166.         n.Temp = atoi(buffer);   
  167.         if(AddNodeAscend(&n)==0)   
  168.         {   
  169.             fprintf(stderr,"Error adding node.abborting/n");   
  170.             exit(EXIT_FAILURE);   
  171.         }   
  172.     }   
  173.     ShowNodes();   
  174.   
  175.     printf("/n");   
  176.     DeleteNode(Head);   
  177.     ShowNodes();   
  178.   
  179.     while(Head && Head->Next)   
  180.     {   
  181.         printf("/n");   
  182.         DeleteNode(Head->Next);   
  183.         ShowNodes();   
  184.     }   
  185.     printf("/n");   
  186.     DeleteNode(Head);   
  187.     ShowNodes();   
  188.     fclose(fin);   
  189.     return (EXIT_SUCCESS);   
  190. }  

 

 

原创粉丝点击