1、用单链表实现一个学生管理系统
studentsys.h
#ifndef __STU_H__
#define __STU_H__
#include <stdio.h>
#include "stdlib.h"
#define N 20
typedef struct {
int id;
char name[N];
float score;
}Stu;
typedef struct node {
Stu data;
struct node *next;
}Linklist;
//创建
int stu_insert(Linklist **s,Stu msg);
//判空
int empty(Linklist *s);
//遍历
int stu_show(Linklist *s);
//删除学生信息
int stu_delete(Linklist **s);
//修改学生信息
int stu_update(Linklist *s);
//按成绩排序
int stu_sort_score(Linklist *s,int flag);
//按学号排序
int stu_sort_id(Linklist *s,int flag);
#endif
studentsys.c
#include "student.h"
#include <string.h>
int stu_insert(Linklist **s,Stu msg)
{
Linklist *p=(Linklist *)malloc(sizeof(Linklist));
if(NULL==p){
return -1;
}
p->data=msg;
p->next=NULL;
if(*s==NULL){
*s=p;
}else{
p->next=*s;
*s=p;
}
return 0;
}
int empty(Linklist *s)
{
return s==NULL ? 1 : 0;
}
int stu_show(Linklist *s)
{
if(empty(s))
return -1;
printf("\t学号\t姓名\t成绩\n");
while(s!=NULL){
printf("\t%d\t%s\t%.1f\n",s->data.id,s->data.name,s->data.score);
s=s->next;
}
putchar(10);
return 0;
}
int stu_delete(Linklist **s)
{
if(empty(*s))
return -1;
int t_id=-1;
char t_name[N]={0};
int flag=0;
printf("请输入你要删除的学生学号或姓名>>>");
scanf("%d",&t_id);
if(t_id<0){
scanf("%s",t_name);
}
while(getchar()!='\n');
Linklist *p=*s;
Linklist *h=NULL,*tail=NULL;
*s=NULL;
while(p!=NULL){
if(p->data.id==t_id || strcmp(t_name,p->data.name)==0){
h=p;
p=p->next;
free(h);
h=NULL;
flag=1;
}else{
if(*s==NULL){
*s=p;
tail=*s;
}else{
tail->next=p;
tail=p;
}
p=p->next;
}
}
if(*s!=NULL){
tail->next=NULL;
tail=NULL;
}
if(flag)
puts("删除成功");
else
puts("查无此人,无法删除");
return 0;
}
int stu_update(Linklist *s)
{
if(empty(s))
return -1;
int t_id=-1;
char t_name[N]={0};
Stu msg;
printf("请输入你要修改的学生学号或姓名>>>");
scanf("%d",&t_id);
if(t_id<0){
scanf("%s",t_name);
}
while(getchar()!='\n');
int i=0;
struct Temp {
Linklist *tp;
struct Temp *next;
};
struct Temp *h=NULL,*tail=NULL;
while(s!=NULL){
if(s->data.id==t_id || strcmp(s->data.name,t_name)==0){
struct Temp *tmp=(struct Temp *)malloc(sizeof(struct Temp));
tmp->tp=s;
tmp->next=NULL;
if(h==NULL){
h=tail=tmp;
}else{
tail->next=tmp;
tail=tmp;
}
i++;
}
s=s->next;
}
while(1){
if(i==0){
puts("查无此人,无法修改");
return 0;
}else{
int j=0,choose=0;;
if(t_id>0)
printf("找到%d名学生的学号为%d,如下:\n",i,t_id);
else
printf("找到%d名学生的姓名为%s,如下:\n",i,t_name);
tail=h;
printf("\t编号\t学号\t姓名\t成绩\n");
while(tail!=NULL){
printf("\t%d\t%d\t%s\t%.1f\n",++j,tail->tp->data.id,
tail->tp->data.name,tail->tp->data.score);
tail=tail->next;
}
putchar(10);
printf("请输入你修改学生信息的编号>>>");
scanf("%d",&choose);
while(getchar()!='\n');
while(1){
int n=0;
printf("请输入修改后的学号 姓名 成绩>>>");
n=scanf("%d %s %f",&msg.id,msg.name,&msg.score);
while(getchar()!='\n');
if(n!=3){
puts("信息输入不合法,请重试!");
continue;
}
break;
}
if(choose==1){
tail=h;
tail->tp->data=msg;
h=tail->next;
free(tail);
tail=NULL;
}else{
tail=h->next;
struct Temp *p=h;
while(--choose>1){
tail=tail->next;
p=p->next;
}
tail->tp->data=msg;
p->next=tail->next;
free(tail);
tail=NULL;
}
puts("修改成功");
i--;
printf("是否继续修改(y|Y)>>>");
char ch=getchar();
while(getchar()!='\n');
if(ch=='y' || ch=='Y')
continue;
else
break;
}
}
while(h!=NULL){
if(h->next!=NULL){
tail=h;
h=h->next;
free(tail);
tail=NULL;
}else{
free(h);
h=NULL;
}
}
return 0;
}
int stu_sort_score(Linklist *s,int flag)
{
if(empty(s))
return -1;
Stu temp;
Linklist *max=NULL;
Linklist *p=NULL;
while(s!=NULL){
max=s;
if(s->next!=NULL)
p=s->next;
else
break;
while(p!=NULL){
if(0==flag){
if(max->data.score > p->data.score)
max=p;
}else{
if(max->data.score < p->data.score)
max=p;
}
p=p->next;
}
if(max!=s){
temp=max->data;
max->data=s->data;
s->data=temp;
}
s=s->next;
}
p=max=NULL;
puts("排序完成");
return 0;
}
int stu_sort_id(Linklist *s,int flag)
{
if(empty(s))
return -1;
Stu temp;
Linklist *max=NULL;
Linklist *p=NULL;
while(s!=NULL){
max=s;
if(s->next!=NULL)
p=s->next;
else
break;
while(p!=NULL){
if(0==flag){
if(max->data.id > p->data.id)
max=p;
}else{
if(max->data.id < p->data.id)
max=p;
}
p=p->next;
}
if(max!=s){
temp=max->data;
max->data=s->data;
s->data=temp;
}
s=s->next;
}
p=max=NULL;
puts("排序完成");
return 0;
}
main.c
#include <stdio.h>
#include "student.h"
void menu()
{
puts("\t***********欢迎使用***********");
puts("\t*******学生信息管理系统*******");
puts("\t\t1.录入学生信息");
puts("\t\t2.查看所有信息");
puts("\t\t3.删除学生信息");
puts("\t\t4.修改学生信息");
puts("\t\t5.按成绩排序");
puts("\t\t6.按学号排序");
puts("\t\t0.退出系统");
puts("\t******************************");
}
int main(int argc, const char *argv[])
{
Stu msg;
int choose=0,n=0,flag=0;
char ch;
Linklist *s=NULL;
while(1){
menu();
printf("请输入你的选择>>>");
scanf("%d",&choose);
while(getchar()!='\n');
switch(choose){
case 1:
Try:
printf("请依次输入学生的学号 姓名 成绩>>>");
n=scanf("%d %s %f",&msg.id,msg.name,&msg.score);
while(getchar()!='\n');
if(n!=3){
puts("信息输入不合法,请重试!");
goto Try;
}
stu_insert(&s,msg);
break;
case 2:
if(stu_show(s)<0)
puts("系统目前为空");
break;
case 3:
if(stu_delete(&s)<0)
puts("系统信息为空,删除失败");
break;
case 4:
if(stu_update(s)<0)
puts("系统信息为空,修改失败");
break;
case 5:
printf("是否要从小到大排序(Y|y)>>>");
ch=getchar();
while(getchar()!='\n');
if(ch=='Y' || ch=='y')
flag=0;
else
flag=1;
if(stu_sort_score(s,flag)<0){
puts("系统信息为空,排序失败");
break;
}
stu_show(s);
break;
case 6:
printf("是否要从小到大排序(Y|y)>>>");
ch=getchar();
while(getchar()!='\n');
if(ch=='Y' || ch=='y')
flag=0;
else
flag=1;
if(stu_sort_id(s,flag)<0){
puts("系统信息为空,排序失败");
break;
}
stu_show(s);
break;
case 0:
puts("正在退出系统...");
exit(0);
break;
default :
puts("输入有误,请重试!");
break;
}
}
return 0;
}
2、插入与查看测试
3、删除测试
4、修改测试
5、按成绩排序测试
6、按学号排序测试
6、退出测试