C语言实现文件存取信息的学生管理系统1)使用结构体建立学生信息体制 2)实现五大基本功能 3)采用文件存储学生信息 4)系统采用菜单的方式工作

运行条件:
需要建立一个名字为1文件在D盘中,fp=fopen(“D:\1.txt”,“w+”);
在控制台输入的信息会自动记入到该文件中,缺点是无法对文件本身进行操作改变信息,不稳定,优点是使用链表结构,可以存储数量未知的学生信息 ,退出时会释放空间。

总体概况:
1)使用结构体建立学生信息体制
2)实现五大基本功能
3)采用文件存储学生信息
4)系统采用菜单的方式工作

功能概述:
1)查询学生信息  按学号或姓名查询
2)添加学生信息
3)修改学生信息
4)删除学生信息
5)对学生按照学号排序并输出其信息

建立文件并记录信息

void BuildFile(node* head);/*建立文件基本信息*/

输入n个学生信息

node* Input(int n);/*输入n个学生信息*/ 

添加学生信息

node* Add(node* p);/*添加学生信息*/

寻找学生信息

node* Search(node* p);/*寻找学生信息*/ 

修改学生信息

node* Change(node* p);/*修改学生信息*/ 

删除学生信息

node* Delete(node* p);/*删除学生信息*/ 

根据学号排序

node* Order(node* p);/*根据学生学号排序*/ 

关闭,清空,退出

void Close(node* p);/*关闭*/

显示菜单

void Menu();/*显示菜单*/

显示其他

void Show()/*显示其他*/

以下是源代码

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

#define N 30

typedef struct Student node; //利用链表结构存储学生信息 
struct Student
{
    
    /*数据域*/ 
	int num;//学号
	char name[20];//姓名
	char sex[10];//性别 
	int age;//年龄 
 /*指针域*/	
    node* next;//指向下一个学生 	
};

FILE *fp; 

/*建立文件基本信息*/
void BuildFile(node* head)
{
    
    
	node* p = head;
	
	fp=fopen("D:\\1.txt","w+");
	if(!fp)
	{
    
    
		printf("文 件 打 开 失 败!");
		exit(0);
	}
	
	fprintf(fp,"%s\n","=====学生个人信息====="); 
	while(p){
    
    
		fprintf(fp,"%s\n","----------------------------");
		fprintf(fp,"%s%15d\n%s%15s\n%s%15s\n%s%15d\n","学号:",p->num,"姓名:",p->name,"性别:",p->sex,"年龄:",p->age);
	    p = p->next;
	}
    
	fclose(fp);
	printf("\n文 件 成 功 建 立 !!!\n");

}


	
/*输入n个学生信息*/ 
node* Input(int n)
{
    
    
	node* p = NULL;
	node* head =NULL; 
	int i = 1; 
		
	printf("<请在下面输入学生基本信息>\n");
    while(i <= n)
	{
    
     
	    printf("------------------------------------\n");
	    if(!head){
    
    
  		    head = p =(node *)malloc(sizeof(struct Student)); 
            
			/*输入学生基本信息*/
			printf("输入学生学号:\t");
            scanf("%d",&p->num); 
			printf("输入学生姓名:\t");
			scanf("%s", p->name);
			printf("输入学生性别:\t");
			scanf("%s", p->sex);
			printf("输入学生年龄:\t");
			scanf("%d", &p->age);
	        
			
			 
			p->next = NULL; 
    	}else{
    
    	
            p->next = (node*)malloc(sizeof(struct Student));
            
            /*输入学生基本信息*/
			printf("输入学生学号:\t");
            scanf("%d",&p->next->num); 
			printf("输入学生姓名:\t");
			scanf("%s", p->next->name);
			printf("输入学生性别:\t");
			scanf("%s", p->next->sex);
			printf("输入学生年龄:\t");
			scanf("%d", &p->next->age);
            
            p->next->next = NULL;
            p = p->next;
	    }
    	++i;
	} 
	BuildFile(head);
    return head; 
}

