学习了C语言结构体,链表和文件的知识之后,就可以做出一个学生信息管理系统了,下面的是我在刚学习完这块知识后写出来的,基本没什么界面,不过 能够实现 录入,添加,插入,遍历,删除,查询,并且保存到本地文件的功能。
首先,链表中每个学生节点的信息包括这些:姓名,学号,班内序号,手机号。所以定义这样的结构体类型:
struct student{
char iname[20];
int inumber;
char snum[10];
char iPhone[20];
struct student *next;
};
因为C语言是模块化的语言,所以把要实现的每个功能都做成一个函数,在主函数的选择语句中调用:
这些函数有:1.初始录入或添加学生信息函数:
struct student *Creat();
返回值为链表的头节点地址,功能是 录入学生信息并保存到D:\\stuifo.txt文件下。
2.插入学生信息函数:
void Insert();
功能:读出文件内的信息到链表,再将信息插入到其中,再保存到本地。
3.遍历文件中的学生信息
void print();
功能:读出文件内的信息到链表,再将其依次输出。
4.删除学生信息
void Delete();
功能:将指定的班内序号的学生从文件中删除。
5.查询学生信息
void seek();
功能:查询指定的班内序号的学生的信息,并显示。
以上就是学生信息管理系统的大致功能,但实现以上函数功能的过程中还需要调用几个更基本的函数:
int now1_student();
struct student *read();
void save(struct student *pHead);
它们的功能分别是:返回文件内学生数目;读文件内信息到链表;保存链表中信息到文件内。
具体代码如下:
#include
#include
#include
#include
#include
struct student{
char iname[20];
int inumber;
char snum[10];
char iPhone[20];
struct student *next;
};
int now1_student(){ //显示文件中现在已录入的学生数
int i=1;
char j[100000];
FILE *info;
info=fopen("d:\\stuifo.txt","rt");
rewind(info);
while(fgets(j,sizeof(struct student),info)!=NULL)
{
fseek(info,sizeof(struct student)*i,0);
i++;
}
fclose(info);
return i-1;
}
int icount=now1_student();
struct student *read(){ //读入文件内的信息,并返回链表头指针的地址
struct student *pHead,*pEnd,*pNew;
FILE *fp; //创建链表,并将文件内数据读入链表
fp=fopen("d:\\stuifo.txt","rt");
if(fp==NULL){
printf("未在本地找到学生信息文件!\n");
return NULL;
}
int i=1,count=0;
while(i<=now1_student()){
count++;
pNew=(struct student *)malloc(sizeof(struct student));
fread(pNew,sizeof(struct student),1,fp);
if(count==1){
pNew->next=pHead;
pEnd=pNew;
pHead=pNew;
}
else{
pNew->next=NULL;
pEnd->next=pNew;
pEnd=pNew;
}
i++;
}
fclose(fp);
return pHead;
}
void save(struct student *pHead){ //保存当前的链表至本地文件
struct student *pTemp=pHead;
FILE *fp;
fp=fopen("d:\\stuifo.txt","wt");
while(pTemp!=NULL){
fwrite(pTemp,sizeof(struct student),1,fp);
pTemp=pTemp->next;
}
printf("成功将信息保存至本地文件!");
fclose(fp);
}
int _ifblank(char judge[]){ //判断字符串是否只有空格,若只有空格则返回0,否则返回字符串中非空格字符数目
char ch;
char true_[20];
int i,j;
for(i=0,j=0;i0){
pHead=read();
pTemp=pHead;
while(pTemp->next!=NULL)
pTemp=pTemp->next;
pNew=(struct student *)malloc(sizeof(struct student));
printf("添加学生信息:\n");
printf("姓名:");
gets(pNew->iname);
gets(pNew->iname);
printf("学号:");
scanf("%s",pNew->snum);
printf("班内序号:");
scanf("%d",&pNew->inumber);
printf("手机号:");
scanf("%s",pNew->iPhone);
pNew->next=NULL;
pTemp->next=pNew;
save(pHead);
printf("添加成功!\n");
return pHead;
}
pEnd=pNew=(struct student *)malloc(sizeof(struct student));
printf("请输入学生信息:");
printf("\n姓名:");
scanf("%s",pNew->iname);
printf("学号:");
scanf("%s",pNew->snum);
printf("班内序号:");
scanf("%d",&pNew->inumber);
printf("手机号:");
scanf("%s",pNew->iPhone);
while(1){
count++;
if(count==1){
pNew->next=pHead;
pEnd=pNew;
pHead=pNew;
}
else{
pNew->next=NULL;
pEnd->next=pNew;
pEnd=pNew;
}
pNew=(struct student *)malloc(sizeof(struct student));
printf("继续录入,姓名为空时停止\n");
printf("姓名:");
gets(pNew->iname);
gets(pNew->iname);
if(!_ifblank(pNew->iname))
break;
printf("学号:");
scanf("%s",pNew->snum);
printf("班内序号:");
scanf("%d",&pNew->inumber);
printf("手机号:");
scanf("%s",pNew->iPhone);
}
free(pNew);
pTemp=pHead;
printf("是否保存这些学生信息? 1-是 0-否");
scanf("%d",&judge);
if(judge==1){
save(pHead);
}
return pHead;
}
void print(){ //打印出本地文件内的学生信息
int count=0;
struct student *pHead=NULL;
struct student *pTemp,*pEnd,*pNew;
pHead=read();
struct student *temp;
int index=1;
temp=pHead;
while(temp!=NULL){
printf("第%d个学生:\n",index);
printf("姓名:%s\n",temp->iname);
printf("学号:%s\n",temp->snum);
printf("班内序号:%d\n",temp->inumber);
printf("手机号:%s\n\n",temp->iPhone);
temp=temp->next;
index++;
}
}
void Insert(){
int index;
struct student *pHead;
struct student *ipnew,*p,*pPre,*pTemp;
struct student *pNew,*pEnd;
pHead=read();
printf("请输入要插入的学生班内序号:"); //将学生信息插入进链表
scanf("%d",&index);
printf("\t\t\t\t\t\t-----------当前已录入%d人---------\n",now1_student());
if(index>now1_student())
printf("输入错误!\n");
printf("请输入学生的信息:\n");
ipnew=(struct student *)malloc(sizeof(struct student));
printf("姓名:");
scanf("%s",ipnew->iname);
printf("学号:");
scanf("%s",ipnew->snum);
printf("班内序号:");
scanf("%d",&ipnew->inumber);
printf("手机号:");
scanf("%s",ipnew->iPhone);
if(index==1){
ipnew->next=pHead;
pHead=ipnew;
}
else{
p=pHead;
for(int i=1;inext;
ipnew->next=p->next;
p->next=ipnew;
}
save(pHead);
return;
}
void Delete(){ //删除学生信息
struct student *pHead;
int i,index;
struct student *pTemp;
struct student *pPre,*p;
pHead=read();
pTemp=pHead;
pPre=pTemp;
printf("请输入要删除的学生班内序号:");
scanf("%d",&index);
if(index>now1_student()){
printf("输入有误!\n");
return;
}
if(index==1){
pHead=pHead->next;
save(pHead);
printf("学生信息删除成功!\n");
return;
}
while(pTemp->inumber!=index){ //无法删除头节点
pPre=pTemp;
pTemp=pTemp->next;
}
pPre->next=pTemp->next;
free(pTemp);
save(pHead);
printf("学生信息删除成功!\n");
}
void seek(){ //根据班内序号查找学生信息
struct student *pHead;
struct student *pTemp;
int inum;
printf("请输入要查找学生的班内序号:");
scanf("%d",&inum);
pHead=read();
pTemp=pHead;
while(pTemp->inumber!=inum){
pTemp=pTemp->next;
if(pTemp==NULL){
printf("未查找到此学生信息!\n");
getch();
return;
}
}
printf("姓名:%s\n",pTemp->iname);
printf("学号:%s\n",pTemp->snum);
printf("班内序号:%d\n",pTemp->inumber);
printf("手机号:%s",pTemp->iPhone);
}
int main(){
int choice=-1;
struct student *pHead;
while(choice!=0){
// system("cls");
printf("\n\t\t\t\t\t\t-------学生信息管理系统------\n");
if(now1_student()==0){
printf("\t\t\t\t\t\t------目前还未录入过信息------\n");
printf("\t\t\t\t\t\t---------请开始首次录入-------\n");
}
else{
printf("\t\t\t\t\t\t-----------已录入%d人---------\n",now1_student());
printf("\t\t\t\t\t\t--若需新增学生信息请选则添加--\n");
}
printf("\t\t\t\t\t\t-----------------------------\n");
printf("\t\t\t\t\t\t || 1. 录入学生信息 ||\n");
printf("\t\t\t\t\t\t || 2. 插入学生信息 ||\n");
printf("\t\t\t\t\t\t || 3. 删除学生信息 ||\n");
printf("\t\t\t\t\t\t || 4. 打印学生信息表 ||\n");
printf("\t\t\t\t\t\t || 5. 查找学生信息 ||\n");
printf("\t\t\t\t\t\t || 0. 退出 ||\n");
printf("\t\t\t\t\t\t----------------------------\n");
scanf("%d",&choice);
switch(choice){
case 1:
if(now1_student()!=0)
printf("您已录入过初始信息,请继续添加学生信息!\n");
pHead=Creat();
getch();
break;
case 2:Insert();
getch();
break;
case 3:Delete();
getch();
break;
case 4:print();
getch();
break;
case 5:seek();
getch();
break;
case 0:
break;
default:
break;
}
}
return 0;
}