各种基本算法实现小结(一)—— 链 表

各种基本算法实现小结(一)—— 单链表

(均已测试通过)

单链表(测试通过)   

测试环境:VS 2010

 1     #include <stdio.h>  
 2     struct _node  
 3     {  
 4         int data;  
 5         struct _node *next;  
 6     };  
 7     typedef struct _node list;  
 8     void display(list *l)  
 9     {  
10         list *p;  
11         p=l;  
12         while(p->next)  
13         {  
14             printf("%5d", p->next->data);  
15             p=p->next;  
16         }  
17     }  
18     void main()  
19     {  
20         int i, n;  
21         list *h, *p, *s;  
22         printf("Enter num n:");  
23         scanf("%d", &n);  
24         h=(list*)malloc(sizeof(list));  
25         h->data=-1;  
26         h->next=NULL;  
27         s=p=h;  
28         for(i=n;i>0;i--)  
29         {  
30             p=(list*)malloc(sizeof(list));  
31             scanf("%d", &(p->data));  
32             p->next=h->next;  
33             h->next=p;  
34             h=h->next;  
35         }  
36         display(s);  37     }  

运行结果:


=================================================

单链表各种操作(测试通过)   

测试环境:  VS 2010

  1     #include <stdio.h>  
  2     #include <malloc.h>  
  3     #include <stdlib.h>  
  4     struct _node  
  5     {  
  6         int data;  
  7         struct _node *next;  
  8     };  
  9     typedef struct _node node, *plist;  
 10     plist init_list()  
 11     {  
 12         plist pl;  
 13         pl=(plist)malloc(sizeof(node));  
 14         if(NULL==pl)  
 15         {  
 16             printf("init list,  malloc is fail.../n");  
 17             return NULL;  
 18         }  
 19         pl->data=-1;  
 20         pl->next=NULL;  
 21         return pl;  
 22     }  
 23     int isempty_list(plist pl)  
 24     {  
 25         if(NULL==pl || NULL!=pl->next)  
 26             return 1;  
 27         else  
 28             return 0;  
 29     }  
 30     plist clear_list(plist pl)  
 31     {  
 32         pl=NULL;  
 33         return pl;  
 34     }  
 35     void destroy_list(plist pl)  
 36     {  
 37         plist p, s;  
 38           
 39         p=pl->next;  
 40         while(p)  
 41         {  
 42             s=p;  
 43             p=p->next;  
 44             free(s);       
 45         }  
 46           
 47         pl=NULL;  
 48     }  
 49     void insert_item(plist pl, int i, int e)  
 50     {  
 51         int j=1;  
 52         plist p, s;  
 53         p=pl;  
 54         while(p && j<i)  
 55         {  
 56             p=p->next;  
 57             j++;  
 58         }  
 59         if(!p || j>i)  /* >len or <1  */  
 60             printf("Insert fail.../n");  
 61         s=(plist)malloc(sizeof(node));  
 62         s->data=e;  
 63         s->next=p->next;  
 64         p->next=s;  
 65     }  
 66     void display(plist pl)  
 67     {  
 68         plist p;  
 69         p=pl->next;  
 70         while(pl && p)  
 71         {  
 72             printf("%5d", p->data);  
 73             p=p->next;  
 74         }  
 75         printf("/n/n");  
 76     }  
 77     int getbyid_item(plist pl, int i)  
 78     {  
 79         plist p=pl->next;  
 80         int j=1;  
 81         while(p && j<i)  
 82         {  
 83             p=p->next;  
 84             j++;  
 85         }  
 86         if(!p || j>i)  /* >len or <1  */  
 87         {  
 88             printf("fail.../n");  
 89             exit(1);  
 90         }  
 91         return p->data;  
 92     }  
 93     int locate_item(plist pl, int e)  
 94     {  
 95         plist p=pl->next;  
 96         int j=1;  
 97         while(p->data != e && p->next)  
 98         {  
 99             p=p->next;  
100             j++;  
101         }  
102         if(p->data == e)  
103             return j;  
104         else  
105         {  
106             printf("There is n %d in list/n", e);  
107             return -1;  
108         }  
109     }  
110     void delete_item(plist pl, int i, int *e)  
111     {  
112         plist p=pl;  
113         plist q;  
114         int j=1;  
115         while(p->next && j<i)  
116         {  
117             p=p->next;  
118             j++;  
119         }  
120         if(!p->next || j>i)  /* >len or <1  */  
121         {  
122             printf("fail..../n");  
123             return;  
124         }  
125         q=p->next;  
126         p->next=q->next;  
127         *e=q->data;  
128         free(q);  
129     }  
130     int len_list(plist pl)  
131     {  
132         int j=0;  
133         plist p=pl;  
134         while(pl && p->next)  
135         {  
136             j++;  
137             p=p->next;  
138         }  
139         return j;  
140     }  
141     plist traverse_list(plist pl)  
142     {  
143         plist h, p, s;  
144           
145         if(!pl || !pl->next)  
146             return pl;  
147         h=pl->next;  
148         s=h;  
149         p=s->next;  
150         h->next=NULL;  
151         while(p)  
152         {  
153             s=p;  
154             p=p->next;  
155             s->next=h;  
156             h=s;  
157         }  
158         pl->next=h;  
159           
160         return pl;  
161     }  
162     void main()  
163     {  
164         int len, pos, *del;  
165         plist pl=NULL;  
166         del=(int *)malloc(sizeof(int));  
167         pl=init_list();  
168         isempty_list(pl);  
169         insert_item(pl, 1, 1);  
170         insert_item(pl, 2, 3);  
171         insert_item(pl, 3, 5);  
172         insert_item(pl, 4, 7);  
173         insert_item(pl, 5, 9);  
174         insert_item(pl, 6, 11);  
175         display(pl);  
176         len=len_list(pl);  
177         printf("link list len: %d/n", len);  
178         pos=locate_item(pl, 7);  
179         printf("num 7 pos: %d/n", pos);  
180         delete_item(pl, 3, del);  
181         printf("delete pos 3 num: %d/n", *del);  
182         display(pl);  
183         printf("link list traverse.../n");  
184         pl=traverse_list(pl);  
185         display(pl);  
186         destroy_list(pl);  187     }  

