直接看代码吧,我只实现了几个很简单的增删改操作,利用文件进行存储,为了便于再不同的地方进行操作我便写了一个bat批处理,直接在D盘创建一个t.txt,应为程序中的文件都是从D:\t.txt中读取的。具体代码如下。
#include
#include
#define LL sizeof(stu)
#define N 3
int COUNT = 10;
int num;
typedef struct student
{
int no; //学号
char name[20]; //姓名
char sex[10]; //性别
int score[N]; //成绩
struct student *next;
}stu;
stu *creatlist(void)
{
stu *p1,*p2,*head=NULL;
num=0;
p1=p2=(stu *)malloc(LL);
printf("请输入学生信息:学号,姓名,性别,语文成绩,数学成绩,英语成绩\n");
scanf("%d%s%s",&p1->no,p1->name,p1->sex);
for(int i=0;i<N;i++)
scanf("%d",&p1->score[i]);
while(p1->no!=0)
{
num++;
if(num==1)
head=p1;
else
p2->next=p1;
p2=p1;
p1=(stu*)malloc(LL);
scanf("%d%s%s",&p1->no,p1->name,p1->sex);
for(int i=0;i<N;i++)
scanf("%d",&p1->score[i]);
}
p2->next=NULL;
return head;
}
//从本地文件导入数据
stu * import(){
stu * p ,*head,*q;
FILE * fp;
head = p = q = (stu*)malloc(LL);
if((fp = fopen("D://t.txt","r"))==NULL){
printf("file not open\n");
exit(1);
}
for(int i =1 ;i<=COUNT;i++){
fscanf(fp,"%d %s %s %d %d %d\n",&p->no,p->name,p->sex,&p->score[0],&p->score[1],&p->score[2]);
if(i==COUNT){
p->next = NULL;
break;
}
q = (stu*)malloc(LL);
p->next = q;
p = q;
}
fclose(fp);
return head;
}
//查询学生信息
void lookup( stu *head ,int no)
{
stu *p1=head;
if(head==NULL)
printf("该链表为空链表\n");
while(p1->no!=no&&p1->next!=NULL)
p1=p1->next;
if(p1->no==no)
{
printf("学号\t\t姓名\t性别\t语文成绩\t数学成绩\t英语成绩\n");
printf("%d\t\t%s\t%s\t%d\t\t%d\t\t%d\n",p1->no,p1->name,p1->sex,p1->score[0],p1->score[1],p1->score[2]);
}
else
printf("没有该同学的信息\n");
}
//修改学生信息
stu* alter( stu *head ,int no)
{
stu *p1=head;
if(head==NULL)
printf("该链表为空链表\n");
while(p1->no!=no&&p1->next!=NULL)
p1=p1->next;
if(p1->no==no)
{
printf("学号\t\t姓名\t性别\t语文成绩\t数学成绩\t英语成绩\n");
printf("%d\t\t%s\t%s\t%d\t\t%d\t\t%d\n",p1->no,p1->name,p1->sex,p1->score[0],p1->score[1],p1->score[2]);
printf("请输入要修改的信息\n");
scanf("%d%s%s%d%d%d",&p1->no,p1->name,p1->sex,&p1->score[0],&p1->score[1],&p1->score[2]);
}
else
printf("没有该同学的信息\n");
return head;
}
//输出学生信息
void showlist(stu *p1)
{
printf("学号\t\t姓名\t\t性别\t语文成绩\t数学成绩\t英语成绩\n");
if(p1==NULL)
printf("该链表为空链表!\n");
else
while(p1!=NULL)
{
printf("%d\t\t%s\t\t%s\t%d\t\t%d\t\t%d\n",p1->no,p1->name,p1->sex,p1->score[0],p1->score[1],p1->score[2]);
p1=p1->next;
}
}
//保存到文件
void datalist(stu * head){
printf("如存入数据与原数据相同请删除\n");
printf("删除请输入1,否则输入0\n");
int n ;
scanf("%d",&n);
if(n==1){
clearlist();
COUNT = 0;
}
FILE * fp ;
if((fp = fopen("D://t.txt","a+"))==NULL){
printf("file not open\n");
exit(1);
}
while(head!=NULL){
COUNT++;
fprintf(fp,"%d %s %s %d %d %d\n",head->no,head->name,head->sex,head->score[0],head->score[1],head->score[2]);
head = head -> next;
}
fclose(fp);
}
//清空文件中的数据
void clearlist(){
remove("D://t.txt");
return ;
}
//删除学生信息
stu *del(stu* head,int no)
{
stu *p1,*p2=NULL;
if(head==NULL)
{
printf("此链表为空链表!\n");
goto end;
}
p1=head;
while(p1->no!=no&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->no==no)
{
num--;
if(p1==head)
head=p1->next;
else
p2->next=p1->next;
}
end:
return (head);
}
//删除最后的零节点
stu *clear(stu* head)
{
stu *p1,*p2=NULL;
if(head==NULL)
{
printf("此链表为空链表!\n");
goto end;
}
p1=head;
while(p1->no!=0&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->no==0)
{
num--;
p2->next=NULL;
}
else
printf("未找到该结点!\n");
end:
return (head);
}
//插入学生信息
stu *insert( stu *head,stu *worker )
{
stu *p1,*p2=NULL,*p0=worker;
p1=head;
if(head==NULL)
{
head=p0;
p0->next=NULL;
}
else
{
while(p1->no<p0->no&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(p1->no==p0->no){
printf("学号冲突,请重新输入\n");
return head;
}
if(p1->no>p0->no)
{
if(p1==head)
head=p0;
else
p2->next=p0;
p0->next=p1;
}
else
{
p1->next=p0;
p0->next=NULL;
}
}
num++;
return head;
}
//欢迎
void print(void){
printf("*********************************************************\n");
printf("* 欢迎来到易学生系统 *\n");
printf("*********************************************************\n");
printf("1 手动录入学生信息\t\t2 自动从文件导入数据(推荐)\n\n"
"3 删除学生信息\t\t\t4 添加学生\n\n"
"5 查找学生\t\t\t6 输出学生信息\n\n"
"7 修改学生信息\t\t\t8 保存数据到数据库\n\n"
"9 查看菜单\t\t\t10 退出学生管理系统!\n\n");
printf("********************************************************\n");
printf("请输入指令\n");
}
void Seemnue(void){
printf("*********************************************************\n");
printf("1 手动录入学生信息\t\t2 自动从文件导入数据(推荐)\n\n"
"3 删除学生信息\t\t\t4 添加学生\n\n"
"5 查找学生\t\t\t6 输出学生信息\n\n"
"7 修改学生信息\t\t\t8 保存数据到数据库\n\n"
"9 查看菜单\t\t\t10 退出学生管理系统!\n\n");
printf("********************************************************\n");
}
int main()
{
print();
int h,t,n;
stu *k;
stu *hh;
while(scanf("%d",&h)!=EOF)
switch(h)
{
case 1:
printf("结束 请输入0 0 0 0 0 0 \n\n");
k=creatlist();
printf("请输入指令\n");
break;
case 2:k = import();
k = clear(k);
printf("请输入指令\n");
break;
case 3:
printf("请输入要删除学生的编号\n");
scanf("%d",&t);
k=del(k,t);
printf("请输入指令\n");
break;
case 4:
printf("请输入要添加学生的信息\n");
printf("学号\t姓名\t性别\t语文成绩\t数学成绩\t英语成绩\n");
hh=(stu*)malloc(LL);
scanf("%d%s%s",&hh->no,hh->name,hh->sex);
for(int i=0;i<N;i++)
scanf("%d",&hh->score[i]);
k=insert(k,hh);
printf("请输入指令\n");
break;
case 5: printf("请输入要查学生的编号\n");
scanf("%d",&n);
lookup(k,n);
printf("请输入指令\n");
break;
case 6: showlist(k); printf("请输入指令\n"); break;
case 7: printf("请输入要修改学生的编号\n");
scanf("%d",&n);
k = alter(k,n);
printf("请输入指令\n"); break;
case 8: datalist(k); printf("请输入指令\n"); break;
case 9: Seemnue(); printf("请输入指令\n"); break;
case 10: printf("拜拜,结束!\n");break;
}
return 0;
}