使用单链表形式完成学生管理系统以下操作
代码如下:
头文件 head.h
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
int id;
char name[20];
float score;
}datatype;
typedef struct student{
union{
datatype data;
int len;
};
struct student *next;
}STU;
//菜单
void menu();
//创建链表
STU* create();
//判空
int empty(STU *S);
//申请学生节点
STU* apply();
//新增学生信息(头插)
int add(STU *S);
//遍历学生信息
void show(STU *S);
//根据位置插入学生信息
int insert_pos(STU *S,int pos);
//按学号查询学生信息
STU* search_id(STU *S,int id);
//按姓名查询学生信息
STU* search_name(STU *S,char *name);
//删除指定学号学生信息
int delete_id(STU *S,int id);
//改名字
int change_id(STU *S,int old_id,int new_id);
//按成绩降序排列
void sort_down(STU *S);
//转置链表
void rever_list(STU *S);
//清空全部信息
void free_link(STU *S);
#endif
功能函数文件 func.c
#include "head.h"
//menu
void menu()
{
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("*******0.退出系统************\n");
}
//创建链表
STU* create()
{
//判断逻辑
STU* S=(STU*)malloc(sizeof(STU));
if(NULL==S)
{
puts("创建失败");
return NULL;
}
//头节点初始化
S->next=NULL;
S->len=0;
//puts("创建成功");
return S;
}
//判空
int empty(STU *S)
{
return S->next==NULL?1:0;
}
//申请学生节点
STU* apply()
{
//申请新节点
STU *S=(STU*)malloc(sizeof(STU));
if(NULL==S)
{
puts("节点申请失败");
return NULL;
}
//给新申请节点赋值
S->next=NULL;
printf("请输入学生信息:\n");
printf("学号:");
scanf("%d",&S->data.id);
getchar();
printf("姓名:");
gets(S->data.name);
printf("成绩:");
scanf("%f",&S->data.score);
getchar();
//返回申请节点
return S;
}
//新增学生信息(头插)
int add(STU *S)
{
//判断逻辑
if(NULL==S)
{
puts("新增失败");
return -1;
}
//申请新节点
STU *p=apply();
//头插
p->next=S->next;
S->next=p;
//表的变化
S->len++;
puts("插入成功");
return 0;
}
//遍历学生信息
void show(STU *S)
{
//判断逻辑
if(NULL==S)
{
puts("遍历失败");
return;
}
if(empty(S))
{
puts("无信息");
return;
}
//定义遍历指针遍历输出
STU *p=S->next;
printf("学号\t\t姓名\t\t成绩\n");
while(p)
{
printf("%d\t\t%s\t\t%.2f\n",p->data.id,p->data.name,p->data.score);
p=p->next;
}
}
//根据位置插入学生信息
int insert_pos(STU *S,int pos)
{
//判断逻辑
if(NULL==S ||pos<=0 ||pos>S->len)
{
puts("插入失败");
return -1;
}
//申请新节点
STU *q=apply();
if(NULL==q) return -1;
//指针指向要插入前一个节点
STU *p=S;
for(int i=0;i<pos;i++)
{
p=p->next;
}
//插入操作
q->next=p->next;
p->next=q;
//表的变化
S->len++;
puts("插入成功");
return 0;
}
//按位置查询学生信息
STU* search_pos(STU*S,int pos)
{
//判断逻辑
if(NULL==S || pos<1 ||pos>S->len)
{
return NULL;
}
//定义遍历指针
STU *p=S->next;
//找到目标节点并返回
for(int i=1;i<pos;i++)
{
p=p->next;
}
return p;
}
//按学号查询学生信息
STU* search_id(STU *S,int n)
{
//判断逻辑
if(NULL==S ||empty(S))
{
puts("无法查询");
return NULL;
}
//定义遍历指针
STU *p=S->next;
//循环遍历查找目标节点
while(p)
{
if(p->data.id==n)
{
break;
}
p=p->next;
}
//判断结果并返回
if(NULL==p)
{
return NULL;
}else
{
return p;
}
}
//按姓名查询学生信息
STU* search_name(STU *S,char *na)
{
//判断逻辑
if(NULL==S ||empty(S))
{
puts("无法查询");
return NULL;
}
STU *p=S;
while(p)
{
if(strcmp(na,p->data.name)==0)
{
break;
}
p=p->next;
}
if(NULL==p)
{
return NULL;
}else
{
return p;
}
}
//删除指定学号学生信息
int delete_id(STU *S,int id)
{
//判断逻辑
if(NULL==S ||empty(S))
{
puts("删除失败");
return -1;
}
//标记要删除节点
STU *p=search_id(S,id);
if(NULL==p)
{
puts("没有找到该学号");
return -2;
}
//指针指向要删除前一个节点
STU *q=S;
while(q->next!=p)
{
q=q->next;
}
//删除节点
q->next=p->next;
free(p);
p=NULL;
//表的变化
S->len--;
puts("删除成功");
return 0;
}
//改学号
int change_id(STU *S,int old_id,int new_id)
{
//判断逻辑
if(NULL==S)
{
puts("查找失败");
return -1;
}
//调用查找函数,找到目标节点
STU *p=search_id(S,old_id);
if(NULL==p)
{
puts("查找失败");
return -2;
}
//修改目标节点学号
p->data.id=new_id;
puts("修改成功");
return 0;
}
//按成绩降序排列
void sort_down(STU *S)
{
//判断逻辑
if(NULL==S ||empty(S))
{
puts("无法排序");
return;
}
//申请中间节点
STU *p=(STU*)malloc(sizeof(STU));
//冒泡排序
for(int i=1;i<S->len;i++)
{
for(int j=1;j<=S->len-i;j++)
{
if(search_pos(S,j)->data.score < search_pos(S,j+1)->data.score)
{
p->data=search_pos(S,j)->data;
search_pos(S,j)->data=search_pos(S,j+1)->data;
search_pos(S,j+1)->data=p->data;
}
}
}
//释放临时节点空间
free(p);
p=NULL;
puts("排序完成");
return;
}
//转置链表
void rever_list(STU *S)
{
//判断逻辑
if(NULL==S ||S->len==0 ||S->len==1)
{
return;
}
//定义遍历指针
STU *p=S->next;
//孤立头结点
S->next=NULL;
//定义搬运指针
STU*q=NULL;
//遍历后头插
while(p)
{
q=p;
p=p->next;
q->next=S->next;
S->next=q;
}
puts("逆序成功");
return;
}
//清空全部信息
void free_link(STU *S)
{
//判断逻辑
if(NULL==S)
{
return;
}
//使用头删法,循环释放链表空间
while(S->next)
{
STU *p=S->next;
S->next=p->next;
free(p);
p=NULL;
}
puts("数据已清空");
}
主函数(main.c)
#include "head.h"
int main(int argc, const char *argv[])
{
//创建链表
STU *S=create();
if(NULL==S) return -1;
while(1)
{
menu();
printf("请输入您的选择:");
int n;
scanf("%d",&n);
getchar();
switch(n)
{
case 1: //新增学生信息
{
int num;
printf("请输入学生个数 :");
scanf("%d",&num);
getchar();
for(int i=1;i<=num;i++)
{
add(S);
}
};
break;
case 2: //查看信息
{
show(S);
};
break;
case 3: //查找信息
{
int id,n1;
char name[20];
printf("请输入查询方式(1学号,2姓名) :");
scanf("%d",&n);
getchar();
switch(n)
{
case 1:
{
printf("请输入要查询的学号:");
scanf("%d",&id);
getchar();
STU *p=search_id(S,id);
if(NULL==p)
{
puts("未查询到");
}else
{
printf("查询到了:\n");
printf("学号:%d\t姓名:%s\t成绩:%.2f\n",p->data.id,p->data.name,p->data.score);
}
};
break;
case 2:
{
printf("请输入要查询的姓名:");
gets(name);
STU *p=search_name(S,name);
if(NULL==p)
{
puts("未查询到");
}else
{
printf("查询到了:\n");
printf("学号:%d\t姓名:%s\t成绩:%.2f\n",p->data.id,p->data.name,p->data.score);
}
}
}
};
break;
case 4: //插入信息
{
int pos;
printf("请输入要插入的位置:");
scanf("%d",&pos);
getchar();
insert_pos(S,pos);
};
break;
case 5: //更改信息
{
int id1,id2;
printf("请输入要更改的学号和目的学号:");
scanf("%d%d",&id1,&id2);
getchar();
change_id(S,id1,id2);
};
break;
case 6: //成绩排名
{
sort_down(S);
};
break;
case 7: //成绩逆序
{
rever_list(S);
};
break;
case 8: //删除信息
{
int id3;
printf("请输入要删除的学生id:");
scanf("%d",&id3);
delete_id(S,id3);
};
break;
case 9: //清空信息
{
free_link(S);
};
break;
case 0: exit(0); break;
default :printf("输入选项不存在,请重新输入!\n");
}
}
return 0;
}
功能实现:
*******学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:1
请输入学生个数 :3
请输入学生信息:
学号:1
姓名:tom
成绩:88
插入成功
请输入学生信息:
学号:2
姓名:jerry
成绩:60
插入成功
请输入学生信息:
学号:3
姓名:zs
成绩:43
插入成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号 姓名 成绩
3 zs 43.00
2 jerry 60.00
1 tom 88.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:3
请输入查询方式(1学号,2姓名) :1
请输入要查询的学号:2
查询到了:
学号:2 姓名:jerry 成绩:60.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:4
请输入要插入的位置:4
插入失败
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:4
请输入要插入的位置:3
请输入学生信息:
学号:4
姓名:wwe
成绩:66
插入成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号 姓名 成绩
3 zs 43.00
2 jerry 60.00
1 tom 88.00
4 wwe 66.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:5
请输入要更改的学号和目的学号:4 14
修改成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号 姓名 成绩
3 zs 43.00
2 jerry 60.00
1 tom 88.00
14 wwe 66.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:6
排序完成
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号 姓名 成绩
1 tom 88.00
14 wwe 66.00
2 jerry 60.00
3 zs 43.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:7
逆序成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号 姓名 成绩
3 zs 43.00
2 jerry 60.00
14 wwe 66.00
1 tom 88.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:8
请输入要删除的学生id:14
删除成功
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
学号 姓名 成绩
3 zs 43.00
2 jerry 60.00
1 tom 88.00
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:9
数据已清空
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:2
无信息
********学生管理系统*********
*******1.新增学生信息********
*******2.查看信息************
*******3.查找信息************
*******4.插入信息************
*******5.更改信息************
*******6.成绩排名************
*******7.成绩逆序************
*******8.删除信息************
*******9.清空信息************
*******0.退出系统************
请输入您的选择:0