C语言学生学籍管理系统 链表+存储数据到文档

有勇气的牛排
官方地址:https://www.couragesteak.com/

基本原理:利用链表和文件读写实现具有永久存储数据的系统

文件命名:StudentSystem.cpp

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h> 

//创建结构体
struct students
{
	int id;
	char name[60];
	char address[60];
};

//创建链表

struct node
{
	struct students data;
	struct node *next;
};

struct node *create_students();
void print_students(struct node *h);
void sort_students(struct node *h);
void modify_students(struct node *h);
void delete_students(struct node *h);
void menu();

main(){
	struct node *h=NULL;
	system("mode con cols=100 lines=30");
	int x,i=1;

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_INTENSITY);  
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY); 

	do{
		menu();

		printf("                                    请输入您的选择:");
		scanf("%d",&x);
		switch (x)
		{
		case 1:h=create_students();break;
		case 2:print_students(h);break;
		case 3:sort_students(h);break;
		case 4:modify_students(h);break;
		case 5:delete_students(h);break;
		case 6:printf("欢迎下次访问,再见!!!\n");exit(0);break;
		}
	}while(x!=5);

	
	return 0;
}

//菜单

void menu(){
	printf("\n\n\n  **************************************学生学籍信息管理系统**************************************  \n\n");
	printf("  *                                                                                              * \n\n");
	printf("  *                                                                                              * \n\n");
	printf("  *                                1--- 学生学籍信息录入 ---                                     * \n\n");
	printf("  *                                2---   查看学生信息   ---                                     * \n\n");
	printf("  *                                3---   学生学籍排序   ---                                     * \n\n");
	printf("  *                                4---   修改学生信息   ---                                     * \n\n");
	printf("  *                                5---   删除学生信息   ---                                     * \n\n");
	printf("  *                                6---    退出系统      ---                                     * \n\n\n\n");
	printf("  ************************************************************************************************ \n\n\n\n");

}

//一、输入学生学籍信息
struct node *create_students()
{
	
	FILE *fp;
	int x,m=1;
	char nam[60],a[60];
	struct node *h,*p,*q,*n;

	system("cls");

	printf("\n\n\n\n\n\n\n\n\n\n\n\n");
	printf("                               请输入第%d位学生id(输入-1结束):",m);
	scanf("%d",&x);
	getchar();
	if(x!=-1)
	{
		printf("                               姓名:");
		gets(nam);

		printf("                               地址:");
		gets(a);
	}


	
	if(x!=-1)
	{
		h=(struct node*)malloc(sizeof(struct node));
		h->data.id=x;
		strcpy(h->data.name,nam);
		strcpy(h->data.address,a);
		h->next=NULL;

		p=h;
		n=p;

	}
	while(x!=-1)
	{
		m++;
		printf("                               请输入第%d位学生id(输入-1结束):",m);
		scanf("%d",&x);
		getchar();

		if(x!=-1)
		{
			printf("                               姓名:");
			gets(nam);
	
			printf("                               地址:");
			gets(a);
		}

		if(x!=-1)
		{
			q=(struct node*)malloc(sizeof(struct node));
			q->data.id=x;
			strcpy(q->data.name,nam);
			strcpy(q->data.address,a);
			q->next=NULL;

			p->next=q;
			p=p->next;
		}		
	}

	//printf("========打印r链表=========\n");
	//printf("测试%d\n",n->data.id);
	//while(n!=NULL){
	//	printf("%d %s %s\n",n->data.id,n->data.name,n->data.address);
	//	n=n->next;
	//}
	//printf("========打印r链表结束=========\n");

	//存档
	//n=n->next;
	fp=fopen("book.txt","a");
	if(fp==NULL)
	{
		printf("文件打开失败\n");
		exit(1);
	}

	//fprintf(fp,"\n");
	while(n!=NULL)
	{
		fprintf(fp,"%-20d %-20s %-20s\n",n->data.id,n->data.name,n->data.address);
		n=n->next;
	}
	fclose(fp);
	


	
	return h;
}

