C语言,设计了学生信息管理的几个模块求大神指点有没有错误,顺便写个菜单函数。。不会搞啊?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 3
typedef struct node
{

char sno[20];
char name[20];
int score[M];
double avg;
struct node *next;
}linklist;
linklist *create()//尾插法创立链表
{
linklist *head,*p,*t;
int n,i,j;
printf("请输如学生人数::");
scanf("%d",&n);
head=(linklist*)malloc(sizeof(linklist));
t=head;
for(i=0;i<n;i++)
{
p=(linklist*)malloc(sizeof(linklist));
printf("输入学号:");
scanf("%s",p->sno);
printf("输入姓名:");
scanf("%s",p->name);
printf("输入%d门功课成绩:",M);
for(j=0;j<M;j++)
scanf("%d",&p->score[j]);
t->next=p;
t=p;
}
p->next=NULL;
return head;

}
void insert(linklist*head)//插入学生数据
{
linklist *p;
int i,n;
printf("输入你要插入的学生人数:");
scanf("%d",&n);
printf("你要插入的学生信息:\n");
for(i=0;i<n;i++)
{p=(linklist*)malloc(sizeof(linklist));
p->next=head->next;
head->next=p;
printf("输入学号:");
scanf("%s",p->sno);
printf("输入姓名:");
scanf("%s",p->name);
printf("输入%d门功课成绩:",M);
for(i=0;i<M;i++)
scanf("%d",&p->score[i]);}

}
void del(linklist*head)//删除学生信息
{
linklist *p,*q;
char s[20];
printf("输入要删除学生的姓名:");
scanf("%s",s);
p=head->next;
while(strcmp(p->sno,s)!=0)
{ q=p;
p=p->next;

if(p==NULL)
printf("无此人\n");
else
q->next=p->next->next;
free(p);

}
void change(linklist*head)
{
linklist*p;
int i,a[M];
char s[20];
printf("输入你要修改数据的学生姓名:");
scanf("%s",s);
p=head->next;
while(strcmp(p->sno,s)!=0)
p=p->next;
if(p==NULL)
printf("无此人\n");
else
{ printf("%s\t%s\t%d",p->sno,p->name);
printf("请重新输入学生的%d成绩:",M);
for(i=0;i<M;i++)
{ scanf("%d",&a[i]);
p->score[i]=a[i];

}

}

才看到……
第一个问题:linklist *create()//尾插法创立链表
这个函数中你建立的head是有问题的。本质上这个head仅是一个指针,这个指针只要指向第一个节点就可以了,所以不必为这个指针分配内存,也不用使用这个指针的next指向第一个节点。
第二个问题:void del(linklist*head)//删除学生信息
这个函数你出了两个问题,第一个就是else后的q->next=p->next->next;
由于你已经将p=p->next;了,所以你这么做的结果就是删除了两个节点。直接是q->next=p->next;
第二个是随后的free函数。我知道你的想法,但是需要加大括号,否则会每循环一次free一次,就报错了。所以要改成
else
{
q->next=p->next->next;
free(p);
}
最后能看到的是最后的函数上你好像少了一个大括号。不过也许是你复制的时候漏了。

这里给你几个你一定要好好看的建议,目前对于大括号来说有两个风格,一个是大括号的开闭对其,一个是开括号紧随调用者。也即
for(...)
{
}
for(...){
}
这样两种。任意一种都可以,但一定要统一。
第二个就是缩进。目前比较流行的缩进是4个空格,也有使用两个空格的。但是也一定要统一。
这两个建议对你程序的运行不会有任意差异,但是对于你程序的书写/阅读/维护来说都是极其重要的。还是在开始学的时候就好好养成好习惯吧。来自:求助得到的回答
温馨提示:答案为网友推荐,仅供参考
相似回答