单链表的链式结构表示

from:shiyanlou

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3
  4 #define TRUE 1
  5 #define FALSE 0
  6 #define OK 1
  7 #define ERROR 0
  8 #define OVERFLOW -2
  9
 10 typedef int ElemType;
 11 typedef int Status;
 12
 13 /*
 14  * 存储结构
 15  */
 16 typedef struct LNode
 17 {
 18     ElemType data;
 19     struct LNode *next;
 20 }LNode, *LinkList;
 21
 22 /*
 23  * 初始化线性表
 24  */
 25 void InitList(LinkList *L)
 26 {
 27     *L = (LinkList) malloc(sizeof(LNode));
 28     if (!L)
 29     {
 30         exit(OVERFLOW);
 31     }
 32     (*L)->next = NULL;
 33 }
 34
 35 /*
 36  * 销毁线性表
 37  */
 38 void DestroyList(LinkList *L)
 39 {
 40     LinkList temp;
 41     while (*L)
 42     {
 43         temp = (*L)->next;
 44         free(*L);
 45         *L = temp;
 46     }
 47 }
 48
 49 /*
 50  * 清空线性表
 51  */
 52 void ClearList(LinkList L)
 53 {
 54     LinkList p = L->next;
 55     L->next = NULL;
 56     DestroyList(&p);
 57 }
 58
 59 /*
 60  * 判断是否为空
 61  */
 62 Status isEmpty(LinkList L)
 63 {
 64     if (L->next)
 65     {
 66         return FALSE;
 67     }
 68     else
 69     {
 70         return TRUE;
 71     }
 72 }
 73
 74 /*
 75  * 获取长度
 76  */
 77 int GetLength(LinkList L)
 78 {
 79     int i = 0;
 80     LinkList p = L->next;
 81     while (p)
 82     {
 83         i++;
 84         p = p->next;
 85     }
 86     return i;
 87 }
 88
 89 /*
 90  * 根据位置获取元素
 91  */
 92 Status GetElem(LinkList L, int i, ElemType *e)
 93 {
 94     int j = 1;
 95     LinkList p = L->next;
 96     while (p && j < i)
 97     {
 98         j++;
 99         p = p->next;
100     }
101     if (!p || j > i)
102     {
103         return ERROR;
104     }
105     *e = p->data;
106     return OK;
107 }
108
109 /*
110  * 比较两个元素是否相等
111  */
112 Status compare(ElemType e1, ElemType e2)
113 {
114     if (e1 == e2)
115     {
116         return 0;
117     }
118     else if (e1 < e2)
119     {
120         return -1;
121     }
122     else
123     {
124         return 1;
125     }
126 }
127
128 /*
129  * 查找指定元素的位置
130  */
131 int FindElem(LinkList L, ElemType e, Status (*compare)(ElemType, ElemType))
132 {
133     int i = 0;
134     LinkList p = L->next;
135     while (p)
136     {
137         i++;
138         if (!compare(p->data, e))
139         {
140             return i;
141         }
142         p = p->next;
143     }
144     return 0;
145 }
146
147 /*
148  * 获取前驱元素
149  */
150 Status PreElem(LinkList L, ElemType cur_e, ElemType *pre_e)
151 {
152     LinkList q, p = L->next;
153     while (p->next)
154     {
155         q = p->next;
156         if (q->data == cur_e)
157         {
158             *pre_e = p->data;
159             return OK;
160         }
161         p = q;
162     }
163     return ERROR;
164 }
165
166 /*
167  * 获取后继元素
168  */
169 Status NextElem(LinkList L, ElemType cur_e, ElemType *next_e)
170 {
171     LinkList p = L->next;
172     while (p->next)
173     {
174         if (p->data == cur_e)
175         {
176             *next_e = p->next->data;
177             return OK;
178         }
179         p = p->next;
180     }
181     return ERROR;
182 }
183
184 /*
185  * 插入元素
186  */
187 Status InsertElem(LinkList L, int i, ElemType e)
188 {
189     int j = 0;
190     LinkList s, p = L;
191     while (p && j < i - 1)
192     {
193         j++;
194         p = p->next;
195     }
196     if (!p || j > i - 1)
197     {
198         return ERROR;
199     }
200     s = (LinkList) malloc(sizeof(LNode));
201     s->data = e;
202     s->next = p->next;
203     p->next = s;
204     return OK;
205 }
206
207 /*
208  * 删除元素并返回值
209  */
210 Status DeleteElem(LinkList L, int i, ElemType *e)
211 {
212     int j = 0;
213     LinkList q, p = L;
214     while (p->next && j < i - 1)
215     {
216         j++;
217         p = p->next;
218     }
219     if (!p->next || j > i - 1)
220     {
221         return ERROR;
222     }
223     q = p->next;
224     p->next = q->next;
225     *e = q->data;
226     free(q);
227     return OK;
228 }
229
230 /*
231  * 访问元素
232  */
233 void visit(ElemType e)
234 {
235     printf("%d ", e);
236 }
237
238 /*
239  * 遍历线性表
240  */
241 void TraverseList(LinkList L, void (*visit)(ElemType))
242 {
243     LinkList p = L->next;
244     while (p)
245     {
246         visit(p->data);
247         p = p->next;
248     }
249 }
250
251 int main()
252 {
253     LinkList L;
254     InitList(&L);
255     ElemType e;
256     int i;
257     if (L)
258     {
259         printf("init success\n");
260     }
261
262     if (isEmpty(L))
263     {
264         printf("list is empty\n");
265     }
266
267     for (i = 0; i < 10; i++)
268     {
269         InsertElem(L, i + 1, i);
270     }
271
272     if (GetElem(L, 1, &e)) {
273         printf("The first element is %d\n", e);
274     }
275
276     printf("length is %d\n", GetLength(L));
277
278     printf("The 5 at %d\n", FindElem(L, 5, *compare));
279
280     PreElem(L, 6, &e);
281     printf("The 6‘s previous element is %d\n", e);
282
283     NextElem(L, 6, &e);
284     printf("The 6‘s next element is %d\n", e);
285
286     DeleteElem(L, 1, &e);
287     printf("delete first element is %d\n", e);
288
289     printf("list:");
290     TraverseList(L,visit);
291
292     DestroyList(&L);
293     if (!L) {
294         printf("\ndestroy success\n");
295     }
296 }
时间: 2024-08-16 17:06:51

