数据结构——链表

头文件

  1 #ifndef _LINKLIST_H_
  2 #define _LINKLIST_H_
  3 
  4 #define SUCCESS           100
  5 #define FAILURE           101
  6 
  7 typedef int DataType;
  8 
  9 struct node
 10 {
 11     DataType data;          //数据域
 12     struct node *next;      //指针域
 13 };
 14 typedef struct node Node;
 15 typedef Node *Link;
 16 
 17 int InitLink(Link *l);
 18 int EmptyLink(Link l);
 19 int InsertLink(Link l, int p, DataType e);
 20 int LinkLength(Link l);
 21 int TraverseLink(Link l, void(*p)(DataType));
 22 int GetElem(Link l, int p, DataType *e);
 23 int LocateElem(Link l, DataType e, int(*p)(DataType, DataType));
 24 int PriorElem(Link l, DataType e, int(*p)(DataType, DataType));
 25 int NextElem(Link l, DataType e, int(*p)(DataType, DataType));
 26 int ReverseLink(Link l);
 27 int DeleteLink(Link l, int p, DataType *e);
 28 int ClearLink(Link l);
 29 int DestroyLink(Link *l);
 30 #endif


调用函数

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include "LinkList.h"
  4 
  5 /*
  6     链表初始化
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include "LinkList.h"
  4 
  5 /*
  6     链表初始化
  7 */
  8 int InitLink(Link *l)
  9 {
 10     (*l) = (Link)malloc(sizeof(Node) * 1);   //给头结点分配空间
 11     if (NULL == (*l))
 12     {
 13         return FAILURE;
 14     }
 15 
 16     (*l)->next = NULL;                       //头结点下一个元素为空
 17 
 18     return SUCCESS;
 19 }
 20 
 21 /*
 22     判断链表是否为空
 23 */
 24 int EmptyLink(Link l)
 25 {
 26     return (l->next == NULL) ? SUCCESS : FAILURE;
 27 }
 28 
 29 /*
 30     向链表插入节点
 31 */
 32 int InsertLink(Link l, int p, DataType e)
 33 {
 34     Link q = l, n;
 35     int j = 1;
 36 
 37     if (NULL == l)
 38     {
 39         return FAILURE;
 40     }
 41 
 42     while (q && j < p)            //移动指针到要插入位置的前一个位置
 43     {
 44         q = q->next;
 45         j++;
 46     }
 47 
 48     if (q == NULL || j > p)      //判断插入的位置是否合法
 49     {
 50         return FAILURE;
 51     }
 52 
 53     n = (Link)malloc(sizeof(Node) * 1);
 54     if (NULL == n)
 55     {
 56         return FAILURE;
 57     }
 58 
 59     n->data = e;
 60     n->next = q->next;
 61     q->next = n;
 62 
 63     return SUCCESS;
 64 }
 65 
 66 /*
 67     链表的长度
 68 */
 69 int LinkLength(Link l)
 70 {
 75     {
 76         q = q->next;
 77         len++;
 78     }
 79 
 80     return len - 1;
 81 }
 82 
 83 /*
 84     遍历链表
 85     参数:p是函数指针,指向Visit函数
 86 */
 87 int TraverseLink(Link l, void(*p)(DataType))
 88 {
 89     Link q = l->next;
 90 
 91     while(q)
 92     {
 93         p(q->data);
 94         q = q->next;
 95     }
 96 
 97     return SUCCESS;
 98 }
 99 
