C语言学生信息管理系统代码优化:链表操作与数据处理
#include<stdio.h> #include<stdlib.h> #include<string.h>
struct student { char num[40]; //学号 char name[40]; //学生姓名 char sex[10]; //学生性别 int age; //学生年龄 struct student *next;//下一结点指针 }; typedef struct student EMP; EMP *h;
void load(); //读文件数据,并创建链表 void save(); //将链表中数据写到文件中 void add(EMP *p); //链表中增加学生结点 void del(char *s); //链表中删除指定姓名的学生结点 void update(); //链表中更新学生结点中的数据 void browse(); //在屏幕上显示链表中所有结点数据 void menu(); //显示系统主菜单 void delEmp(); //删除学生数据 void addEmp(); //增加学生数据 void sortEmp(); //排序学生数据 void searchByName(); //按姓名查询学生 void searchByAge(); //按年龄查询学生
int main() {
int op;//operation
h =(EMP *)malloc(sizeof(EMP)); //创建链表的头结点
h->next = NULL; //初始化链表头节点中下一节点指针为NULL
menu();
scanf('%d',&op);
while(op!=0)
{
switch(op)
{
case 1:
load();
break;
case 2:
save();
break;
case 3:
addEmp();
break;
case 4:
delEmp();
break;
case 5:
update();
break;
case 6:
browse();
break;
case 7:
sortEmp();
break;
case 8:
searchByName();
break;
case 9:
searchByAge();
break;
default:
printf('Invalid input, please try again.\n');
break;
}
menu();
scanf('%d',&op);
}
return 0;
}
//显示系统主菜单函数 void menu() { printf(' Main Menu\n'); printf(' ********************** \n'); printf(' * 0:quit 1 :load * \n'); printf(' * 2:save 3 :add * \n'); printf(' * 4:delete 5 :update * \n'); printf(' * 6:browse 7 :sort * \n'); printf(' * 8:search by name * \n'); printf(' * 9:search by age * \n'); printf(' ********************** \n'); }
//读文件数据,并创建链表函数 void load() { FILE *fp; EMP *node; fp = fopen('data.txt','r'); if(fp==NULL) { printf('Failed to open the file, please check if it exists.\n'); return; } while(!feof(fp)) { node =(EMP *)malloc(sizeof(EMP)); node->next = NULL; fscanf(fp,'%s%s%s%d',node->num,node->name,node->sex,&node->age);//从文件中读一行学生信息 add(node); // 调用函数增加链表结点 } fclose(fp); }
//链表中增加学生结点的函数 void add(EMP *p) { EMP *q; q = h->next; //将q指针指向链表中第一个学生结点 if(q==NULL) //如果q指针为NULL,则表示当前链表为空 { h->next = p; //p指针指向的结点为链表中第一个结点 p->next = NULL; } else { while(q->next!=NULL) //通过while循环找到链表中最后一个结点 { q = q ->next; } q->next = p; //将q指针指向的最后一个结点的next指针指向新增结点 p->next =NULL; //现在p指针指向的是最后一个结点,因此将该节点的next指针设为NULL }
}
//增加学生数据函数 void addEmp() { EMP *node; node = (EMP *)malloc(sizeof(EMP)); node->next = NULL; printf('Please input the student's number name sex age:\n'); scanf('%s%s%s%d',node->num,node->name,node->sex,&node->age); add(node); }
//删除学生数据函数 void delEmp() { char name[40]; printf('Please input the name of the student you want to delete:\n'); scanf('%s',name); del(name); }
//在屏幕上显示链表中所有学生结点数据函数 void browse() { EMP *node; node = h->next; //node指针指向链表第一个结点 printf('Student's num name age sex\n'); while(node) //遍历链表 { printf('%12s%9s%4d%5s\n',node->num,node->name,node->age,node->sex); node = node->next; //node指针指向下一个学生结点 } printf('\n'); }
//将链表中数据写到文件中的函数 void save() { FILE *fp; EMP *node; fp = fopen('data.txt','w'); //以写的方式打开文件 node = h->next; //node指针指向链表第一个结点 while(node!=NULL) { //'%s %s %s %d\n' 格式符之间有空格 fprintf(fp,'%s %s %s %d\n',node->num,node->name,node->sex,node->age); node = node ->next; } fclose(fp); }
//删除学生结点的函数 void del(char *s) { EMP *p,*q; p = h;//链表中第一个节点 q = p->next;//链表中第二个节点 while(q!=NULL) { if(strcmp(s,q->name)==0) { p->next = q->next; free(q); printf('Successfully deleted the student named %s.\n', s); return; } p = q; q = q->next; } printf('No student named %s was found.\n', s); }
//更新学生结点的函数 void update() { char name[40]; int flag = 0; EMP *p; printf('Please input the name of the student you want to update:\n'); scanf('%s',name); p = h->next; while(p!=NULL) { if(strcmp(name,p->name)==0) { printf('Please input the new age:\n'); scanf('%d',&p->age); printf('Please input the new sex:\n'); scanf('%s',p->sex); flag = 1; printf('Successfully updated the information of student %s.\n', name); break; } p=p->next;
}
if(flag==0)
{
printf('No student named %s was found.\n', name);
}
}
//排序学生结点的函数 void sortEmp() { int n = 0, i, j; EMP *p, *q, *t; p = h->next; while (p != NULL) { n++; p = p->next; } for (i = 0, p = h->next; i < n - 1; i++, p = p->next) { for (j = i + 1, q = p->next; j < n; j++, q = q->next) { if (p->age > q->age) { t = (EMP *)malloc(sizeof(EMP)); memcpy(t, p, sizeof(EMP)); memcpy(p, q, sizeof(EMP)); memcpy(q, t, sizeof(EMP)); free(t); } } } printf('Sort success!\n'); }
//按姓名查询学生 void searchByName() { char name[40]; int flag = 0; EMP *p; printf('input the name:\n'); scanf('%s',name); p = h->next; while(p!=NULL) { if(strcmp(name,p->name)==0) { printf('Student's num name age sex\n'); printf('%12s%9s%4d%5s\n',p->num,p->name,p->age,p->sex); flag = 1; } p=p->next;
}
if(flag==0)
{
printf('No such Student\n');
}
}
//按年龄查询学生 void searchByAge() { int age; int flag = 0; EMP *p; printf('input the age:\n'); scanf('%d',&age); p = h->next; while(p!=NULL) { if(p->age==age) { printf('Student's num name age sex\n'); printf('%12s%9s%4d%5s\n',p->num,p->name,p->age,p->sex); flag = 1; } p=p->next;
}
if(flag==0)
{
printf('No such Student\n');
}
原文地址: https://www.cveoy.top/t/topic/ordK 著作权归作者所有。请勿转载和采集!