/*添加学生信息*/ 
node* Add(node* p)
{
    
     
    system("cls");
    int n;
	node* head = p;
	if(!p){
    
    
		return NULL;
	}
	printf("请输入添加几个学生的信息:\t"); 
	scanf("%d",&n);
	while(n>0){
    
    
		if(p->next==NULL){
    
    
			printf("\n");
			p->next = (node*)malloc(sizeof(struct Student));
            
            /*输入学生基本信息*/
			printf("输入学生学号:\t");
            scanf("%d",&p->next->num); 
			printf("输入学生姓名:\t");
			scanf("%s", p->next->name);
			printf("输入学生性别:\t");
			scanf("%s", p->next->sex);
			printf("输入学生年龄:\t");
			scanf("%d", &p->next->age);
            
            p->next->next = NULL;
			n--;//次数减一 
		}
		p = p->next; 
	}
	
	BuildFile(head);
	return head; 
}

/*寻找学生信息*/ 
node* Search(node* p)
{
    
    
	if(!p){
    
    
		return NULL;
	}
	
	char n[N];//一个汉字占俩个字节 
	printf("\n请输入查询的方式(选择输入:学号或姓名):\t");
	scanf("%s", n);
	
	int k;//n下岗了 
	node* p1 = p;//老工具人1号 
	node* p2 = p; //老工具人2号 
	
	if(strcmp(n,"学号")==0){
    
    
		printf("\n请输入您需要查找的学生学号:\t");
		scanf("%d", &k); 
		while(p1){
    
    
			if(p1->num==k){
    
    
		           printf("\n------------------------------------\n");
			       printf("学生学号:%5d\n",p1->num);
			       printf("学生姓名:%5s\n",p1->name);
			       printf("学生性别:%5s\n",p1->sex);
			       printf("学生年龄:%5d\n",p1->age);
			       printf("\n");
			       return p;
			} 
			p1 = p1->next;
		} 
	}
	
	char bb[N];
	if(strcmp(n,"姓名")==0){
    
    
		printf("\n请输入您需要查找的学生姓名:\t");
		scanf("%s", bb); 
		while(p2){
    
    
		    if(strcmp(p2->name, bb)==0){
    
    
    			   printf("\n------------------------------------\n");
			       printf("学生学号:%5d\n",p2->num);
			       printf("学生姓名:%5s\n",p2->name);
			       printf("学生性别:%5s\n",p2->sex);
			       printf("学生年龄:%5d\n",p2->age);
			       printf("\n");
		       	   return p;
    		}
			p2 = p2->next;
		} 	
	} 
    
} 

/*修改学生信息*/ 
node* Change(node* p)
{
    
    
	node* p1 = (node*)malloc(sizeof(node));//头结点 
	p1->next = p;
	
	if(!p){
    
    
		return NULL; 
	}
	
	int n;
	node *p2, *p3;//p2尾随p,而p3在需要改的结点处保存p 
	p2 = p1;
	printf("\n请输入您需要修改学生的信息的学号:\t");
	scanf("%d", &n);
	 
	while(p){
    
    
		if(p->num==n){
    
    
			node* p4=(node*)malloc(sizeof(node));
			p3 = p;
			p4->next = p->next;  
			p = p4;
			p2->next = p;
			p3->next = NULL;
			free(p3);
			
			printf("\n------------------------------------\n");
			/*输入修改的学生信息*/
			printf("输入修改后的学生学号:\t");
            scanf("%d",&p->num); 
			printf("输入修改后的学生姓名:\t");
			scanf("%s", p->name);
			printf("输入修改后的学生性别:\t");
			scanf("%s", p->sex);
			printf("输入修改后的学生年龄:\t");
			scanf("%d", &p->age);
			printf("\n");
			
			node* head;
			head = p1->next;//保存 
			free(p1);
			BuildFile(head);
			return head; 
		}
		p = p->next;
		p2 = p2->next;
	}

}

/*删除学生信息*/ 
node* Delete(node* p)
{
    
    
	node* head = p;
	if(!p||p->next==NULL){
    
    
		return NULL;
	}
	int n; 
	printf("\n请输入您要删除的学生信息的学号:\t");
	scanf("%d", &n); 
	while(1){
    
    
		if(p->num==n){
    
    //头节点数据与其相等 
			head = p->next;
			free(p); 
			BuildFile(head);
			return head;	
		}
		else if(p->next->num==n){
    
    //其他结点数据与其相等
		    node* h = p->next;//保存需要删除的节点位置 
		    p->next = p->next->next; 
            h->next = NULL;
            free(h);
           	BuildFile(head);
			return head;
		}
		if(p->next->next==NULL){
    
    //都没找到 
			return NULL;
		}
		p = p->next;
	}
	
}