100 /*
101     获取元素
102 */
103 int GetElem(Link l, int p, DataType *e)
104 {
105     Link q = l;
106     int len = 0;
107 
108     while (q)
109     {
110         q = q->next;
111         len++;
112         if (p == len)
113         {
114             *e = q->data;
115             return SUCCESS;
116         }
117     }
118 
119     return FAILURE;
120 }
121 
122 /*
123     查找元素位置,返回元素的位置
124     参数:p是函数指针,指向Equal函数
125 */
126 int LocateElem(Link l, DataType e, int(*p)(DataType, DataType))
127 {
128     Link q = l->next;
129     int len = 1;
130 
131     while (q)
132     {
133         if (p(e, q->data))
134         {
135             return len;
136         }
137         q = q->next;
138         len++;
139     }
140 
141     return FAILURE;
142 }
143 
144 /*
145     获取元素的前驱,保存在参数e中
146 */
147 int PriorElem(Link l, DataType e, int(*p)(DataType, DataType))
148 {
149     Link q = l->next;
150 
151     if (p(e, q->data))         //第一个元素不存在前驱
152     {
153         return FAILURE;
154     }
155 
156     while (q->next)
157     {
158         if (p(q->next->data, e))
159         {
160             return q->data;
161         }
162         q = q->next;
163     }
164 
165     return FAILURE;
166 }
167 
168 /*
169     获取元素后继,保存在参数e中
170 */
171 int NextElem(Link l, DataType e, int(*p)(DataType, DataType))
172 {
173     Link q = l->next;
174 
175     while (q->next)            //最后一个元素不存在后继           
176     {
177         if (p(q->data, e))
178         {
179             return q->next->data;
180         }
181         q = q->next;
182     }
183 
184     return FAILURE;
185 }
186 
187 /*
188     链表反转
189 */
190 int ReverseLink(Link l)
191 {
192     Link q;
193 
194     if (NULL == l)
195     {
196         return FAILURE;
197     }
198 
199     Link p = l->next;
200     l->next = NULL;
201 
202     while (p)
203     {
204         q = p;
205         p = p->next;
206         q->next = l->next;
207         l->next = q;
208     }
209 
210     return SUCCESS;
211 }
212 
213 /*
214     删除链表结点,被删除元素保存在参数e中
215 */
216 int DeleteLink(Link l, int p, DataType *e)
217 {
218     Link q = l, n;
219     int j = 1;
220 
221     if (NULL == l)
222     {
223         return FAILURE;
224     }
225 
226     while (q && j < p)            //移动指针到要插入位置的前一个位置
227     {
228         q = q->next;
229         j++;
230     }
231 
232     if (q == NULL || j > p)      //判断插入的位置是否合法
233     {
234         return FAILURE;
235     }
236 
237     n = q->next;
238     q->next = n->next;
239     *e = n->data;
240     free(n);
241 
242     return SUCCESS;
243 }
244 
245 /*
246     清空链表,删除所有结点,保留头结点
247 */
248 int ClearLink(Link l)
249 {
250     Link p = l->next;
251 
252     while (p)
253     {
254         l->next = p->next;
255         free(p);
256         p = l->next;
257     }
258 
259     return SUCCESS;
260 }
261 
262 /*
263     销毁链表,即释放头结点
264 */
265 int DestroyLink(Link *l)
266 {
267     free(*l);
268     (*l) = NULL;
269 
270     return SUCCESS;
271 }
 
 