//二、输出所有学生信息
void print_students(struct node *h)
{
	h=(struct node*)malloc(sizeof(struct node));
	FILE *fp;
	struct node *p,*q,*r;

	system("cls");

	p=h;

	int id,i=1,j=1,ok;//统计人数  j,k用排序
	char name_stu[60],address_stu[60];
	fp=fopen("book.txt","r");
	if(fp==NULL)
	{
		printf("文件打开失败");
	}else{
		printf("文件打开成功\n");
		while(fscanf(fp," %d %s %s",&id,name_stu,address_stu)!=EOF)
		{
			//printf("\n");
			//printf("---第%d次循环\n",i);
			//i++;

			q=(struct node*)malloc(sizeof(struct node));
			//printf("内存申请成功\n");
			
			strcpy(q->data.name,name_stu);
			//printf("%s  ",q->data.name);

			strcpy(q->data.address,address_stu);
			//printf("%s  ",q->data.address);

			q->data.id=id;
			//printf("%d\n",q->data.id);

			//printf("------------------------\n");
			
			q->next=NULL;
			p->next=q;
			p=p->next;

			//p->next=q;
			//p=q;

		}
		
	}
	//p->next=NULL;
	fclose(fp);
	
	r=h;
	r=r->next;
	printf("序号   学号   姓名   地址\n");
	while(r!=NULL){
		printf("%d:",j);
		j++;

		printf("       %d     %s     %s\n",r->data.id,r->data.name,r->data.address);
		r=r->next;
	
	}
	
	printf("输入1查看结束:");
	scanf("%d",&ok);
	if(ok==1)
	{
		system("cls");
		menu();
	}

}

//三、排序功能   思路:读取--修改--保存
void sort_students(struct node *h)
{
	system("cls");

	//1.读取
	h=(struct node*)malloc(sizeof(struct node));
	FILE *fp;
	struct node *p,*q,*r,*n;

	p=h;
	//q=h;
	int id,i=0,sort,j,k,x;//x用于排序暂时存储
	char name_stu[60],address_stu[60],s_name[60],s_address[60];
	fp=fopen("book.txt","r");
	if(fp==NULL)
	{
		printf("文件打开失败");
	}else{
		//printf("文件打开成功\n");
		while(fscanf(fp," %d %s %s",&id,name_stu,address_stu)!=EOF)
		{
			//printf("\n");
			//printf("---第%d次循环\n",i);
			i++;

			q=(struct node*)malloc(sizeof(struct node));
			//printf("内存申请成功\n");
			
			strcpy(q->data.name,name_stu);
			//printf("%s  ",q->data.name);

			strcpy(q->data.address,address_stu);
			//printf("%s  ",q->data.address);

			q->data.id=id;
			//printf("%d\n",q->data.id);

			//printf("------------------------\n");
			
			q->next=NULL;
			p->next=q;
			p=p->next;

		}
		
	}

	fclose(fp);
	
	//2.修改----->>实现排序

	r=h;	//r为主链表
	r=r->next;
	n=r;
	q=r->next;
	printf("%d",r->data.id);
	printf("%d",q->data.id);

	//printf("总长度为:%d\n",i);


	while(true)
	{
		printf("\n\n\n\n\n\n\n\n\n\n\n\n");
		printf("                               从小到大排序请按1,从大到小排序请按0:");
		scanf("%d",&sort);

		if(sort==0 || sort==1){
			break;
		}else{
			printf("您的输入有误");	
		}
	}
	//printf("判断成功\n");
	

	//printf("333%d\n",r->data.id);
	//printf("333%d\n",q->data.id);

	//从小到大排序
	if(sort==1){
		//printf("-----从小到大排序-----\n");
		for(j=0;j<i-1;j++)
		//while(r!=NULL)
		{
			//printf("=========%d==\n",r->data.id);
			for(k=j+1;k<i;k++)
			//while(q!=NULL)
			{
				//printf("--%d-\n",q->data.id);
				if((r->data.id)>(q->data.id))
				{
					x=r->data.id;
					strcpy(s_name,r->data.name);
					strcpy(s_address,r->data.address);

					r->data.id=q->data.id;
					strcpy(r->data.name,q->data.name);
					strcpy(r->data.address,q->data.address);
					
					q->data.id=x;
					strcpy(q->data.name,s_name);
					strcpy(q->data.address,s_address);

				
				}
				q=q->next;
			
			}
			r=r->next;
			q=r->next;
		}
		printf("排序成功\n");
	}



	//从大到小排序
	if(sort==0){
		printf("-----从大到小排序-----\n");
		for(j=0;j<i-1;j++)
		//while(r!=NULL)
		{
			//printf("=========%d==\n",r->data.id);
			for(k=j+1;k<i;k++)
			//while(q!=NULL)
			{
				//printf("--%d-\n",q->data.id);
				if((r->data.id)<(q->data.id))
				{
					//x=r->data.id;
					//r->data.id=q->data.id;
					//q->data.id=x;
					x=r->data.id;
					strcpy(s_name,r->data.name);
					strcpy(s_address,r->data.address);

					r->data.id=q->data.id;
					strcpy(r->data.name,q->data.name);
					strcpy(r->data.address,q->data.address);
					
					q->data.id=x;
					strcpy(q->data.name,s_name);
					strcpy(q->data.address,s_address);
				
				}
				q=q->next;
			
			}
			r=r->next;
			q=r->next;
		}
		printf("排序成功\n");
	}

	
	//printf("========打印r链表=========\n");
	//n=r;
	//printf("测试%d\n",n->data.id);
	//while(n!=NULL){
	//	printf("%d %s %s\n",n->data.id,n->data.name,n->data.address);
	//	n=n->next;
	//}
	//printf("========打印r链表结束=========\n");
	
	//排序存档
	//FILE *fp;
	fp=fopen("book.txt","w");
	if(fp==NULL)
	{
		printf("文件打开失败\n");
		exit(1);
	}

	//fprintf(fp,"\n");
	while(n!=NULL)
	{
		fprintf(fp,"%-20d %-20s %-20s\n",n->data.id,n->data.name,n->data.address);
		n=n->next;
	}
	fclose(fp);

}