运行结果:


=================================================

单向循环链表(测试通过)   

测试环境: VS 2010

  1     #include <stdio.h>  
  2     #include <malloc.h>  
  3     struct _node  
  4     {  
  5         int data;  
  6         struct _node *next;  
  7     };  
  8     typedef struct _node node, *plist;  
  9     plist init_list()  
 10     {  
 11         plist pl=(plist)malloc(sizeof(node));  
 12         if(!pl)  
 13         {  
 14             printf("error malloc fail.../n");  
 15             return NULL;  
 16         }  
 17         pl->data=-1;  
 18         pl->next=pl;    /* pl->next=NULL */  
 19         return pl;  
 20     }  
 21     void insert_item(plist pl, int pos, int data)  
 22     {  
 23         int j=0;  
 24         plist p,s;  
 25         s=p=pl;  
 26         while(p && j<pos-1)  
 27         {  
 28             p=p->next;  
 29             j++;  
 30         }  
 31         if(!p || j>pos-1)  
 32         {  
 33             printf("Error insert fail.../n");  
 34             return;  
 35         }  
 36         s=(plist)malloc(sizeof(node));  
 37         if(!s)  
 38         {  
 39             printf("Error malloc fail.../n");  
 40             return;  
 41         }  
 42         s->data=data;  
 43         s->next=p->next;  
 44         p->next=s;  
 45     }  
 46     int find_item(plist pl, int data)  
 47     {  
 48         plist s,p;  
 49         s=p=pl;  
 50         p=p->next;  
 51         while(s != p)  
 52         {  
 53             if(data==p->data)  
 54                 return 1;  
 55             p=p->next;  
 56         }  
 57         return 0;  
 58     }  
 59     void delete_item(plist pl, int data)  
 60     {  
 61         plist p,s;  
 62         s=p=pl;  
 63         if(data == p->data) /* first item is equal with data, then last item = second item */  
 64         {  
 65             s=p;  
 66             while(s != p->next)  
 67                 p=p->next;  
 68             p->next=s->next;  
 69             return;  
 70         }  
 71         while(s != p->next) /* first item is not equal with data */  
 72         {  
 73             if(data == p->next->data)  
 74             {  
 75                 p->next=p->next->next;  
 76                 return;  
 77             }  
 78             p=p->next;  
 79         }  
 80     }  
 81     void display(plist pl)  
 82     {  
 83         plist s,p;  
 84         s=p=pl;  
 85         printf("%5d", p->data); /* print first item */  
 86         p=p->next;  
 87         while(s != p)  
 88         {  
 89             printf("%5d", p->data);  
 90             p=p->next;  
 91         }  
 92         printf("/n/n");  
 93     }  
 94     void main()  
 95     {  
 96         int f;  
 97         plist pl;  
 98         pl=init_list();  
 99         insert_item(pl, 1, 1);  
100         insert_item(pl, 2, 3);  
101         insert_item(pl, 3, 5);  
102         insert_item(pl, 4, 7);  
103         insert_item(pl, 5, 9);  
104         display(pl);  
105         printf("Finding 3.../n");  
106         f=find_item(pl, 3);  
107         if(f)  
108             printf("True find 3/n");  
109         else  
110             printf("False find 3.../n");  
111         printf("/nDeleting 1.../n");  
112         delete_item(pl->next, 1);  
113         display(pl->next);   
114     }  

