C语言程序设计实训(链表实现学生信息管理系统)

C语言程序设计实训(链表实现学生信息管理系统),第1张

源码置于文末(原创,如取用请点个赞) 

  1. 事先存入的数据:

  1. 菜单

  1. 创建链表并倒序输出

  1. 输出链表中的全部信息

  1. 写入信息并保存至文件中(覆盖原有文件)

 

  1. 随机读取

 

  1. 指定查找

  1. 添加信息

  1. 指定删除

 

  1. 特殊查找

 

  1. 特殊删除

  1. 退出系统

#include
#include
#include
#include
#include
#include
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->score1score2score3next; } 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; }

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/569489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存