头文件
#ifndef __AA__
#define __AA__
typedef struct student
{
union
{
int id;
int len;
};
char name[20];
int scroce;
struct student *next;
}student;
//创建函数
student *create(int n);
//判空函数
int pankong(student *s);
//增加函数
int add(student *s);
//删除函数
int shanchu(student *s);
//修改函数
int xiugai(student *s);
//查找函数
student *find(student *s);
//降序排列函数
int pailie(student *s);
//遍历函数
int bianli(student *s);
//插入学生信息函数
int charu(student *s);
//销毁表格函数
int xiaohui(student *s);
#endif
功能函数
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include "./2201.h"
5
6
7 //创建函数
8 student *create(int n)
9 {
10 student *s = (student *)malloc(sizeof(student));
11 if(NULL == s)
12 {
13 printf("创建失败\n");
14 return NULL;
15 }
16 s->len = 0;
17 s->next = NULL;
18 int i = 0;
19 for(i=0; i<n; i++)
20 {
21 add(s);
22 }
23 return s;
24
25 }
26
27 //判空函数
28 int pankong(student *s)
29 {
30
31 return s->next==NULL? 1: 0;
32 }
33
34 //增加函数
35 int add(student *s)
36 {
37 student *q = s;
38 while(NULL != q->next)
39 {
40 q = q->next;
41 }
42 student *p = (student *)malloc(sizeof(student)); //申请一个节点
43 printf("请输入学生学号 姓名 分数:");
44 scanf("%d%s%d",&p->id,p->name,&p->scroce);
45 q->next = p;
46 s->len++;
47 return 0;
48
49 }
50
51 //删除函数
52 int shanchu(student *s)
53 {
54 if(NULL == s || pankong(s))
55 {
56 printf("所给链表不合法,删除失败\n");
57 return -1;
58 }
59
60 char delname[20];
61 printf("请输入你要删除学生的姓名:");
62 scanf("%s",delname);
63 student *q = s;
64 while(NULL != q->next)
65 {
66 if(strcmp(delname,q->next->name) == 0)
67 {
68 student *p = q->next;
69 q->next = p->next;
70 free(p);
71 p = NULL;
72 s->len--;
73 }
74 q = q->next;
75 }
76 return 0;
77 }
78
79 //修改函数
80 int xiugai(student *s)
81 {
82 if(NULL == s || pankong(s))
83 {
84 printf("所给链表不合法,修改失败\n");
85 return -1;
86 }
87
88 char chname[20];
89 printf("请输入你要修改学生的姓名:");
90 scanf("%s",chname);
91 student *q = s;
92 while(NULL != q->next)
93 {
94 if(strcmp(chname,q->next->name) == 0)
95 {
96 printf("请输入你想修改成的学号 姓名 分数\n");
97 scanf("%d\t%s\t%d",&q->next->id,q->next->name,&q->next->scroce);
98 }
99 q = q->next;
00 }
01 return 0;
02
03 }
04
05 //查找函数
06 student *find(student *s)
07 {
08 char czname[20];
09 printf("请输入你要查找学生的姓名:");
10 scanf("%s",czname);
11 student *q = s;
12 while(NULL != q->next)
13 {
14 if(strcmp(czname,q->next->name) == 0)
15 {
16 printf("%s的所有信息为:\n",q->next->name);
17 printf("学号\t姓名\t成绩\n");
18 printf("%d\t%s\t%d\n",q->next->id,q->next->name,q->next->scroce);
19 return q->next;
20 }
21 q = q->next;
22 }
23 printf("查找失败,所给列表中没有该名学生\n");
24 return NULL;
25
26
27 }
28
29 //降序排列函数
30 int pailie(student *s)
31 {
32 if(NULL == s || pankong(s))
33 {
34 printf("所给链表不合法,排序失败\n");
35 return -1;
36 }
37 student *temp = (student *)malloc(sizeof(student)); //定义交换变量
38 student *p = s->next;
39 student *q = s->next;
40 while(NULL != p->next)
41 {
42 while(NULL != q->next)
43 {
44 if(q->scroce < q->next->scroce)
45 {
46 temp->id = q->id; //交换学号
47 q->id = q->next->id;
48 q->next->id = temp->id;
49
50 strcpy(temp->name,q->name); //交换名字
51 strcpy(q->name,q->next->name);
52 strcpy(q->next->name,temp->name);
53
54 temp->scroce = q->scroce; //交换分数
55 q->scroce = q->next->scroce;
56 q->next->scroce = temp->scroce;
57
58 }
59 q = q->next;
60 }
61 p = p->next;
62 }
63 q = s->next; //排序完后输出
64 printf("学号\t姓名\t分数\n");
65 while(NULL != q)
66 {
67 printf("%d\t%s\t%d\n",q->id,q->name,q->scroce);
68 q = q->next;
69 }
70
71 }
72
73 //遍历函数
74 int bianli(student *s)
75 {
76 if(NULL == s || pankong(s))
77 {
78 printf("空空如也,遍历失败\n");
79 return -1;
80 }
81 student *q = s->next;
82 printf("学号\t姓名\t分数\n");
83 while(NULL != q)
84 {
85 printf("%d\t%s\t%d\n",q->id,q->name,q->scroce);
86 q = q->next;
87 }
88 return 0;
89
90 }
91
92 //插入学生信息
93 int charu(student *s)
94 {
95 int n = 0;
96 printf("请输入你要插入的位置:");
97 scanf("%d",&n);
98 if(NULL == s || pankong(s) || n<1 || n>s->len+1)
99 {
00 printf("所给链表不合法,插入失败\n");
01 return -1;
02 }
03 if(n == s->len+1)
04 {
05 add(s);
06 }else
07 {
08 int i = 1;
09 student *q = s;
10 for(i=1; i<n; i++)
11 {
12 q = q->next; //找到要插入位置的前驱节点
13 }
14 student *p = (student *)malloc(sizeof(student)); //申请一个节点
15 printf("请输入学生学号 姓名 分数:");
16 scanf("%d%s%d",&p->id,p->name,&p->scroce);
17 p->next = q->next;
18 q->next = p;
19 s->len++;
20 }
21
22 return 0;
23 }
24
25
26 //销毁表格函数
27 int xiaohui(student *s)
28 {
29 if(NULL == s)
30 {
31 printf("所给链表不合法,销毁失败\n");
32 return -1;
33 }
34 student *q = s->next;
35 student *p = NULL;
36 while(NULL != q)
37 {
38 p = q;
39 q = q->next;
40 free(p);
41 p = NULL;
42 }
43 free(s);
44 s = NULL;
45
46 return 0;
47 }
48
主函数
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "./2201.h"
int main(int argc, const char *argv[])
{
int n = 0, m = 0, flag = 0;
student *s = NULL; //申请一个student类型的指针变量来接受创建函数返回回来的头结点的地址
printf("请输入你们班级的学生人数:");
scanf("%d",&n);
while(1)
{
printf("-----------------------学生管理系统-------------------------\n");
printf("| 功能1:录入学生信息 |\n");
printf("| 功能2:查看所有学生信息 |\n");
printf("| 功能3:添加学生信息 |\n");
printf("| 功能4:删除学生信息 |\n");
printf("| 功能5:修改学生信息 |\n");
printf("| 功能6:查找学生信息 |\n");
printf("| 功能7:降序排列学生信息 |\n");
printf("| 功能8:删除所有学生信息 |\n");
printf("-------------------功能9:退出系统---------------------------\n");
printf("请输入你想要的功能:");
scanf("%d",&m);
switch(m)
{
case 1:
s = create(n);
flag = 1;
break;
case 2:
if(0 == flag)
{
printf("请先录入学生信息\n");
break;
}
bianli(s);
break;
case 3:
charu(s);
flag = 1;
break;
case 4:
if(0 == flag)
{
printf("请先录入学生信息\n");
break;
}
shanchu(s);
break;
case 5:
if(0 == flag)
{
printf("请先录入学生信息\n");
break;
}
xiugai(s);
break;
case 6:
if(0 == flag)
{
printf("请先录入学生信息\n");
break;
}
find(s);
break;
case 7:
if(0 == flag)
{
printf("请先录入学生信息\n");
break;
}
pailie(s);
break;
case 8:
if(0 == flag)
{
printf("请先录入学生信息\n");
break;
}
xiaohui(s);
s = NULL;
break;
case 9:
exit(0);
break;
}
}
return 0;
}