C语言 单向 动态链表的增 删 改 查操作, 非常易懂!
2021-05-11 14:30
标签:typedef union 小白 用户 代码 create png loading tde 很基础 我也是小白如果可以提供到一些帮助 请往下看,有问题可以指出!! 下面是运行效果图: 如果有问题可以指出,留言: 下面是代码 也没啥好讲的: 注意结构体的指针调用问题就好了 ,分清楚指针和指向指针的指针就好了 C语言 单向 动态链表的增 删 改 查操作, 非常易懂! 标签:typedef union 小白 用户 代码 create png loading tde 原文地址:https://www.cnblogs.com/zonzi/p/13151625.html 1 //全局结构体 struct
2 typedef struct Stu {
3 union {
4 int num;
5 char name[10];
6 }Stu;
7 int num;
8 int age;
9 char name[10];
10 struct Stu* Next;
11 }Stus;
12
13 //定义个人用户方法操作
14 typedef struct _list {
15 Stus* head;
16 }List;
17 //清除整个链表
18 static void throughtdel(Stus* p);
19 static void select(Stus* p);//显示
20 static void searchs(Stus* p);//搜索
21 #define Len sizeof(Stus)
22 //动态链表*单向
23 static int LS = 0;
24 //建立链表结构 33 static void createtable(List *plist) {
34 printf("建立链表 请输入:索引 姓名 (输入0结束))\n");
35 Stus* a, * b;
36 plist->head = NULL;
37 a = b = malloc(Len);
38 //赋值
39 scanf("%d %s", &a->num, &a->name);
40 while (a->num!=0)
41 {
42 LS++;
43 if (LS == 1)plist->head= a;
44 else b->Next = a;
45 b = a;
46 a = malloc(Len);
47 //赋值
48 //printf("请输入:编号 姓名(输入0结束))\n");
49 scanf("%d %s", &a->num, &a->name);
50 if (a->num == 0)break;
51 }
52 b->Next = NULL;
79 }
80 //删除 某节点
81 static void dynamictable(List * list) {
82 Stus*q,*p;
83 /*List list;
84 list.head =head;*/
85 int number;
86 printf("删除操作(输入索引):\n");
87 scanf("%d", &number);
88 for (q=NULL, p= list->head;p ;q=p, p=p->Next)
89 {
90 if (p->num==number)
91 {
92 printf("删除后\n");
93 //删除
94 if (q) { //首位的是时候 q指向的
95 q->Next = p->Next;
96 free(p);
97 select(list->head);
98 break;
99 }
100 else { //如果首位怎么办?
101 list->head = p->Next;
102 free(p);
103 select(list->head);
104 break;
105 }
106 }
107 }
108 }
109 //删除方法二
110 static void del(List* list) {
111 Stus* q=list->head,*d=NULL;
112 if (q==NULL)
113 {
114 printf("nlist null!");
115 return;
116 }
117 else {
118 int c = NULL;
119 printf("请输入删除数下标:");
120 scanf("%d", &c);
121 while (q->num!=c&&q->Next!=NULL)
122 {
123 d = q;
124 q = q->Next;
125 }
126 if (q->num==c)
127 {
128 if (q==list->head)//首位
129 {
130 list->head = q->Next; //首位改变
131 return;
132 }
133 else {
134 d->Next = q->Next;
135 free(q);
136 return;
137 }
138 }
139 else {
140 printf("没有找到要删除的元素");
141 }
142
143 }
144
145 }
146 //显示全部节点
147 static void select(Stus* p) {
148 printf("---------------------------查询结果-----------------------------------\n");
149 for (; p; p = p->Next)
150 {
151 printf("%d %s\n", p->num, p->name);
152 }
153 printf("---------------------------------------------------------------------\n");
154 return;
155 }
156 //搜索
157 static void searchs(Stus *p) {
158 int s = 1,number=NULL;
159 printf("请输入搜索的索引:"); scanf("%d", &number);
160 for (; p; p = p->Next)
161 {
162 if(number==p->num){
163 s = 0;
164 printf("已找到: %d %s \n\n", p->num, p->name);
165 //break;
166 }
167 }
168 if (s)printf("没有找到!");
169 return;
170 }
171 //清除整个链表
172 static void throughtdel (Stus* p) {
173 Stus* q;
174 for (q=NULL;p;p=q)
175 {
176 q = p->Next;
177 free(p);
178 }
179 }
180 //对链表进行排序 降序(0) 或者 升序(1)
181 static void swap(int *a,int *b) {
182 int m = *a;
183 *a = *b;
184 *b = m;
185 }
186 //排序
187 static void order(List* list) {
188 int g = 0; printf("降序(0)?升序(1) 请输入:");
189 scanf("%d", &g);
190 Stus* q, * p, * c; //冒泡排序
191 c = q = p = NULL;
192 if (list->head->Next== NULL || list == NULL)
193 {
194 return;
195 }
196 for (q = list->head; q != NULL; q = q->Next)
197 {
198 for (p = list->head; p->Next!= NULL; p = p->Next)
199 {
200 if(g){
201 if (p->num > p->Next->num) //q q+1
202 {
203 swap(&p->Next->num, &p->num);
204 swap(&p->Next->name, &p->name);
205 }
206 }else{
207 if (p->num Next->num) //q q+1
208 {
209 swap(&p->Next->num, &p->num);
210 swap(&p->Next->name, &p->name);
211 }
212 }
213
214 }
215 }
216 select(list->head);
217 return;
218 }
219 //求最大 域值的位置
220 static void maxdj(Stus *arr,Stus**s) {
221 //返回s
222 Stus* p;
223 p = arr->Next;
224 *s = arr;//首位比较
225 while (p->Next!=NULL)
226 {
227 p = p->Next;
228 if ((*p).num > (*s)->num)*s = p;
229 }
230 return;
231 }
232 //插入 链表中 添加
233 static void adds(Stus **arr) {
234 Stus* stat = (Stus*)malloc(Len);
235 printf("添加请输入:索引 姓名\n");
236 scanf("%d %s", &stat->num, &stat->name);
237 getchar();
238 //添加到首位
239 stat->Next = *arr;
240 (*arr) = stat;
241 return;
242 }
243 //修改
244 static void update(Stus** arr) {
245 int*ins = (int*)malloc(sizeof(int)),c=1;
246 char*dc= (char*)malloc(sizeof(char));
247 Stus *p=*arr;
248 printf("请输入要修改的序号:");
249 scanf("%d", ins);
250 while (p!=NULL)
251 {
252 if ((*arr)->num==*ins)
253 {
254 c = 0;
255 printf("请输入要修改的值:");
256 scanf("%s", dc);
257 strcpy(p->name, dc);
258 break;
259 }
260 p = p->Next;
261 }
262 if (c)printf("没有找到您要修改的 数据!\n");
263 else printf("完毕! 输入1查询;\n");
264 free(ins);
265
266 return;
267 }
268 //全局操作 //说明 :List 的head本身就是指针 所以操作只可以用 Stu** 来操作
269 static void operation() {
270 static void maxdj(Stus * arr, Stus **s);//求最大 域值的位置
271 static void select(Stus * p);//显示链表
272 static void dynamictable(List*list);//删除某节点
273 static void searchs(Stus * p); //搜索
274 static void order(Stus * list);
275 static void del(List * list);//删除2
276 //降序后插入 链表中
277 static void adds(Stus * *arr);
278 //修改
279 static void update(Stus * *arr);
280 Stus *s;
281 int ops = 0,*oop=&ops;
282 List list; //链表头声明
283 list.head = NULL; //初始化
284 createtable(&list);//赋值操作 //list就代表了整个链表 **** nb
285 printf("请输入操作: 1:查询链表 2:删除某个链表 3:搜索 4.求最大域值 5.排序排列! 6.插入 7:修改 8:删除某链表(输入0结束!)\n");
286 scanf("%d", oop);
287 while (*oop)
288 {
289 switch (*oop)
290 {
291 case 1: //查询
292 select(list.head);
293 break;
294 case 2: //删除 某节点
295 dynamictable(&list);
296 break;
297 case 3://搜索某节点
298 searchs(list.head);
299 break;
300 case 4://求最大 域值的位置
301 maxdj(list.head,&s);
302 printf("最大的域位置和值为: %d %s\n", (*s).num, (*s).name);
303 break;
304 case 5://排序 //对链表进行排序 降序(0) 或者 升序(1)
305 //对链表进行排序 降序(0) 或者 升序(1)
306 order(&list);
307 printf("完毕! 输入1查询;\n");
308 break;
309 case 6://插入节点
310 adds(&list.head);
311 printf("完毕! 输入1查询;\n");
312 break;
313 case 7://修改
314 update(&list.head);
315 break;
316 default:
317 //删除方法二
318 del(&list);
319 printf("完毕! 输入1查询;\n");
320 break;
321 }
322 printf("请输入操作: 1:查询链表 2:删除某个链表 3:搜索 4.求最大域值 5.排序排列! 6.插入 7:修改 8:删除某链表(输入0结束!)\n");
323 scanf("%d", oop);
324 }
325 printf("结束操作!\n");
326
327 }
332 //动态插入 按照输入索引位置插入 没有找到则插入到最前面
333 static td(Stus*head) {
334 Stus* p = head, * q = NULL, * cc = (Stus*)malloc(Len); int oc = 0;
335 cc->Next = NULL;
336 //插入操作
337 printf("请输入插入的数:");
338 scanf("%d %d", &cc->num, &oc);
339 cc->Next = NULL;
340
341 while (p->Next != NULL && p->num != oc)
342 {
343 q = p;
344 p = p->Next;
345 }
346 if (q == NULL)
347 {
348 printf("找到了!在首位");
349 cc->Next = p->Next;
350 p->Next = cc;
351
352 }
353 else {
354 if (p->num == oc)
355 {
356 printf("找到了!");
357 q->Next = cc;
358 cc->Next = p;
359 }
360 else {
361 printf("没有找到了!");
362 p->Next = cc;
363 cc->Next = NULL;
364 }
365 }
366
367 while (head != NULL)
368 {
369 printf("%d ", head->num);
370 head = head->Next;
371 }
372
373
374 }
文章标题:C语言 单向 动态链表的增 删 改 查操作, 非常易懂!
文章链接:http://soscw.com/index.php/essay/84310.html