主函数

  1 #include <stdio.h>
  2 #include "LinkList.h"
  3 
  4 void visit(DataType e)
  5 {
  6     printf("%d ", e);
  7 }
  8 
  9 int Equal(DataType a, DataType b)
 10 {
 11     return (a == b) ? 1 : 0;
 12 }
 13 
 14 int main()
 15 {
 16     int ret, i, p;
 17     Link link;
 18     DataType e;
 19 
 20     ret = InitLink(&link);
 21     if (SUCCESS == ret)
 22     {
 23         printf("Init Success!\n");
 24     }
 25     else
 26     {
 27         printf("Init Failure!\n");
 28     }
 29 
 30     ret = EmptyLink(link);
 31     if (SUCCESS == ret)
 32     {
 33         printf("Link is Empty!\n");
 34     }
 35     else
 36     {
 37         printf("Link is't Empty!\n");
 38     }
 39 
 40     for (i = 0; i < 5; i++)
 41     {
 42         ret = InsertLink(link, i + 1, i + 1);
 43         if (FAILURE == ret)
 44         {
 45             printf("Insert %d Failure!\n", i + 1);
 46         }
 47         else
 48         {
 49             printf("Insert %d Success!\n", i + 1);
 50         }
 51     }
 52 
 53     ret = EmptyLink(link);
 54     if (SUCCESS == ret)
 55     {
 56         printf("Link is Empty!\n");
 57     }
 58     else
 59     {
 60         printf("Link is't Empty!\n");
 61     }
 62 
 63     printf("Length is %d!\n", LinkLength(link));
 64 
 65     ret = TraverseLink(link, visit);
 66     if (FAILURE == ret)
 67     {
 68         printf("Traverse Failure!\n");
 69     }
 70     else
 71     {
 72         printf("\nTraverse Success!\n");
 73     }
 74 
 75     p = 5;
 76     ret = GetElem(link, p, &e);
 77     if (FAILURE == ret)
 78     {
 79         printf("Get %dth Elem Failure!\n", p);
 80     }
 81     else
 82     {
 83         printf("%dth Elem is %d\n", p, e);
 84     }
 85 
 86     e = 10;
 87     ret = LocateElem(link, e, Equal);
 88     if (FAILURE == ret)
 89     {
 90         printf("Element %d is't exist!\n", e);
 91     }
 92     else
 93     {
 94         printf("%d is %dth Element!\n", e, ret);
 95     }
 96 
 97     e = 10;
 98     ret = PriorElem(link, e, Equal);
 99     if (FAILURE == ret)
100     {
101         printf("%d has no prior!\n",e);
102     }
103     else
104     {
105         printf("%d Prior is %d\n", e, ret);
106     }
107 
108     e = 15;
109     ret = NextElem(link, e, Equal);
110     if (FAILURE == ret)
111     {
112         printf("%d has no next!\n",e);
113     }
114     else
115     {
116         printf("%d Next is %d\n", e, ret);
117     }
118 
119     ret = ReverseLink(link);
120     if (SUCCESS == ret)
121     {
122         printf("Reverse Success!\n");
123     }
124 
125     ret = TraverseLink(link, visit);
126     if (FAILURE == ret)
127     {
128         printf("Traverse Failure!\n");
129     }
130     else
131     {
132         printf("\nTraverse Success!\n");
133     }
134 
135     p = 3;
136     ret = DeleteLink(link, p, &e);
137     if (SUCCESS == ret)
138     {
139         printf("Delete %dth Success!\n", p);
140     }
141     else
142     {
143         printf("Delete %dth Failure!\n", p);
144     }
145 
146     ret = TraverseLink(link, visit);
147     if (FAILURE == ret)
148     {
149         printf("Traverse Failure!\n");
150     }
151     else
152     {
153         printf("\nTraverse Success!\n");
154     }
155 
156     ret = ClearLink(link);
157     if (SUCCESS == ret)
158     {
159         printf("Clear Success!\n");
160     }
161     else
162     {
163         printf("Clear Failure!\n");
164     }
165 
166     ret = TraverseLink(link, visit);
167     if (FAILURE == ret)
168     {
169         printf("Traverse Failure!\n");
170     }
171     else
172     {
173         printf("\nTraverse Success!\n");
174     }
175 
176     ret = DestroyLink(&link);
177     if (FAILURE == ret)
178     {
179         printf("Destroy Failure!\n");
180     }
181     else
182     {
183         printf("Destroy Success!\n");
184     }
185 
186         ret = InsertLink(link, 1, 3);
187         if (FAILURE == ret)
188         {
189             printf("Insert %d Failure!\n", i + 1);
190         }
191         else
192         {
193             printf("Insert %d Success!\n", i + 1);
194         }
195 
196     return 0;
197 }


猜你喜欢

转载自blog.csdn.net/rocky_56x/article/details/79249930