运行结果:

 
=================================================

双向循环链表(测试通过)   

测试环境: VS 2010

  1     #include <stdio.h>  
  2     #include <malloc.h>  
  3     struct _node  
  4     {  
  5         int data;  
  6         struct _node *prior;  
  7         struct _node *next;  
  8     };  
  9     typedef struct _node node, *plist;  
 10     plist init_list()  
 11     {  
 12         plist p;  
 13         p=(plist)malloc(sizeof(node));  
 14         if(!p)  
 15         {  
 16             printf("Error, malloc fail.../n");  
 17             return NULL;  
 18         }  
 19         p->data=-1;   /* head->data = -1 */  
 20         p->prior=p;  
 21         p->next=p;  
 22         return p;  
 23     }  
 24     void insert_item(plist pl, int pos, int data)  
 25     {  
 26         int j=0;  
 27         plist s,p;  
 28         p=pl;  
 29         while(p && j<pos-1)  
 30         {  
 31             p=p->next;  
 32             j++;  
 33         }  
 34         if(!p || j>pos-1) /* pos is less than 1 or pos larger than len_list+1 */  
 35         {  
 36             printf("Error %d is invalide num.../n", pos);  
 37             return;  
 38         }  
 39         s=(plist)malloc(sizeof(node));  
 40         if(!s)  
 41         {  
 42             printf("Error, malloc fail.../n");  
 43             return NULL;  
 44         }  
 45         s->data=data;  
 46         s->prior=p;  
 47         s->next=p->next;  
 48         p->next->prior=s;  
 49         p->next=s;  
 50     }  
 51     int find_item(plist pl, int data)  
 52     {  
 53         plist s,p;  
 54         s=p=pl;  
 55         if(data == p->data)  
 56             return 1;  
 57         p=p->next;  
 58         while(s != p)  
 59         {  
 60             if(data == p->data)  
 61                 return 1;  
 62             p=p->next;  
 63         }  
 64         return 0;  
 65     }  
 66     void delete_item(plist pl, int data)  
 67     {  
 68         plist s,p;  
 69         s=p=pl;  
 70         if(data == p->data) /* first check equal */  
 71         {  
 72             p->prior->next=p->next;  
 73             p->next->prior=p->prior;  
 74             return;  
 75         }  
 76         while(s != p->next)  
 77         {  
 78             if(data == p->next->data)  
 79             {  
 80                 p->next=p->next->next;  
 81                 p->next->next->prior=p;  
 82             }  
 83             p=p->next;  
 84         }  
 85     }  
 86     void display(plist pl)  
 87     {  
 88         plist s,p;  
 89         s=p=pl;  
 90         printf("%5d", p->data);  /* first item, such as head->data is -1 */  
 91         p=p->next;  
 92         while(s != p)  
 93         {  
 94             printf("%5d", p->data);  
 95             p=p->next;  
 96         }  
 97         printf("/n/n");  
 98     }  
 99     void main()  
100     {  
101         int f;  
102         plist pl;  
103         pl=init_list();  
104         insert_item(pl, 1, 1);  
105         insert_item(pl, 2, 3);  
106         insert_item(pl, 3, 5);  
107         insert_item(pl, 4, 7);  
108         insert_item(pl, 5, 9);  
109         display(pl);  
110         printf("Finding 3.../n");  
111         f=find_item(pl->next->next, 3);  
112         if(f)  
113             printf("True find 3/n");  
114         else  
115             printf("Fail find 3.../n");  
116         printf("Finding 6.../n");  
117         f=find_item(pl->prior->prior, 6);  
118         if(f)  
119             printf("True find 6/n");  
120         else  
121             printf("Fail find 6.../n");  
122         printf("/nDeleting 3.../n");  
123         delete_item(pl->next->next, 3);  
124         display(pl);  
125     }  
运行结果:

以上仅供参考,大家可以根据具体的需要修改相应的代码,达到所需的要求。

本文转自:~~~

原文地址:https://www.cnblogs.com/labi/p/3586074.html