首先就学生信息管理程序来说就应该先要去确定其需要的功能。
下面的程序中给了这几个功能:
- 写入(一开始的写入);
- 插入(在已有信息的基础上根据需要插入);
- 删除(删除指定信息的学生信息);
- 显示(显示链已有的信息);
- 将信息存放至文件;
- 将文件的学生信息读出至链中;
此次用的是带头节点的链表:
结构体中存放的有{学号,名字,曾用名,身份证,成绩}
#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;
}