本文实例为大家分享了C语言链表实现学生信息管理系统的具体代码,供大家参考,具体内容如下
事先存入的数据:
菜单
创建链表并倒序输出
输出链表中的全部信息
写入信息并保存至文件中(覆盖原有文件)
随机读取
指定查找
添加信息
指定删除
特殊查找
特殊删除
退出系统
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<iomanip>
#include<fstream>
#include<time.h>
int length=0;
using namespace std;
char a[10],b[10],c[10],d[10],e[10],f[10],g[10];
//定义学生信息的结构体类型,包括:学号、姓名、专业、班级、3门成绩
typedef struct StuNode
{
char grad[10];//学号
char name[10];//姓名
char spec[10];//专业
char stu_class[10];//班级
int score1;
int score2;
int score3;
struct StuNode *next;
}student, *StuLink;
void Sort(StuLink &head)//从小到大进行冒泡排序
{
StuLink tmp,pre,p,q;
if (head->next)
{
p = head->next->next;
head->next->next = NULL;
while (p)
{
pre = head; //pre是q的前驱
q = pre->next;
while (q && strcmp(q->grad,p->grad)<0)//从链表第二个结点开始找比当前插入值大的结点
{
pre = pre->next;
q = q->next;
}
tmp = p->next;//将p插入到结点pre和q之间
p->next = q;
pre->next = p;
p = tmp;
}
}
}
student *CreateList()//初始化:创建链表
{
void Output(StuLink &p);
StuLink head = (student*)malloc(sizeof(student));
StuLink p,q;
p = head;
q = head;
char grad[10];//学号
char name[10];//姓名
char spec[10];//专业
char stu_class[10];//班级
int score1;
int score2;
int score3;
FILE *r= fopen("2.txt","r");
if(r==NULL)
{
printf("打开文件失败!");
return NULL;
}
fscanf(r,"%s%s%s%s%s%s%s",&a,&b,&c,&d,&e,&f,&g);//读取标题
while(fscanf(r,"%s%s%s%s%d%d%d",grad,name,spec,stu_class,&score1,&score2,&score3)!=EOF)
{
q = (student*)malloc(sizeof(student));
strcpy(q->grad,grad);
strcpy(q->name,name);
strcpy(q->spec,spec);
strcpy(q->stu_class,stu_class);
q->score1 = score1;
q->score2 = score2;
q->score3 = score3;
p->next = q;
p = q;
length++;
}
p->next = NULL;
Sort(head);
//倒序输出
StuLink k = head,t;
while(k->next)
k = k->next;
while(k!=head)
{ //倒序输出
t = head;
while(t->next!=k)
t = t->next;//t为k前驱
k = t;
}
return head;
}
void Output(StuLink &p)//输出信息
{
printf("%5s %-5s %-3s %s %3d %3d %3d\n",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
}
void Print_List(StuLink &head)//打印整个链表
{
StuLink p = head->next;
while(p)
{
Output(p);
p = p->next;
}
}
void Save(StuLink &head)//写入文件。
{
StuLink p = (student*)malloc(sizeof(student)),q = head->next;
char grad[10],name[10],spec[10],stu_class[10];
int score1,score2,score3;
printf("请输入学生信息:\n");
scanf("%s%s%s%s%d%d%d",p->grad,p->name,p->spec,p->stu_class,&p->score1,&p->score2,&p->score3);
FILE *w =fopen("2.txt","a");
if(w==NULL)
{
printf("打开文件失败!\n");
return;
}
else printf("写入成功!\n");
fprintf(w,"\n%s %s %s %s %d %d %d",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
fclose(w);
//存入链表
p->next = q;
head->next = p;
Sort(head);
}
void Fetch(StuLink &H)//随机读取某个学生的信息。
{
StuLink p = H->next;
int i = time(NULL) % length;
int j = i;
while(j)
{
p = p->next;
j--;
}
printf("第%d名学生\n",i+1);
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
Output(p);
}
student *Search_num(StuLink &H)
{ //查找指定学号的学生,返回指向该学生结点的指针。
char grad[10];
printf("请输入查询信息的学号:");
scanf("%s",grad);
StuLink p = H->next;
while(p)
{
if(strcmp(p->grad,grad)==0)
return p;
p = p->next;
}
return NULL;
}
void InsertList(StuLink &H)
{ //在函数中输入一个学生的信息,将该学生信息插入到链表中的相应位置,并保持此链表按学号的有序性。
StuLink p = H->next, q = H;
StuLink insert = (student*)malloc(sizeof(student));
printf("请输入学生信息:\n");
scanf("%s%s%s%s%d%d%d",insert->grad,insert->name,insert->spec,insert->stu_class,&insert->score1,&insert->score2,&insert->score3);
while(p)
{
if(strcmp(p->grad,insert->grad) > 0 )
{
q->next = insert;//应插入q和p之间
insert->next = p;
break;
}
q = q->next;//q是p的前驱
p = p->next;
}
if(!p)//insert的学号大于所有已知值
{
q->next = insert;
insert->next = NULL;
}
p = H->next;
printf("\n");
Print_List(H);
}
void Delete_num(StuLink &H)//从链表中删除指定学号的学生。
{
StuLink p = H->next, q = H;
char grad[10];
printf("请输入想删除的学生的学号:\n");
scanf("%s",grad);
while(p)
{
if(strcmp(p->grad,grad)==0)
{
q->next = p->next;
free(p);
break;
}
q = q->next;
p = p->next;
}
FILE *w =fopen("2.txt","w");
p=H->next;
while(p)
{
fprintf(w,"%5s %-5s %-3s %s %3d %3d %3d\n",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
p = p->next;
}
fclose (w);
Print_List(H);
}
student *Search_major_subject_score(StuLink &H)
{ //查找某个专业的、某门课程的成绩小于某个分数的学生,返回指向该学生结点的指针。
char spec[10];
float score;
StuLink p = H->next;
int lesson;
printf("请输入专业、课程序号和门限分数:\n");
scanf("%s%d%f",spec,&lesson,&score);
while(p)
{
if(strcmp(p->spec,spec)==0)
if(lesson==1 && p->score1<score || lesson==2 && p->score2<score || lesson==3 && p->score3<score)
return p;
p = p->next;
}
return NULL;
}
void Delete_major_subject(StuLink &H)
{ //从链表中删除某个专业的、某门课程的成绩小于某个分数的学生。
char spec[10];
float score;
StuLink p = H->next, q = H;
int lesson,flag = 0;
printf("请输入专业、课程序号和门限分数:\n");
scanf("%s%d%f",spec,&lesson,&score);
while(p)
{
if(strcmp(p->spec,spec)==0 && lesson == 1 && p->score1 < score) // cs 1 94
{
Output(p);
q->next = p->next;
free(p);
p = q->next;
flag = 1;
}
else if(strcmp(p->spec,spec)==0 && lesson == 2 && p->score2 < score) // cs 1 94
{
Output(p);
q->next = p->next;
free(p);
p = q->next;
flag = 1;
}
else if(strcmp(p->spec,spec)==0 && lesson == 3 && p->score3 < score) // cs 1 94
{
Output(p);
q->next = p->next;
free(p);
p = q->next;
flag = 1;
}
else
{
q = p;
p = p->next;
}
}
if(flag==0) printf("不存在此学生!\n");
else printf("成功删除\n");
FILE *w =fopen("2.txt","w");
p=H->next;
while(p)
{
fprintf(w,"%5s %-5s %-3s %s %3d %3d %3d\n",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
p = p->next;
}
fclose (w);
Print_List(H);
}
void write(StuLink &H)//写入其他文件
{
StuLink p = H->next;
FILE *w = fopen("other.txt","w");
fprintf(w,"%s %s %s %s %s %s %s",a,b,c,d,e,f,g);
while(p)
{
fprintf(w,"\n%s %s %s %s %d %d %d",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
p = p->next;
}
fclose(w);
printf("写入成功!");
}
char menu()
{
char ch1;
printf(" \t\t\t\t 欢迎访问学生信息登记系统! \n");
printf("\t\t\t ___________________________________________________________\n");
printf("\t\t\t\t\t 1 Creatlist 写入信息创建链表并倒序输出\n");
printf("\t\t\t\t\t 2 Output 输出全部信息\n");
printf("\t\t\t\t\t 3 save 保存文件\n");
printf("\t\t\t\t\t 4 Fetch 随机读取\n");
printf("\t\t\t\t\t 5 Search num 指定查找\n");
printf("\t\t\t\t\t 6 Insertlist 添加信息 \n");
printf("\t\t\t\t\t 7 Delete num 指定删除\n");
printf("\t\t\t\t\t 8 Search_major _subject_score 特殊查找\n");
printf("\t\t\t\t\t 9 Delete_major _subject_score 特殊删除\n");
printf("\t\t\t\t\t 10 Exit 退出系统\n");
printf("\t\t\t ___________________________________________________________\n");
}
void read(StuLink &head)//读取文件函数
{
StuLink p = (student*)malloc(sizeof(student)),q = head->next;
char grad[10],name[10],spec[10],stu_class[10];
int score1,score2,score3;
FILE *w =fopen("2.txt","a");
if(w==NULL)
{
printf("打开文件失败!\n");
return;
}
else
{
StuLink p = head->next;
while(p)
{
Output(p);
p = p->next;
}
printf("输出成功!\n");
fprintf(w,"\n%s %s %s %s %d %d %d",p->grad,p->name,p->spec,p->stu_class,p->score1,p->score2,p->score3);
}
fclose(w);
//存入链表
}
int main()
{
StuLink H = CreateList(),temp;
int k;
menu();
scanf("%d",&k);
k = int(k);
while(k)
{
k = int(k);
switch(k)
{
case 0:
break;
case 1:
{
StuLink head = (student*)malloc(sizeof(student));
StuLink p,q;
p = head;
q = head;
char grad[10];//学号
char name[10];//姓名
char spec[10];//专业
char stu_class[10];//班级
int score1;
int score2;
int score3;
FILE *r= fopen("2.txt","r");
if(r==NULL)
{
printf("打开文件失败!");
}
fscanf(r,"%s%s%s%s%s%s%s",&a,&b,&c,&d,&e,&f,&g);//读取标题
while(fscanf(r,"%s%s%s%s%d%d%d",grad,name,spec,stu_class,&score1,&score2,&score3)!=EOF)
{
q = (student*)malloc(sizeof(student));
strcpy(q->grad,grad);
strcpy(q->name,name);
strcpy(q->spec,spec);
strcpy(q->stu_class,stu_class);
q->score1 = score1;
q->score2 = score2;
q->score3 = score3;
p->next = q;
p = q;
length++;
}
p->next = NULL;
Sort(head);
StuLink k = head,t;
while(k->next)
k = k->next;
printf("倒序输出:\n 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
while(k!=head)
{ //倒序输出
t = head;
while(t->next!=k)
t = t->next;//t为k前驱
Output(k);
k = t;
}
}
menu();
break;
case 2:
Print_List(H);
menu();
break;
case 3:
Save(H);
menu();
break;
case 4:
Fetch(H);
menu();
break;
case 5:
temp = Search_num(H);
if(temp)
{
printf("指针为:%d\n",temp);
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
Output(temp);
}
else
printf("不存在此学生!\n");
menu();
break;
case 6:
InsertList(H);
menu();
break;
case 7:
Delete_num(H);
menu();
break;
case 8:
temp = Search_major_subject_score(H);
if(temp)
{
printf("指针为:%d\n",temp);
printf(" 学号 姓名 专业 班级 成绩1 成绩2 成绩3\n");
Output(temp);
}
else
printf("不存在此学生!\n");
menu();
break;
case 9:
Delete_major_subject(H);
menu();
break;
case 99:
read(H);
menu();
break;
case 10:
printf("\n ~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); //退出提示
printf(" Goodbye! \n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
exit(0);//将程序退出
default:
printf("输入有误,请重新输入!\n");
}
printf("请输入选项:");
scanf("%d",&k);
}
return 0;
}