数据结构-链表实现学生信息管理系统
主函数
-
-
-
int main(int argc, const char *argv[])
-
{
-
Node *S = createlist();
-
menu();
-
while (1)
-
{
-
choice(S);
-
}
-
return 0;
-
}
函数声明
-
-
-
-
-
-
-
-
typedef struct Node
-
{
-
int id;
-
char name[10];
-
int score;
-
int len;
-
struct Node* next;
-
}Node;
-
-
//创建一个学生链表
-
Node *createlist();
-
-
//创建一个学生的结点
-
Node *createnode(Node *S,const int id,const char *name,const int score);
-
-
//判空
-
int empty(Node *S);
-
-
//在头部插入一个学生的信息
-
int ins_head(Node *S,const int id,const char *name,const int score);
-
-
//在尾部插入一个学生的信息
-
int ins_tail(Node *S,int id,char *name,int score);
-
-
//删除头部学生信息
-
int del_head(Node *S);
-
-
//删除尾部学生信息
-
int del_tail(Node *S);
-
-
//按姓名删除学生信息
-
int del_name(Node *S,char *name);
-
-
//按学号删除学生信息
-
int del_id(Node *S,int id);
-
-
//按学号修改学生信息
-
int change_id(Node *S,int id,int score);
-
-
//按姓名修改学生信息
-
int change_name(Node *S,char *name,int score);
-
-
//按学号查找学生的信息
-
int find_id(Node *S,int id);
-
-
//按姓名查找学生的信息
-
int find_name(Node *S,char *name);
-
-
//遍历所有学生信息
-
int tra(Node *S);
-
-
//按学号排序
-
Node *sort_id(Node *S);
-
-
//按成绩排序
-
Node *sort_score(Node *S);
-
-
//菜单界面
-
void menu();
-
-
//输入项选择
-
int input();
-
-
//选择需要的操作 输入数据
-
int choice();
-
-
被调函数
-
-
-
//------------------------------------------------------------
-
//创建一个学生链表
-
Node *createlist()
-
{
-
//申请链表
-
Node *S = (Node*)malloc(sizeof(Node));
-
if (NULL == S)
-
{
-
printf("学生列表申请失败\n");
-
return NULL;
-
}
-
-
printf("学生列表申请成功\n");
-
-
//初始化
-
S->id = 0;
-
strcpy(S->name,"");
-
S->score = 0;
-
S->next = NULL;
-
S->len = 0;
-
return S;
-
}
-
-
//------------------------------------------------------------
-
//判空
-
int empty(Node *S)
-
{
-
return NULL == S->next ? 1 : 0; //1空 0非空
-
}
-
-
//------------------------------------------------------------
-
//创建一个学生的结点
-
Node *createnode(Node *S,const int id,const char *name,const int score)
-
{
-
S = (Node*)malloc(sizeof(Node)); //给结点分配一个内存空间
-
if (NULL == S)
-
{
-
printf("节点申请失败\n");
-
return NULL;
-
}
-
-
//放数据
-
S->id = id;
-
strcpy(S->name,name);
-
S->score = score;
-
S->next = NULL;
-
S->len ;
-
return S;
-
}
-
-
//------------------------------------------------------------
-
//在头部插入一个学生的信息
-
int ins_head(Node *S,const int id,const char *name,const int score)
-
{
-
if (NULL == S)
-
{
-
printf("所给链表不合法\n");
-
return 0;
-
}
-
Node *p = createnode(S,id,name,score);
-
if (NULL == p)
-
{
-
printf("结点申请失败\n");
-
return 0;
-
}
-
-
//完成头插
-
p->next = S->next;
-
S->next = p;
-
-
//表的变化
-
S->len ;
-
-
return 1;
-
-
}
-
-
//------------------------------------------------------------
-
//在尾部插入一个学生的信息
-
int ins_tail(Node *S,int id,char *name,int score)
-
{
-
if (NULL == S)
-
{
-
printf("所给链表不合法\n");
-
return 0;
-
}
-
Node *p = createnode(S,id,name,score);
-
if (NULL == p)
-
{
-
printf("结点申请失败\n");
-
return 0;
-
}
-
while (NULL != S->next)
-
{
-
S = S->next;
-
}
-
-
//完成尾插
-
S->next = p;
-
p->next = NULL;
-
-
//表的变化
-
S->len ;
-
return 1;
-
}
-
-
//------------------------------------------------------------
-
//删除头部学生信息
-
int del_head(Node *S)
-
{
-
if (NULL == S || empty(S))
-
{
-
printf("删除失败\n");
-
return 0;
-
}
-
Node *p = S->next->next;
-
free(S->next);
-
S->next = p;
-
p = NULL;
-
S->len--;
-
return 1;
-
}
-
-
//------------------------------------------------------------
-
//删除尾部学生信息
-
int del_tail(Node *S)
-
{
-
if (NULL == S || empty(S))
-
{
-
printf("删除失败\n");
-
return 0;
-
}
-
while (S->next->next != NULL)
-
{
-
S = S->next;
-
}
-
Node *p = S->next;
-
S->next = NULL;
-
free(p);
-
p = NULL;
-
S->len--;
-
return 1;
-
}
-
-
//------------------------------------------------------------
-
//按姓名删除学生信息
-
int del_name(Node *S,char *name)
-
{
-
if (NULL == S || empty(S))
-
{
-
printf("删除失败\n");
-
return 0;
-
}
-
Node *p;
-
-
while (S->next != NULL)
-
{
-
if (!strcmp(S->next->name,name))
-
{
-
p = S->next->next;
-
free(S->next);
-
S->next = p;
-
p = NULL;
-
S->len--;
-
return 1;
-
}
-
S = S->next;
-
}
-
-
printf("没有该学生信息,无法删除\n");
-
return 0;
-
}
-
-
//------------------------------------------------------------
-
//按学号删除学生信息
-
int del_id(Node *S,int id)
-
{
-
if (NULL == S || empty(S))
-
{
-
printf("删除失败\n");
-
return 0;
-
}
-
Node *p;
-
-
while (S->next != NULL)
-
{
-
if (id == S->next->id)
-
{
-
p = S->next->next;
-
free(S->next);
-
S->next = p;
-
p = NULL;
-
S->len--;
-
return 1;
-
}
-
S = S->next;
-
-
}
-
-
printf("没有该学生信息,无法删除\n");
-
return 0;
-
}
-
-
//------------------------------------------------------------
-
//按学号修改学生的信息
-
int change_id(Node *S,int id,int score)
-
{
-
while (S->next != NULL)
-
{
-
if (id == S->next->id)
-
{
-
S->next->score = score;
-
return 1;
-
}
-
S = S->next;
-
}
-
printf("修改失败\n");
-
return 0;
-
-
}
-
-
//------------------------------------------------------------
-
//按姓名修改学生的信息
-
int change_name(Node *S,char *name,int score)
-
{
-
while (S->next != NULL)
-
{
-
if (!strcmp(name,S->next->name))
-
{
-
S->next->score = score;
-
return 1;
-
}
-
S = S->next;
-
}
-
printf("查找失败\n");
-
return 0;
-
-
}
-
-
//------------------------------------------------------------
-
//按学号查找学生的信息
-
int find_id(Node *S,int id)
-
{
-
if (NULL == S || empty(S))
-
{
-
printf("查找失败\n");
-
return 0;
-
}
-
Node *p = S;
-
-
printf("学号\t姓名\t成绩\n");
-
while (p->next != NULL)
-
{
-
if (p->next->id == id)
-
{
-
printf(" %d\t%s\t %d\n",p->next->id,p->next->name,p->next->score);
-
return 1;
-
}
-
p = p->next;
-
}
-
printf("未查询到该学生信息\n");
-
return 0;
-
}
-
-
//------------------------------------------------------------
-
//按姓名查找学生的信息
-
int find_name(Node *S,char *name)
-
{
-
if (NULL == S || empty(S))
-
{
-
printf("查找失败\n");
-
return 0;
-
}
-
Node *p = S;
-
-
printf("学号\t姓名\t成绩\n");
-
while (p->next != NULL)
-
{
-
if (!strcmp(p->next->name,name))
-
{
-
printf(" %d\t%s\t %d\n",p->next->id,p->next->name,p->next->score);
-
return 1;
-
}
-
p = p->next;
-
}
-
printf("未查询到该学生信息\n");
-
return 0;
-
}
-
-
//------------------------------------------------------------
-
//遍历所有的信息
-
int tra(Node *S)
-
{
-
if (NULL == S || empty(S))
-
{
-
printf("遍历失败\n");
-
return 0;
-
}
-
printf("学号\t姓名\t成绩\n");
-
do
-
{
-
printf(" %d\t%s\t %d\n",S->next->id,S->next->name,S->next->score);
-
S = S->next;
-
}while(S->next != NULL);
-
return 1;
-
}
-
-
//------------------------------------------------------------
-
//按学号排序
-
Node *sort_id(Node *S)
-
{
-
Node *X = S;
-
Node *head = X;
-
Node *p = X->next;
-
if (X->next == NULL)
-
{
-
printf("链表错误\n");
-
return NULL;
-
}
-
Node *q = p->next;
-
if (X->next->next == NULL)
-
{
-
printf("数据过少无需排序\n");
-
return NULL;
-
}
-
for (int i=1;i<S->len;i )
-
{
-
for (int j=0;j<S->len-i;j )
-
{
-
if (q->id > p->id)
-
{
-
if (p->next == q)
-
{
-
head->next = q;
-
if (q->next == NULL)
-
{
-
p->next = NULL;
-
}
-
else
-
{
-
p->next = q->next;
-
}
-
q->next = p;
-
}
-
else if (q->next == p)
-
{
-
head->next = p;
-
if (p->next == NULL)
-
{
-
q->next = NULL;
-
}
-
else
-
{
-
q->next = p->next;
-
}
-
p->next = q;
-
}
-
}
-
head = head->next;
-
q = q->next;
-
p = p->next;
-
}
-
}
-
tra(p);
-
-
return X;
-
}
-
-
-
//------------------------------------------------------------
-
//按成绩排序
-
Node *sort_score(Node *S)
-
{
-
Node *X = S;
-
Node *head = X;
-
Node *p = X->next;
-
if (X->next == NULL)
-
{
-
printf("链表错误\n");
-
return NULL;
-
}
-
Node *q = p->next;
-
if (X->next->next == NULL)
-
{
-
printf("数据过少无需排序\n");
-
return NULL;
-
}
-
for (int i=1;i<S->len;i )
-
{
-
for (int j=0;j<S->len-i;j )
-
{
-
if (q->score > p->score)
-
{
-
if (p->next == q)
-
{
-
head->next = q;
-
if (q->next == NULL)
-
{
-
p->next = NULL;
-
}
-
else
-
{
-
p->next = q->next;
-
}
-
q->next = p;
-
}
-
else if (q->next == p)
-
{
-
head->next = p;
-
if (p->next == NULL)
-
{
-
q->next = NULL;
-
}
-
else
-
{
-
q->next = p->next;
-
}
-
p->next = q;
-
}
-
}
-
head = head->next;
-
q = q->next;
-
p = p->next;
-
}
-
}
-
tra(p);
-
-
return X;
-
-
}
-
-
-
//------------------------------------------------------------
-
//菜单界面
-
void menu()
-
{
-
printf(" ┌-----------------------------------------┐\n");
-
printf(" | |\n");
-
printf(" | 欢迎使用学生信息管理系统 |\n");
-
printf(" |_________________________________________|\n");
-
printf(" | 当前版本:V2.0 |\n");
-
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(" | 10 按姓名修改学生信息 |\n");
-
printf(" | 11 按学号查找学生的信息 |\n");
-
printf(" | 12 按姓名查找学生的信息 |\n");
-
printf(" | 13 查看所有学生信息 |\n");
-
printf(" | 14 按学号排序 |\n");
-
printf(" | 15 按成绩排序 |\n");
-
printf(" | 16 清屏 |\n");
-
printf(" | 0 退出 |\n");
-
printf(" └-----------------------------------------┘\n");
-
}
-
-
-
-
-
//------------------------------------------------------------
-
//选择需要的操作
-
int choice(Node *S)
-
{
-
int n = 0;
-
n = input();
-
switch(n)
-
{
-
case 1:
-
menu();
-
break;
-
case 2:
-
{
-
int sum;
-
printf("请输入添加的学生人数:");
-
scanf("%d",&sum);
-
for (int i = 0;i<sum;i )
-
{
-
int id,score;
-
char name[10];
-
printf("请输入第%d名同学学号:",i 1);
-
scanf("%d",&id);
-
printf("请输入第%d名同学姓名:",i 1);
-
scanf("%s",name);
-
printf("请输入第%d名同学成绩:",i 1);
-
scanf("%d",&score);
-
ins_tail(S,id,name,score);
-
}
-
}
-
break;
-
case 3:
-
{
-
int id,score;
-
char name[10];
-
printf("请输入学号:");
-
scanf("%d",&id);
-
printf("请输入姓名:");
-
scanf("%s",name);
-
printf("请输入成绩:");
-
scanf("%d",&score);
-
if(ins_head(S,id,name,score))
-
{
-
printf("头插成功\n");
-
}
-
}
-
break;
-
case 4:
-
{
-
int id,score;
-
char name[10];
-
printf("请输入学号:");
-
scanf("%d",&id);
-
printf("请输入姓名:");
-
scanf("%s",name);
-
printf("请输入成绩:");
-
scanf("%d",&score);
-
if(ins_tail(S,id,name,score))
-
{
-
printf("尾插成功\n");
-
}
-
}
-
break;
-
case 5:
-
{
-
if(del_head(S))
-
{
-
printf("头删成功\n");
-
}
-
}
-
break;
-
case 6:
-
{
-
if (del_tail(S))
-
{
-
printf("尾删成功\n");
-
}
-
}
-
break;
-
case 7:
-
{
-
char name[10];
-
printf("请输入要删除的学生姓名:");
-
scanf("%s",name);
-
if (del_name(S,name))
-
{
-
printf("删除成功\n");
-
}
-
}
-
break;
-
case 8:
-
{
-
int id;
-
printf("请输入要删除的学生学号:");
-
scanf("%d",&id);
-
if (del_id(S,id))
-
{
-
printf("删除成功\n");
-
}
-
}
-
break;
-
case 9:
-
{
-
int id;
-
printf("请输入要修改成绩的学生学号:");
-
scanf("%d",&id);
-
if (!find_id(S,id))
-
{
-
printf("没有该学生!\n");
-
}
-
else
-
{
-
int score;
-
printf("请输入修改的成绩:");
-
scanf("%d",&score);
-
if (change_id(S,id,score))
-
{
-
printf("修改成功\n");
-
}
-
}
-
}
-
break;
-
case 10:
-
{
-
char name[10];
-
printf("请输入要修改成绩的学生姓名:");
-
scanf("%s",name);
-
if (!find_name(S,name))
-
{
-
printf("没有该学生!\n");
-
}
-
else
-
{
-
int score;
-
printf("请输入修改的成绩:");
-
scanf("%d",&score);
-
if (change_name(S,name,score))
-
{
-
printf("修改成功\n");
-
}
-
}
-
}
-
break;
-
case 11:
-
{
-
int id;
-
printf("请输入要查找的学生学号:");
-
scanf("%d",&id);
-
if (find_id(S,id))
-
{
-
printf("查找成功\n");
-
}
-
}
-
break;
-
case 12:
-
{
-
char name[10];
-
printf("请输入要查找的学生姓名:");
-
scanf("%s",name);
-
if(find_name(S,name));
-
{
-
printf("查找成功\n");
-
}
-
}
-
break;
-
case 13:
-
{
-
if (tra(S))
-
{
-
printf("所有学生信息输出成功\n");
-
}
-
}
-
break;
-
case 14:
-
{
-
Node *L = sort_id(S);
-
if (L == NULL)
-
{
-
return -1;
-
}
-
printf("按学号排序成功\n");
-
tra(L);
-
}
-
break;
-
case 15:
-
{
-
Node *L = sort_score(S);
-
if (L == NULL)
-
{
-
return -1;
-
}
-
printf("按成绩排序成功\n");
-
}
-
break;
-
case 16:
-
system("clear");
-
break;
-
case 0:
-
system("clear");
-
exit(0);
-
break;
-
}
-
}
-
-
-
//------------------------------------------------------------
-
//输入
-
int input()
-
{
-
int num;
-
printf("请输入你的选项:");
-
scanf("%d",&num);
-
if (num >= 0 && num <= 17)
-
{
-
return num;
-
}
-
else
-
{
-
system("clear");
-
menu();
-
printf("输入错误请重新输入\n");
-
scanf("%*[^\n]%*c");
-
input();
-
}
-
}
测试
-
》》请输入你的选项:2
-
请输入添加的学生人数:2
-
请输入第1名同学学号:1002
-
请输入第1名同学姓名:hh
-
请输入第1名同学成绩:99
-
请输入第2名同学学号:1005
-
请输入第2名同学姓名:ll
-
请输入第2名同学成绩:55
-
-
》》请输入你的选项:3
-
请输入学号:1009
-
请输入姓名:jj
-
请输入成绩:56
-
头插成功
-
-
》》请输入你的选项:4
-
请输入学号:22
-
请输入姓名:pl
-
请输入成绩:85
-
尾插成功
-
-
》》请输入你的选项:13
-
学号 姓名 成绩
-
1009 jj 56
-
1002 hh 99
-
1005 ll 55
-
22 pl 85
-
所有学生信息输出成功
-
-
》》请输入你的选项:5
-
头删成功
-
-
》》请输入你的选项:6
-
尾删成功
-
-
》》请输入你的选项:13
-
学号 姓名 成绩
-
1002 hh 99
-
1005 ll 55
-
所有学生信息输出成功
-
请输入你的选项:7
-
-
》》请输入要删除的学生姓名:hh
-
删除成功
-
请输入你的选项:8
-
-
》》请输入要删除的学生学号:1005
-
删除成功
-
-
》》请输入你的选项:13
-
遍历失败
-
-
。。。。。。。。。。。。。。。。。。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcijif
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01