求大神指教 这是用c语言编写的 基于动态链表的学生成绩管理系统 其中的错误求大神指出

2025-06-21 21:04:15
推荐回答(3个)
回答1:

/*
应该建立有头结点的链表,否则,如果删除的数据刚好是第一个结点时,麻烦就大了。
代码改动处较多,已经过不完全测试,可以运行。
*/
#include
#include
struct stu {
int num;
char name[20];
float sorce;
struct stu *next;
};

void output_sc(struct stu *head) {
struct stu *p;
for(p = head->next;p;p = p->next)
printf("%d %s %f\n",p->num,p->name,p->sorce);
printf("\n");
}

struct stu *creat() {
struct stu *head,*p;
int i,n,len;
len = sizeof(struct stu);
printf("please input the number of students : ");
scanf("%d",&n);
printf("please input students detials\n");
head = p = (struct stu *)malloc(len);
for(i = 0;i < n;i++) {
p->next = (struct stu *)malloc(len);
scanf("%d%s%f",&p->next->num,p->next->name,&p->next->sorce);
p = p->next;
}
p->next = NULL;
return(head);
}

int del(struct stu *head) {
struct stu *p,*q;
int num;
printf("请输入要删除的学号 : ");
scanf("%d",&num);
if(head->next == NULL) {
printf("此链表为空\n");
return 0;
}
p = head;
while(p->next != NULL) {
if(p->next->num == num) {
q = p->next;
p->next = q->next;
free(q);
return 1;
}
p = p->next;
}
printf("未找到相关信息\n");
return 0;
}

void output_df(struct stu *head) {
struct stu *p;
FILE *fp;
if((fp = fopen("D:\\data.txt","at+")) == NULL) {
printf("该文件不存在\n");
exit(0);
}
for(p = head->next;p != NULL;p=p->next)
fprintf(fp,"%d %s %f\n",p->num,p->name,p->sorce);
fclose(fp);
}

void df_sc(struct stu *head) {
struct stu s;
FILE *fp;
fp = fopen("D:\\data.txt","r");
if(fp == NULL) {
printf("无法打开文件\n");
exit(0);
}
while(!feof(fp) ) {
fscanf(fp,"%d%s%f",&s.num,s.name,&s.sorce);
printf("%d %s %f\n",s.num,s.name,s.sorce);
}
fclose(fp);
}

void main() {
struct stu *head;
while(1) {
int n;
printf("\t***********************************************\n");
printf("\t\t 欢迎使用学生成绩管理系统\n");
printf("\t\t1.creat 2.del\n ");
printf("\t\t3.out-screen 4.out-datafaile\n");
printf("\t\t5.datafaile-screen 6.exit\n ");
printf("\t***********************************************\n");
printf("\t\tplease input selct 1--6\n");
printf("Select please : ");
scanf("%d",&n);
switch(n) {
case 1: head = creat(); break;
case 2: del(head); break;
case 3: output_sc(head); break;
case 4: output_df(head); break;
case 5: df_sc(head); break;
case 6: exit(0); break;
}
}
}

回答2:

struct stu *del(struct stu *head)
{ struct stu *p1,*p2;
int num,flag=0;
printf("请输入要删除的学号\n");
scanf("%d",&num);
if(head==NULL)
printf("此链表为空\n");
else
{ p1=head;
p2=p1;
//这儿少了判断,如果head是要删除的节点要单独删除
while(p1->next!=NULL&&!flag) // 这儿错了
{ if(p1->num==num)
flag=1;
p2=p1;
p1=p1->next;
}
if(flag)
p2->next=p1->next;
else printf("未找到相关信息\n");
}

回答3:

填一个分号就好了,while(1)后面没有分号