/*根据学生学号排序*/ 
node* Order(node* p)
{
    
    
	system("cls");
	node* head;
	node* p1 = p;//计算长度 
	node* p2 = (node*)malloc(sizeof(node));//空结点 
	p2->next = p; 
	head = p2;//保存空结点 
	if(!p){
    
    
		return NULL; 
	}
	/*计算出元素个数*/
	int count = 0;
	while(p1){
    
    
		count++; 
		p1 = p1->next;
	} 
	/*选择排序法*/ 
	for(int i=1; i<count; i++){
    
    
		for(int j=1; j<count+1-i; j++){
    
    
	       		if(p->num > p->next->num){
    
    
		       		p2->next = p->next;
					p->next = p2->next->next;
					p2->next->next = p;
					p2 = p2->next;     
		       	}
		       	else{
    
    
	       			p2 = p2->next;
	       			p = p->next;
	       		}
		}
		p2 = head;
		p = head->next;
	} 
	
	/*输出学生全部数据*/
	node* p3 = head->next;//用来输出学生数据 
    while(p3){
    
    
    	    printf("------------------------------------\n");
			printf("学生学号:%5d\n",p3->num);
			printf("学生姓名:%5s\n",p3->name);
			printf("学生性别:%5s\n",p3->sex);
			printf("学生年龄:%5d\n",p3->age);
    	p3 = p3->next;
    }
     node* p4 = head->next;
     free(head);
   	 BuildFile(p4);
	 return p4;
}

/*关闭*/
void Close(node* p)
{
    
    
	node* head;
    while(p){
    
        //释放全部空间 
 		 head = p;
 		 p = p->next;
 		 free(head);
 	} 
	exit(0); 	
}

/*显示菜单*/
void Menu()
{
    
    
	    printf("================================主菜单================================\n");
		printf("1,添加学生信息 \n");
	    printf("2,查询学生信息 (按学号或姓名查询) \n");
	    printf("3,修改学生信息\n");
	    printf("4,删除学生信息\n");
	    printf("5,对学生按照学号排序并输出其信息 \n");
		printf("======================================================================\n");
 	   
} 

/*显示其他*/ 
void Show()
{
    
    
	    /*首先进行输入学生信息操作*/ 
     int n;
     printf("请输入您需要输入几个学生的信息:\t"); 
     scanf("%d",&n);   
	 node *p = Input(n);
     printf("\n");
    
     
	 /*显示主菜单*/
	while (1)
	{
    
    
        getchar();//吸收换行符 
	    Menu();
        printf("本程序实现五大功能,您可以选择哪个功能(1~5)或者按空格+Enter退出:\t");
        char ch = getchar();
		
		switch (ch)
		{
    
    
	     	case '1': 
			      p = Add(p);break;
		    case '2':
		          p = Search(p);break; 
			case '3':
                  p = Change(p);break;
			case '4':
			      p = Delete(p);break;
			case '5':
			      p = Order(p);break;
			case ' ':
			      Close(p);
		    default:
			      printf("\n数据错误!!!\n"); 
	              break;

		}
        printf("\n");
	}	
        
}
 
/*吃干饭的*/ 
int main()
{
    
        
	Show(); 
	return 0;
}
 

以下为改良版

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 30

typedef struct Student node; //利用链表结构存储学生信息 
struct Student
{
    
    /*数据域*/ 
	int num;//学号
	char name[20];//姓名
	char sex[10];//性别 
	int age;//年龄 
 /*指针域*/	
    node* next;//指向下一个学生 
	node* previous;//指向上一个学生	
};

FILE *fp; 

