C语言程序设计

  1. 设计内容

建立一个动态链表,链表中每一结点包括:学号、姓名、性别、年龄、成绩。程序能实现以下功能:

  • 建立链表
  • 显示链表
  • 查找链表中是否存在某个元素,并显示这个元素的所有信息,若没有这个元素则显示"无此记录!"的信息。
  • 删除链表中指定学号的结点。
  • 在链表中指定的位置插入一个新结点(学号不能和其他结点重复)。

    2.  具体代码

  1 #include<stdio.h>
  2 
  3 #include<stdlib.h>
  4 
  5 #include<malloc.h>
  6 
  7 #include<string.h>/*头文件*/
  8 
  9  
 10 
 11  
 12 
 13 struct Node
 14 
 15 {
 16 
 17     char name[20];
 18 
 19     long id;
 20 
 21     char gender[10];
 22 
 23     int age;
 24 
 25     int score;
 26 
 27     struct Node *next;
 28 
 29 };/*创建结构体*/
 30 
 31  
 32 
 33  
 34 
 35 typedef struct Node ListNode;/*声明*/
 36 
 37 ListNode *build(int n) /*创建链表*/
 38 
 39 {
 40 
 41     ListNode *head;
 42 
 43     ListNode *p,*pre;
 44 
 45     int i;
 46 
 47     head=(ListNode *)malloc(sizeof(ListNode));/*为头节点分配内存空间*/
 48 
 49     head->next=NULL;
 50 
 51     pre=head;
 52 
 53     for(i=1;i<=n;i++)/*通过for循环不断加入新的结点*/
 54 
 55     {
 56 
 57         printf("请输入第 %d 个学生的信息:\n",i);
 58 
 59         p=(ListNode *)malloc(sizeof(ListNode));
 60 
 61         printf("请输入姓名:\n");/*输入数据*/
 62 
 63         scanf("%s",&p->name);
 64 
 65         printf("请输入学号:\n");
 66 
 67         scanf("%ld",&p->id);
 68 
 69         printf("请输入性别:\n");
 70 
 71         scanf("%s",&p->gender);
 72 
 73         printf("请输入年龄:\n");
 74 
 75         scanf("%d",&p->age);
 76 
 77         printf("请输入分数:\n");
 78 
 79         scanf("%d",&p->score);
 80 
 81         pre->next=p;
 82 
 83         pre=p;
 84 
 85     }
 86 
 87     p->next=NULL;
 88 
 89     return head;/*返回这个链表的首地址*/
 90 
 91 }
 92 
 93  
 94 
 95 void output(ListNode *h) /*输出链表*/
 96 
 97 {
 98 
 99     ListNode *p;
100 
101     if(h==NULL)
102 
103         printf("无数据\n");
104 
105     else
106 
107     {
108 
109         p=h->next;
110 
111         while(p)
112 
113         {
114 
115             printf("%s,%ld,%s,%d,%d",p->name,p->id,p->gender,p->age,p->score);
116 
117             p=p->next;
118 
119             printf("\n");
120 
121         }
122 
123     }
124 
125 }
126 
127  
128 
129 void Insert(ListNode *h,int n) /*插入链表结点*/
130 
131 {
132 
133     ListNode *q,*p;
134 
135     int j,i;
136 
137     printf("插入数据的位置:\n");
138 
139     scanf("%d",&i);
140 
141     if(i<1 || i>n+1)
142 
143         printf("错误,请重新输入.\n");
144 
145     else
146 
147     {
148 
149         j=0;
150 
151         p=h;
152 
153         while(j<i-1)
154 
155         {
156 
157             p=p->next;
158 
159             j++;
160 
161         }
162 
163         q=(ListNode *)malloc(sizeof(ListNode));/*为要插入的结点分配内存空间*/
164 
165         printf("请输入姓名:\n");/*赋值操作*/
166 
167         scanf("%s",&q->name);
168 
169         printf("请输入学号:\n");
170 
171         scanf("%ld",&q->id);
172 
173         printf("请输入性别:\n");
174 
175         scanf("%s",&q->gender);
176 
177         printf("请输入年龄:\n");
178 
179         scanf("%d",&q->age);
180 
181         printf("请输入分数:\n");
182 
183         scanf("%d",&q->score);
184 
185         q->next = p->next; /*调整指针域*/
186 
187         p->next=q;
188 
189     }
190 
191 }
192 
193  
194 
195 void deletes(ListNode *h,int n) /*函数功能:删除链表结点*/
196 
197 {
198 
199     ListNode *p,*q;
200 
201     int j,i;
202 
203     printf("请输入要删除的数据的位置:");
204 
205     scanf("%d",&i);
206 
207     if(i<1 || i>n)/*如果位置超出了1和n的范围的话则打印出错误信息*/
208 
209         printf("错误,请重新输入.\n");
210 
211     else
212 
213     {
214 
215         j=0;
216 
217         p=h;
218 
219         while(j<i-1)
220 
221         {
222 
223             p=p->next;
224 
225             j++;
226 
227         }
228 
229         q=p->next;
230 
231         p->next=q->next;
232 
233         free(q);//释放q指向的结点
234 
235         printf("第%d个数据已删除:\n",i);
236 
237     }
238 
239 }
240 
241  
242 
243 find(ListNode *h)/*按序号查找链表*/
244 
245 {
246 
247     int ii,ij;
248 
249     printf("请输入要查询的序号:\n");
250 
251     scanf("%d",&ii);
252 
253     ListNode *p;
254 
255     p=h->next;
256 
257     if(p==NULL)
258 
259         printf("未找到\n");
260 
261     else
262 
263         ij=1;
264 
265     while(p!=NULL&&ij<ii)
266 
267     {
268 
269         p=p->next;
270 
271         ij++;
272 
273     }
274 
275     if(ii==ij)
276 
277         output(p);
278 
279     else
280 
281         printf("未找到:\n");
282 
283 }
284 
285  
286 
287  
288 
289 void txtleletters() /*主标题*/
290 
291 {
292 
293     printf("1.建立 \n");
294 
295     printf("2.显示 \n");
296 
297     printf("3.查找 \n");
298 
299     printf("4.插入 \n");
300 
301     printf("5.删除 \n");
302 
303     printf("6.退出 \n");
304 
305     printf("请输入要选择功能的序号:");
306 
307 }
308 
309  
310 
311  
312 
313  
314 
315 void main() /*主函数*/
316 
317 {
318 
319     ListNode *h;
320 
321     ListNode *f;
322 
323     h=NULL;
324 
325     int i, n;
326 
327     txtleletters();
328 
329     while (1)
330 
331     {
332 
333         printf("\n");
334 
335         scanf("%d",&i);
336 
337         switch(i)
338 
339         {
340 
341         case 1:
342 
343             printf("请输入创建链表节点的个数:\n"); /*输入创建链表结点的个数*/
344 
345             scanf("%d",&n);
346 
347             h=build(n);
348 
349             printf("现有成员的信息:\n");
350 
351             output(h);
352 
353             txtleletters();
354 
355             break;
356 
357         case 2:
358 
359             printf("现有成员信息: \n");
360 
361             output(h);
362 
363             txtleletters();
364 
365             break;
366 
367         case 3:
368 
369 find(h);
370 
371             txtleletters();
372 
373             break;
374 
375         case 4:
376 
377             Insert(h,n);
378 
379             printf("现有成员信息:\n");
380 
381             output(h);
382 
383             txtleletters();    
384 
385             break;
386 
387         case 5:
388 
389             deletes(h,n);
390 
391             printf("现有成员信息: \n");
392 
393             output(h);
394 
395             txtleletters();
396 
397             break;
398 
399         case 6:
400 
401             return;
402 
403             break;
404 
405         default:
406 
407             printf("错误的选项,请重新选择:\n");
408 
409         }
410 
411     }
412 
413 }
原文地址:https://www.cnblogs.com/shandianlongxiao/p/4025088.html