//四、===========修改学生信息======
void modify_students(struct node *h)
{

	system("cls");

	//变量
	int searchId,x,NewId;// x:选项 searchId:按学号搜  n:新学号 
	char NewName[60],NewAddress[60];


	//1.读取文件,并将内容重新放到结构体p中
	int id;
	char name_stu[60],address_stu[60],s_name[60],s_address[60];
	h=(struct node*)malloc(sizeof(struct node));
	FILE *fp;
	struct node *p,*q,*r,*n;
	p=h;
	r=p;
	n=p;
	fp=fopen("book.txt","r");
	if(fp==NULL)
	{
		printf("文件打开失败");
	}else{
		//printf("文件打开成功\n");
		while(fscanf(fp," %d %s %s",&id,name_stu,address_stu)!=EOF)
		{

			q=(struct node*)malloc(sizeof(struct node));
			strcpy(q->data.name,name_stu);
			strcpy(q->data.address,address_stu);
			q->data.id=id;
			q->next=NULL;
			p->next=q;
			p=p->next;
		}
	}

	fclose(fp);
	//printf("结束\n\n");

	//2.找到对应学生
	printf("\n\n\n\n\n\n\n\n\n\n\n\n");
	printf("                               请输入您所要修改学生的ID:");
	scanf("%d",&searchId);
	printf("您将选择ID为%d的学生!!!\n",searchId);

	
	r=r->next;
	while(r!=NULL)
	{
		if(searchId==r->data.id){
			//初始化变量
			NewId=r->data.id;
			strcpy(NewName,r->data.name);
			strcpy(NewAddress,r->data.address);
			

			printf(">>>>>>>>>>>>%s\n",r->data.name);
			printf(">>>>>>>>>>>>%s\n",r->data.address);

			while(true)
			{
				printf("                               请输入您要改的项目(1:学号、2:姓名、3:地址、-1:确认修改):");
				scanf("%d",&x);
				getchar();

				//获取新学号
				if(x==1){
					printf("                               请输入新学号:");
					scanf("%d",&NewId);
					getchar();
					printf("\n+++++++++%d\n",NewId);
				}

				//获取新姓名
				if(x==2){
					printf("                               请输入新姓名:");
					gets(NewName);
					printf("\n+++++++++%s\n",NewName);
				}

				//获取新地址
				if(x==3){
					printf("请输入新地址:");
					gets(NewAddress);
					printf("\n+++++++++%s\n",NewAddress);
				}

				//确认修改
				if(x==-1){
					break;
				}
			}
			
			//确认修改信息
			r->data.id=NewId;
			strcpy(r->data.name,NewName);
			strcpy(r->data.address,NewAddress);
			
			printf("修改成功!!!\n新学号为:%d 新姓名为:%s 新地址为:%s\n",r->data.id,r->data.name,r->data.address);
	
			
			break;
		}
		r=r->next;
	}

	//存档
	n=n->next;
	fp=fopen("book.txt","w");
	if(fp==NULL)
	{
		printf("文件打开失败\n");
		exit(1);
	}

	//fprintf(fp,"\n");
	while(n!=NULL)
	{
		fprintf(fp,"%-20d %-20s %-20s\n",n->data.id,n->data.name,n->data.address);
		n=n->next;
	}
	fclose(fp);
}