/*建立文件基本信息*/
void BuildFile(node* head)
{
    
    
	node* p = head;
	
	fp=fopen("D:\\1.txt","w+");
	if(!fp)
	{
    
    
		printf("文 件 打 开 失 败!");
		exit(0);
	}
	if(!p){
    
    
		printf("\n文 件 已 清 空 !\n");
		fclose(fp); 
	}
	if(p){
    
    
	fprintf(fp,"%s\n","=====学生个人信息====="); 
	while(p){
    
    
		fprintf(fp,"%s\n","----------------------------");
		fprintf(fp,"%s%15d\n%s%15s\n%s%15s\n%s%15d\n","学号:",p->num,"姓名:",p->name,"性别:",p->sex,"年龄:",p->age);
	    p = p->next;
	    }
	   fclose(fp);
       printf("\n文 件 成 功 建 立 !!!\n"); 
	}
    
}

/*主菜单*/
void show()
{
    
    
	    printf("================================主菜单================================\n");
		printf("1,添加学生信息 \n");
	    printf("2,查询学生信息 (按学号或姓名查询) \n");
	    printf("3,修改学生信息\n");
	    printf("4,删除学生信息\n");
        printf("5,对学生按照学号排序并输出其信息 \n");
        printf("6,          退    出               \n"); 
		printf("======================================================================\n");	
}

/*输入n个学生信息*/ 
node* Input(int n)
{
    
    
   
	node* p = NULL;
	node* head =NULL; 
	int i = 1; 

    while(i <= n)
	{
    
     
	    printf("------------------------------------\n");
	    if(!head){
    
    
  		    head = p =(node *)malloc(sizeof(struct Student)); 
            
			/*输入学生基本信息*/
			printf("输入学生学号:\t");
            scanf("%d",&p->num); 
			printf("输入学生姓名:\t");
			scanf("%s", p->name);
			printf("输入学生性别:\t");
			scanf("%s", p->sex);
			printf("输入学生年龄:\t");
			scanf("%d", &p->age);
			
			p->previous = NULL;	 
			p->next = NULL; 
    	}else{
    
    	
            p->next = (node*)malloc(sizeof(struct Student));
            
            /*输入学生基本信息*/
			printf("输入学生学号:\t");
            scanf("%d",&p->next->num); 
			printf("输入学生姓名:\t");
			scanf("%s", p->next->name);
			printf("输入学生性别:\t");
			scanf("%s", p->next->sex);
			printf("输入学生年龄:\t");
			scanf("%d", &p->next->age);
            
            p->next->next = NULL;
            p->next->previous = p; //指向自己 
            p = p->next;
	    }
    	++i;
	} 
	BuildFile(head); 
    return head; 
}

/*添加学生信息*/ 
node* Add(node* p)
{
    
     
    system("cls");
    show();
    
    int n;
   	printf("\n请输入添加几个学生的信息:\t"); 
	scanf("%d",&n);
	
    if(p==NULL){
    
    //再次调用 
       node* p = Input(n);
	   return p;	
    }
    
	node* head = p;
	   

	while(n>0){
    
    
		if(p->next==NULL){
    
    
	
			p->next = (node*)malloc(sizeof(struct Student));
            
            /*输入学生基本信息*/
			printf("\n输入学生学号:\t");
            scanf("%d",&p->next->num); 
			printf("输入学生姓名:\t");
			scanf("%s", p->next->name);
			printf("输入学生性别:\t");
			scanf("%s", p->next->sex);
			printf("输入学生年龄:\t");
			scanf("%d", &p->next->age);
            
            p->next->next = NULL;
            p->next->previous = p;  
			n--;//次数减一 
		}
		p = p->next; 
	}
	BuildFile(head);
	return head; 	
}

