主函数
#include "fun.h"
int main(int argc, const char *argv[])
{
Node *S = createlist();
menu();
while (1)
{
choice(S);
}
return 0;
}
函数声明
#ifndef __FUN_H__
#define __FUN_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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();
#endif
被调函数
#include "fun.h"
//------------------------------------------------------------
//创建一个学生链表
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();
}
}
测试
![](https://i-blog.csdnimg.cn/blog_migrate/ce758435c369ffdfc008afd41519f3ee.png)
》》请输入你的选项: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
遍历失败
。。。。。。。。。。。。。。。。。。