C语言 单向 动态链表的增 删 改 查操作, 非常易懂!

2021-05-11 14:30

阅读:422

标签:typedef   union   小白   用户   代码   create   png   loading   tde   

  很基础 我也是小白如果可以提供到一些帮助 请往下看,有问题可以指出!!

 

下面是运行效果图:

技术图片

 

 

 

 

 如果有问题可以指出,留言:

 

 

下面是代码 也没啥好讲的: 注意结构体的指针调用问题就好了 ,分清楚指针和指向指针的指针就好了

  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语言 单向 动态链表的增 删 改 查操作, 非常易懂!

标签:typedef   union   小白   用户   代码   create   png   loading   tde   

原文地址:https://www.cnblogs.com/zonzi/p/13151625.html


评论


亲,登录后才可以留言!