单链表的链式结构表示的相关文章

单链表的链式存储总结

基本数据结构之-单链表的链式存储 链表是一种插和删除元素很便捷的数据结构,原因是它存储的数据在内存中不连续,可以根据需要自己动态开辟. 和数组比较起来主要的缺点就是不能随机访问,如果是单链表,那么要访问一个数据,必须从头开始遍历一次! 对于基本数据结构围绕增删查改等操作,单链表的改可以通过删和增的结合来操作.因此就不用代码来表示了! 任何一个数据结构都有它的基本的数据结构,这儿给出一种用void *代替的写法 基本的数据结构的定义: // 定义指针的结构体 typedef struct _LIN

线性表带头结点的单链表的链式表示和实现

带有头结点的单链表的12个基本操作 #define DestroyList ClearList//DestroyList()和ClearList()的操作是一样的 void InitList(LinkList &L){ L = NULL; } void ClearList(LinkList &L){ LinkList p; while (L){ p = L; L = L->next; free(p); } } Status ListEmpty(LinkList L){ if (L)r

单链表的链式存储的两种插入方式

/* 头插法建立单链表示例 */ void CreateListHead(LinkList *L, int n){ LinkList p; int i; srand(time(0)); // 初始化随机数种子 *L = (LinkList)malloc(sizeof(Node)); (*L)->next = NULL; for( i=0; i < n; i++ ) { p = (LinkList)malloc(sizeof(Node)); // 生成新结点 p->data = rand(

数据结构----线性表顺序和链式结构的使用(c)

PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写好了,java还有三个特性,封装.继承.多态.当然这里不是讲Java,这里主要是说内部结构,大家都知道数据结构有些东西是分为逻辑结构和物理结构的,物理结构有分为顺序结构和链式结构,有不懂得可以百度百科,这里主要是分享线性表的顺序结构.那么什么是线性表呢,线性表是最基本.最简单.也是最常用的一种数据结

栈的链式结构表示与实现——自己写数据结构

今天给大家介绍栈的链式结构,用dev-c++4.9.9.2调试通过,少废话直接上代码: 数据结构体存放文件stacklist.h文件如下 #ifndef _STACKLIST_H_ #define _STACKLIST_H_ typedef struct _Node { int data; struct _Node *pre; struct _Node *next; }Node,*pNode; typedef struct _Stack_Header { struct _Node *botton

链式结构实现堆排序

在很多数据结构和算法的书上,"堆排序"的实现都是建立在数组上,数组能够通过下标访问其元素,其这一特性在堆排序的实现上,使得其编码实现比链式结构简单,下面我利用链表实现堆排序. 在"堆"这种数据结构中,分为"大根堆"和"小根堆","大根堆"中其每一个双亲节点大于等于其子女节点,"小根堆"的定义与其相 反, 当然实现最大堆之前必须要建一个堆,一个高度为h的堆,它的前h-1层时满的,如下图所示

不要打断链式结构:使用 RxJava的 compose() 操作符

不要打断链式结构:使用 RxJava的 compose() 操作符

文件上传以及JS链式结构

文件上传: 文件上传使用FileUpload控件,使用控件的SaveAs方法,需要绝对路径. 获取文件的绝对路径:Server.MapPath(相对路径); 或许要上传文件的本身名字用.FileName获取. 因为名字相同的文件将会被直接覆盖,所以一般文件名字要拼接上传时间和用户名保证不重名. 上传文件默认最大为4MB,在C#端限制文件大小有缺陷,一般用JS端限制. 获取要上传的文件通过ID获取FileUpload控件然后通过value值获取文件然后通过.length属性确定是否有文件要上传,然

01-用链式结构打印学生成绩单

用链式结构打印学生成绩单 #include <iostream> using namespace std; struct StScore { std::string id; int math; int english; int computer; struct StScore* next; }; int main() { StScore first; first.id = "C"; first.math = 80; first.english = 85; first.com