/*寻找学生信息*/ 
node* Search(node* p)
{
    
    
    system("cls");
	show();
	if(!p){
    
    
		printf("\n无 法 查 询!\n");
		return NULL;
	}
	
	int k;//n下岗了 
	node* p1 = p;
	node* p2 = p; 
    char n[N];//一个汉字占俩个字节 
	printf("\n请输入查询的方式(选择输入:学号或姓名):\t");
	scanf("%s", n);
	
	if(strcmp(n,"学号")==0){
    
    
		printf("\n请输入您需要查找的学生学号:\t");
		scanf("%d", &k); 
		while(p1){
    
    
			if(p1->num==k){
    
    
		           printf("\n------------------------------------\n");
			       printf("学生学号:%5d\n学生姓名:%5s\n学生性别:%5s\n学生年龄:%5d\n\n",p1->num,p1->name,p1->sex,p1->age);
			       printf("\n查 询 成 功 !\n"); 
			       return p;
			} 
			p1 = p1->next;
		} 
	}
	
	char b[N];
	if(strcmp(n,"姓名")==0){
    
    
		printf("\n请输入您需要查找的学生姓名:\t");
		scanf("%s", b); 
		while(p2){
    
    
		    if(strcmp(p2->name, b)==0){
    
    
    			   printf("\n------------------------------------\n");
			       printf("学生学号:%5d\n学生姓名:%5s\n学生性别:%5s\n学生年龄:%5d\n\n",p1->num,p1->name,p1->sex,p1->age);
			       printf("\n查 询 成 功 !\n"); 
		       	   return p;
    		}
			p2 = p2->next;
		} 	
	} 	
		printf("\n查 无 此 人 !\n");
		return p;
} 

/*修改学生信息*/ 
node* Change(node* p)
{
    
    
    system("cls");
	show();
	
	if(!p){
    
    
		printf("\n无 法 修 改 !\n");
		return NULL; 
	}
	
	node* head = (node*)malloc(sizeof(node));//头结点 
	 
	head->next = p;
	head->previous = NULL; 
	p->previous = head; 
	
	int n;
	node *p3;//p3在需要改的节点处保存p 
	printf("\n请输入您需要修改学生的信息的学号:\t");
	scanf("%d", &n);
	 
	while(p){
    
    
		if(p->num==n&&p->next!=NULL){
    
    
			node* p4=(node*)malloc(sizeof(node));
			p->previous->next = p4;
			p4->previous = p->previous;
			p4->next = p->next;
			p->next->previous = p4;
			p->next = NULL;
			p->previous = NULL;
			free(p);
	
			printf("\n------------------------------------\n");
			/*输入修改的学生信息*/
			printf("输入修改后的学生学号:\t");
            scanf("%d",&p4->num); 
			printf("输入修改后的学生姓名:\t");
			scanf("%s", p4->name);
			printf("输入修改后的学生性别:\t");
			scanf("%s", p4->sex);
			printf("输入修改后的学生年龄:\t");
			scanf("%d", &p4->age);
			printf("\n");
			
			node* head_x;
			head_x = head->next;//保存
			head_x->previous = NULL;
			head->next = NULL; 
			free(head);
			printf("\n修 改 成 功 !\n");
			BuildFile(head_x);
			return head_x;
		}
		else if(p->num==n&&p->next==NULL){
    
    //最后一个 
		    node* p4=(node*)malloc(sizeof(node));
			p4->previous = p->previous;
			p->previous->next = p4;
			p->previous = NULL;
			free(p);
			
			printf("\n------------------------------------\n");
			/*输入修改的学生信息*/
			printf("输入修改后的学生学号:\t");
            scanf("%d",&p4->num); 
			printf("输入修改后的学生姓名:\t");
			scanf("%s", p4->name);
			printf("输入修改后的学生性别:\t");
			scanf("%s", p4->sex);
			printf("输入修改后的学生年龄:\t");
			scanf("%d", &p4->age);
			printf("\n");
			
			
			node* head_x;
			head_x = head->next;//保存
			head_x->previous = NULL;
			head->next = NULL; 
			free(head);
			printf("\n修 改 成 功 !\n");
			BuildFile(head_x);
			return head_x;
		}
		p = p->next;
	}
    
    node* head_x;
	head_x = head->next;//保存
	free(head);
	printf("\n查 无 此 人 ,无 法 修 改 !\n"); 
	return head_x;
}