//五、删除指定学生信息
void delete_students(struct node *h)
{

	system("cls");

	//变量
	int searchId;// x:选项 searchId:按学号搜

	//1.读取文件,并将内容重新放到结构体p中
	int id;
	char name_stu[60],address_stu[60],s_name[60],s_address[60];
	h=(struct node*)malloc(sizeof(struct node));
	FILE *fp;
	struct node *p,*q,*r,*m,*n,*k;//m:用来切割节点保存前一个节点
	p=h;

	r=p;//查询指针
	m=p;//
	n=r;//存数据指针

	fp=fopen("book.txt","r");
	if(fp==NULL)
	{
		printf("文件打开失败");
	}else{
		//printf("文件打开成功\n");
		while(fscanf(fp," %d %s %s",&id,name_stu,address_stu)!=EOF)
		{

			q=(struct node*)malloc(sizeof(struct node));
			strcpy(q->data.name,name_stu);
			strcpy(q->data.address,address_stu);
			q->data.id=id;
			q->next=NULL;
			p->next=q;
			p=p->next;
		}
	}

	fclose(fp);

	//2.找到对应学生
	printf("\n\n\n\n\n\n\n\n\n\n\n\n");
	printf("                               请输入您所要删除学生的学生号");
	scanf("%d",&searchId);
	getchar();
	//printf("您将选择ID为%d的学生!!!\n",searchId);
	
	//r=r->next;
	//m=r->next;
	while(r->next!=NULL)
	{
		//printf("%d  ",r->data.id);
		//printf("%d  \n",m->data.id);

		k=r;
		r=r->next;
		
		if(searchId==r->data.id)
		{
			//printf("YYYYYYYYYYYYYYYYYYY");
		
			k->next=r->next;
			free(r);
			r=k->next;
				break;
		}
	}
	printf("                               删除成功\n");

	//输出r链表  测试是否修改成功  为存档做准备
	//n=n->next;
	//printf("========打印r链表=========\n");
	//printf("测试%d\n",n->data.id);
	
	//while(n!=NULL){
	//	printf("%d %s %s\n",n->data.id,n->data.name,n->data.address);
	//	n=n->next;
	//}
	//printf("========打印r链表结束=========\n");
	

	//存档
	n=n->next;
	fp=fopen("book.txt","w");
	if(fp==NULL)
	{
		printf("文件打开失败\n");
		exit(1);
	}

	//fprintf(fp,"\n");
	while(n!=NULL)
	{
		fprintf(fp,"%-20d %-20s %-20s\n",n->data.id,n->data.name,n->data.address);
		n=n->next;
	}
	fclose(fp);
	
	main();
	//==扣扣群聊172842597==
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

有勇气的牛排

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

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

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

打赏作者

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

抵扣说明:

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

余额充值