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

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

  1. 事先存入的数据:

  1. 菜单

  1. 创建链表并倒序输出

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

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

 

  1. 随机读取

 

  1. 指定查找

  1. 添加信息

  1. 指定删除

 

  1. 特殊查找

 

  1. 特殊删除

  1. 退出系统

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

  • 3
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起剑倒悬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值