1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
|
/*
单链表的操作C语言实现
Slyar 2009.3.23
http://www.slyar.com
*/
#include <stdio.h>
#include <stdlib.h>
/* 给 char 类型定义别名 datatype */
typedef char datatype;
/* 定义链表节点类型 */
typedef struct node
{
datatype data;
struct node *next;
}linklist;
/* 函数声明部分 */
linklist* CreatList();
linklist* Get(linklist*, int);
linklist* Locate(linklist*, datatype);
void PrintList(linklist*);
void InsertAfter(linklist*, datatype);
void InsertBefore(linklist*, int, datatype);
void DeleteAfter(linklist*);
void Deleter(linklist*, int);
void FreeList(linklist*);
int main()
{
int pos;
datatype value;
/* 测试创建链表函数 */
printf("请输入一串字符,以 $ 结束/n");
linklist *head, *p;
head = CreatList();
/* 测试打印链表函数 */
printf("/n打印链表/n");
PrintList(head);
/* 测试按序号查找函数 */
printf("/n请输入要查找的节点序号:/n");
scanf("%d", &pos);
getchar();
p = Get(head, pos);
if(p != NULL)
{
printf("%c/n", p -> data);
}
else
{
printf("Can't Get This Key!/n");
}
/* 测试按值查找函数 */
printf("/n请输入要查找的值:/n");
scanf("%c", &value);
p = Locate(head, value);
if(p != NULL)
{
printf("%c/n", p -> data);
}
else
{
printf("Can't Get This Key!/n");
}
/* 测试插入节点函数 */
printf("/n你想在第几个节点前插入?/n");
scanf("%d", &pos);
getchar();
printf("请输入要插入的值/n");
scanf("%c", &value);
InsertBefore(head, pos, value);
PrintList(head);
/* 测试删除节点函数 */
printf("/n你想删除第几个节点?/n");
scanf("%d", &pos);
Deleter(head, pos);
PrintList(head);
/* 销毁链表 */
FreeList(head);
//system("pause");
return 0;
}
/* 带头结点后插法创建链表函数 */
linklist* CreatList()
{
datatype key;
/* head 为头指针, s 为新节点, r 为尾指针 */
linklist *head, *s, *r;
head = (linklist*) malloc(sizeof(linklist));
r = head;
key = getchar();
/* 遇到 $ 就停止创建 */
while(key != '$')
{
s = (linklist*) malloc(sizeof(linklist));
s -> data = key;
/* 新节点插入表尾 */
r -> next = s;
/* 尾指针指向新的表尾 */
r = s;
key = getchar();
}
r -> next = NULL;
/* 返回头指针 */
return head;
}
/* 打印链表函数 */
void PrintList(linklist* head)
{
linklist *p;
p = head -> next;
while(p != NULL)
{
printf("%c", p -> data);
p = p -> next;
}
printf("/n");
}
/* 查找链表中第 i 个节点 */
linklist* Get(linklist* head, int i)
{
/* j 为扫描计数器 */
int j = 0;
linklist *p;
/* p 指向头节点 */
p = head;
/* 到达表尾或序号不合法就退出循环 */
while((p -> next != NULL) && (j < i))
{
p = p -> next;
j++;
}
if (i == j)
{
return p;
}
else
{
return NULL;
}
}
/* 在链表中查找值 key 并返回所在节点 */
linklist* Locate(linklist* head, datatype key)
{
linklist *p;
/* p 指向开始结点 */
p = head -> next;
while(p != NULL)
{
if(p -> data != key)
{
p = p -> next;
}
else
{
break;
}
}
return p;
}
/* 在节点 p 后插入 key */
void InsertAfter(linklist* p, datatype key)
{
linklist *s;
s = (linklist*) malloc(sizeof(linklist));
s -> data = key;
/* 先将 s 指向后一个节点,再将前一个节点指向 s */
s -> next = p -> next;
p -> next = s;
}
/* 将 key 插入链表第 i 个节点之前 */
void InsertBefore(linklist* head, int i, datatype key)
{
linklist *p;
int j = i - 1;
/* 找到第 i-1 个节点 p */
p = Get(head, j);
if (p == NULL)
{
printf("Insert Error!/n");
}
else
{
/* 将 key 插入节点 p 之后 */
InsertAfter(p, key);
}
}
/* 删除 p 节点的后继节点 */
void DeleteAfter(linklist* p)
{
linklist *r;
/* r 指向要删除的节点 */
r = p -> next;
/* 将 p 直接与 r 下一个节点链接 */
p -> next = r -> next;
/* 释放节点 r */
free(r);
}
/* 删除链表的第 i 个节点 */
void Deleter(linklist* head, int i)
{
linklist *p;
int j = i - 1;
/* 找到第 i-1 个节点 p */
p = Get(head, j);
if ((p != NULL) && (p -> next != NULL))
{
/* 删除 p 的后继节点 */
DeleteAfter(p);
}
else
{
printf("Delete Error!/n");
}
}
/* 递归释放单链表 */
void FreeList(linklist* p)
{
if (p -> next != NULL)
{
FreeList(p -> next);
}
free(p);
}
|
相关推荐
单链表(数据结构C语言版) 链表的创建,插入,删除,排序等操作并建立有菜单,可以选择操作
这是我在学习完单链表后,整理的链表操作函数,分享出来,希望大家共同学习。
2的n次方 单链表操作 求2的任何一个整数的n次方,
对单链表操作 #include #include struct LNode { int data; struct LNode *next; }; struct LNode *create(int n) { int i; struct LNode *head,*p1,*p2; head=(struct LNode*)malloc(sizeof(struct LNode)); ...
数据结构-单链表。 根据数据结构书上提供的算法,自己实践将单链表的插入,查找,删除等操作编写成系统。可以输入进行相关操作。
1 运行时输入数据,创建一个单链表 2 可在单链表的任意位置插入新结点 3 可删除单链表的任意一个结点 4 在单链表中查找所有值等于x的结点 5 输出单链表
平时数据结构的实验作业,用c语言编写的单链表的基本操作,初始化,清空,查找,删除,添加等。。用c-free或vc6.0通过。
单链表(数据结构C语言版实验)实现插入、删除、清空打印等操作
数据结构中单链表的结构和基本操作,包括链表的初始化,销毁,插入,删除,置空,求前驱和后继,打印链表等操作。
单链表类C语言源代码, 支持表尾插入等基本的操作
单链表操作 [基本要求] (1)建立带表头结点的单链表; (2)输出单链表中所有结点的数据域值; (3)输入x,y在第一个数据域值为x的结点之后插入结点y,若无结点x,则在表尾插入结点y; (4)输入k,删除单链表中所有...
VS2008运行环境 c语言实现单链表增删改查操作 并输出到控制台上
C语言 数据结构里面的,循环单链表的简单操作
单链表的接本操作,有在单链表中插入,删除数据的功能,以及两个单链表的合并,多项式的表达。1.单链表的数据结构的建立实现。 2.单链表元素结点插入操作实现。 3.单链表元素结点删除操作实现。 4.实现单链表的...
数据结构 单链表的生成算法 c语言实现
这是用C语言写的单链表操作的小程序,包括单链表的增、删、改、查等操作,有兴趣的朋友可以下载下来看下
C语言实现单链表(常规操作) LinkList CreateHeadListH(); // 头插法创建单链表 LinkList CreateHeadListT(); // 尾插法创建单链表 int ListEmpty(); // 单链表判空 int ListLength(); // 求单链表长度...
数据结构C语言版,单链表操作的菜单式实验,包括单链表的初始化、创建、求表长、插入删除元素、销毁和清空单链表等操作,具体操作根据屏幕提示进行。
c语言数据结构的, 学数据结构一定会用到的 。
C语言实现单链表的所有基本操作,500行左右,键盘输入