/*删除学生信息*/ 
node* Delete(node* p)
{
    
    
    system("cls");
    show();
	if(!p||p->next==NULL){
    
    
		printf("删 除 成 功 !\n");
		BuildFile(NULL);
		return NULL;
	}
	
	int n;
	node* head = (node* )malloc(sizeof(node));//空的头节点 
	head->next = p;//建立联系 
	p->previous = head;
	head->previous = NULL;  
	
	
	printf("\n请输入您要删除的学生信息的学号:\t");
	scanf("%d", &n); 
	while(p){
    
    
		if(p->num==n&&p->next!=NULL){
    
    
			p->previous->next = p->next;
			p->next->previous = p->previous; 
			free(p);
			printf("\n删 除 成 功 !\n");
		    BuildFile(head->next);
			return head->next; 
		}
		else if(p->num==n&&p->next==NULL){
    
    //最后一个结点
			free(p);
			printf("\n删 除 成 功 !\n");
			BuildFile(head->next);
			return head->next; 
		} 
		p = p->next;
	}
	printf("\n删 除 失 败 !\n"); 
}

/*根据学生学号排序*/ 
node* Order(node* p)
{
    
    
	system("cls");
	show();
	if(p==NULL){
    
    //空 
	    printf("学 生 信 息 为 空,排 序 失 败!\n");
		BuildFile(NULL); 
		return NULL; 
	}
	else if(p->next==NULL){
    
    //只有一个
	printf("学生学号:%5d\n学生姓名:%5s\n学生性别:%5s\n学生年龄:%5d\n",p->num,p->name,p->sex,p->age);    
    printf("\n排 序 成 功 !\n"); 
	return p;
	}
	node* head;
	node* p1 = p;//计算长度 
	node* p2 = (node*)malloc(sizeof(node));//空节点 
	p2->next = p; 
	head = p2;//保存空节点 

	/*计算出元素个数*/
	int count = 0;
	while(p1){
    
    
		count++; 
		p1 = p1->next;
	} 
	/*选择排序法*/ 
	for(int i=1; i<count; i++){
    
    
		for(int j=1; j<count+1-i; j++){
    
    
	       		if(p->num > p->next->num){
    
    
 	                p2->next = p->next;
 	                p->next->next->previous = p;
 	                p->next = p2->next->next;
 	                p->previous = p2->next;
 	                p2->next->next = p;
				    p2->next->previous = p2;
		       	}
		       	else{
    
    
	       			p2 = p2->next;
	       			p = p->next;
	       		}
		}
		p2 = head;
		p = head->next;
	} 
		
	/*输出学生全部数据*/
	node* p3, *p4;
    p3 = p4 = head->next;//用来输出学生数据 
    while(p3){
    
    
      printf("------------------------------------\n");
  	  printf("学生学号:%5d\n学生姓名:%5s\n学生性别:%5s\n学生年龄:%5d\n",p3->num,p3->name,p3->sex,p3->age);
   	  p3 = p3->next;
    }
     free(head);
     printf("\n排 序 成 功 !\n"); 
     BuildFile(p4);
	 return p4;
}
 
void Close(node* p)
{
    
    
	node* head;
	char b[N];
    while(p){
    
        //释放全部空间 
 		 head = p;
 		 p = p->next;
 		 free(head);
 	} 
 	printf("\n是 否 保 存 文 件 ?(选择:yes或no)\n");
 	scanf("%s", b); 
 	if(strcmp(b, "no")==0){
    
    
	 	BuildFile(NULL);
    }
	exit(0);
} 
 
int main()
{
    
        /*首先进行输入学生信息操作*/ 
     int n,choice;
     printf("请输入您需要输入几个学生的信息:\t"); 
     scanf("%d",&n);
     printf("<请在下面输入学生基本信息>\n");
	 node *p = Input(n);
     printf("\n");
	 show();
	    
	/*显示主菜单*/
	while (1)
	{
    
    
		printf("本程序实现五大功能,您可以选择哪个功能(1~5):\t");
		scanf("%d",&choice);//输入数字
		switch (choice)
		{
    
    
	     	case 1: 
			      p = Add(p);break;
		    case 2:
		          p = Search(p);break; 
			case 3:
                  p = Change(p);break;
			case 4:
			      p = Delete(p);break;
			case 5:
			      p = Order(p);break; 
		    case 6:
			      Close(p);break;		       
		    default:
			     printf("\n数据错误!!!\n"); 
			        break;

		}
        printf("\n");
	}
	
	return 0;
}
 

猜你喜欢

转载自blog.csdn.net/qq_52001969/article/details/113118365