C语言之简易学生信息管理程序

首先就学生信息管理程序来说就应该先要去确定其需要的功能。

下面的程序中给了这几个功能:

  1. 写入(一开始的写入);
  2. 插入(在已有信息的基础上根据需要插入);
  3. 删除(删除指定信息的学生信息);
  4. 显示(显示链已有的信息);
  5. 将信息存放至文件;
  6. 将文件的学生信息读出至链中;

此次用的是带头节点的链表:

结构体中存放的有{学号,名字,曾用名,身份证,成绩}

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

#define ture 0
#define false -1

#define fileName "student.dat"

typedef unsigned char boolean ;

typedef struct STUDATA {
	char number[9];
	char name[14];
	char oldName[14];
	char id[19];
	double score;   
}STUDATA;

typedef struct LINK {
	STUDATA data;
	struct LINK *next;
}LINK;

LINK* creatOnePNode();
STUDATA oneStuInformation();
boolean inputTo(LINK *hp);
boolean destoryLINK(LINK *hp);
boolean showOneLINKPoint(LINK *hp,LINK *p);
boolean showLINK(LINK *hp);
LINK* searchLINK(LINK *hp, LINK data);
boolean insertLINK(LINK *hp);
boolean deleteLINK(LINK *hp);
boolean fwirteIn(LINK *hp);
boolean freadOut(LINK *hp);

boolean freadOut(LINK *hp) {
	FILE *outfp;
	LINK *p;
	LINK q;
	LINK *tail;
		
	outfp = fopen(fileName, "rb");
	if(outfp && hp){
		p = creatOnePNode();
		fread(&(q.data), sizeof(STUDATA), 1, outfp);
		
		while (!feof(outfp)) {
		
			if(!p) {
				printf("申请节点失败");
				
				fclose(outfp);
				return false;
			}
			 
			p->data = q.data;
			
			if (NULL == hp->next) {
				
				hp->next = p;
			} else {
				
				tail->next = p;
			}
			tail = p; 
			p = creatOnePNode();
			fread(&(q.data), sizeof(STUDATA), 1, outfp);
			
		}
		printf("\n读取成功\n");
	
		fclose(outfp);
		
		return ture;
	}	
}

boolean fwirteIn(LINK *hp) {
	FILE *infp;
	LINK *p;
	STUDATA data;
	
	
	infp = fopen(fileName, "wb");
	
	if (NULL == infp){
		printf("文件打开出错啦!");
		
		return false;
	}
	for(p = hp->next; p; p = p->next) {
		fwrite(&(p->data), sizeof(STUDATA), 1, infp);
	} 
	printf("写入成功!");
	fclose(infp);
}

boolean deleteLINK(LINK *hp) {
	char deleteData[8];
	LINK tmpNode;
	LINK *pre;
	LINK *tmp;
	
	printf("请输入要删除的数据:");
	_flushall(); 
	gets(deleteData);
	strcpy(tmpNode.data.number, deleteData);
	
	pre = searchLINK(hp, tmpNode);
	
	if (hp && hp->next) {
		if (pre->next){
			tmp = pre->next;
			pre->next = tmp->next;
			free(tmp);
	 	} else {
	 		printf("没有找到,删除无效!\n"); 
		}
		return ture;
	} else {
		return false;
	}
}

boolean insertLINK(LINK *hp){
	char position[8];
	STUDATA data;
	LINK tmpNode;
	LINK *pre;
	LINK *tmp;
	
	if (hp && hp->next) {
		printf("请输入你要插入哪个数据的旁边(左插入):");
		_flushall(); 
		gets(position);
		strcpy(tmpNode.data.number, position);
		
		pre = searchLINK(hp,tmpNode);
		
		printf("请输入你要插入的数据:");
		tmp = creatOnePNode();
		tmp->data = oneStuInformation();
		
		tmp->next = pre->next;
		pre->next = tmp;
		
		return ture;
	} else {
		return false;
	}
}

LINK* searchLINK(LINK *hp, LINK data) {
	LINK *p;
	
	for (p = hp; p && p->next; p = p->next) {
		if (!strcmp(p->next->data.number, data.data.number)) {
			printf("找到了!\n");
			return p;
		}  
	} 
	printf("链表中没有此数据,将会添加到链表末尾处或在删除时操作无效\n");
	return p;
}

boolean showLINK(LINK *hp) {
	LINK *p;
	printf("\n%-10s %-14s %-14s %-20s %-4s\n", "学号", "姓名", "曾用名", "身份证号码", "成绩");
	if (NULL == hp && hp->next ==NULL) {
		printf("empty");
		return false;
	} else {
		for (p = hp->next; p; p = p->next) {
			showOneLINKPoint(hp, p);
			printf("\n");
		}
		return ture;
	}	
}

boolean showOneLINKPoint(LINK *hp,LINK *p) {
		if (NULL == hp && NULL == hp->next && p) {
			printf("empty");
		} else {
			printf("%-10s %-14s %-14s %-20s %4.1lf", p->data.number, p->data.name, 
			!strcmp(p->data.oldName,"无")?p->data.name:p->data.oldName, p->data.id, p->data.score);
			}
}
 
boolean destoryLINK(LINK *hp) {
	LINK *p;

	while (hp && hp->next) {
		p = hp->next;
		hp->next = p->next;
		free(p);
		
	}
	hp->next = NULL;
	hp = NULL;
	printf("毁链成功!\n"); 
}

boolean inputTo(LINK *hp) {
	STUDATA data;
	LINK *p;
	LINK *tail;
	
	data = oneStuInformation();
	
	if (hp) {
		while (data.number[0] != '\0'){
			p = creatOnePNode();
			if(!p) {
				printf("申请节点失败");
			}
			
			p->data = data;
			
			if (NULL == hp->next) {
				hp->next = p;
			} else {
				tail->next = p;
			}
			tail = p; 
			
			data = oneStuInformation();
		}
		return ture;
	} else {
		return false;
	}
}

STUDATA oneStuInformation() {
	STUDATA data;
	
	printf("请输入学生信息:\n");
	printf("学号(回车输入截止):");
	_flushall(); 
	gets(data.number);
	if (data.number[0] != '\0') {
		
		printf("姓名:");
		_flushall(); 
		gets(data.name);
		
		printf("曾用名(如无则默认原名):");
		_flushall(); 
		gets(data.oldName);
		
		printf("身份证号码:");
		scanf("%s", &data.id);
		
		printf("成绩:");
		scanf("%lf", &data.score);
	} 
	return data;
}

LINK* creatOnePNode() {
	LINK *Node;
	
	Node = (LINK*)calloc(1,sizeof(LINK));
	
	if(Node){
		return Node;
	} else {
		return ture;
	}
	
}

int main() {
	LINK head = {0};
	LINK reaHead = {0};
	
	inputTo(&head);
	showLINK(&head);
//	insertLINK(&head);
//	showLINK(&head);
//	deleteLINK(&head);
//	showLINK(&head);
	fwirteIn(&head);
	freadOut(&reaHead);
	showLINK(&reaHead);
	destoryLINK(&head); 
	showLINK(&head);
	destoryLINK(&reaHead); 
	showLINK(&reaHead);
	
	return 0;
}
	

猜你喜欢

转载自blog.csdn.net/baidu_41922630/article/details/86715836