我写的链表,每次到末尾插入的时候就会报错 调试的时候出现segmentation fault 请大佬看看时怎么回事

#include
#include
#include
typedef struct stu{
int score;
char name[10];
struct stu next;
}STU;
STU *creat1(STU *head,int n);
STU *creat2(STU *head,STU *tail,int n);
void myprintf(STU
);
STU insert(STU *head);
STU *delet(STU *head);
int main(){
int n,num;
STU *head=NULL;//头指针
STU *tail=NULL;//尾指针 记得初始化为NULL。
char name[10];
printf("
********1.创建链表。***********************\n");
printf("*********2.输出所有的节点内容。*************\n");
printf("*********3.插入一个新的节点。***************\n");
printf("*********4.删除一个节点。*******************\n");
printf("*********5.修改一个节点。*******************\n");
printf("*********6.结束操作。***********************\n");
printf("请输入指令:");
scanf("%d",&n);
do{
switch(n){
case 1: printf("请输入节点数:");
scanf("%d",&num);
head=creat2(head,tail,num); break;
case 2: myprintf(head); break;
case 3: head=insert(head); break;
case 4: head=delet(head); break;
// case 5:change(head); break;
case 6: printf("欢迎您再次使用!"); break;
default:printf("请输入正确的数值!");
scanf("%d",&n); continue;
}
if(n!=6){
printf("请输入指令:");
scanf("%d",&n);
}
}while(n!=6);
return 0;
}
/*struct stu creat1(STU *head,int n){//头部差法。最后一个输入的第一个出现,后面的直接插在头上。
STU *p;
int i;//
for(i=0;i<n;i++){
p=(STU
)malloc(sizeof(STU));//先给指针分配空间,这是创建的第一件事。
printf("请输入学生的分数:");
scanf("%d",&p->score);
printf("请输入学生的名字:");
scanf("%s",&p->name);
p->next=head;
head=p;//这两步可以用图理解 不然死记也行。
}
return head;
}*/
STU*creat2(STU head,STU *tail,int n){//尾部差法。最后一个输出在最后一个出现,后面的在后面加。
STU *p;
int i;
for(i=0;i<n;i++){
p=(STU
)malloc(sizeof(STU));
printf("请输入学生的分数:");
scanf("%d",&p->score);
printf("请输入学生的名字:");
scanf("%s",&p->name);
p->next=NULL;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
}
return head;
}
void myprintf(struct stu head){
STU*p;
p=head;
do{
printf("%3d %s\n",p->score,p->name);
p=p->next;
}while(p!=NULL);
}
STU*insert(STU *head){//按一定的顺序插入,之前就要保证是按顺序的。 这个是从小到大排序。
STU *p=NULL,*p2=NULL,*p1=NULL;
int i;
p=(STU
)malloc(sizeof(STU));
printf("请输入新加入的学生的分数:");
scanf("%d",&p->score);
printf("请输入新加入的学生的名字:");
scanf("%s",&p->name);
p2=head;
/*while (p2->scorescore && p2){//当插到最后一个点时会报错 我也不知道怎么改了。。。
p1=p2;
p2=p2->next;
}
if(!p2){//新插入的学生的分数最高 ,在最后面。
p1->next=p;
p->next=NULL;
} else if(p2==head){//新插入的学生分最少,在最前面。
p->next=p2;
head=p;
} else{//新插入的同学的中间的一个。
p1->next=p;
p->next=p2;
}*/
return head;
}
STU *delet(STU *head){
STU *p1=NULL,*p2=NULL;
char t[10];
printf("请输入要删除的学生的名字:");
scanf("%s",t);
p1=head;
p2=head;
while (strcmp(p2->name,t) && p2){
p1=p2;
p2=p2->next;
}
if(!p2) printf("没有找到该同学!");
else if(p2==head){
head=p2->next;
free(p2);
} else if(!p2->next){
p1->next=NULL;
free(p2);
} else {
p1->next=p2->next;
free(p2);
}

return head;

}



2个回答

Ai_mankind
Ai_mankind 我自己已经试出来时哪里错了 就是不知道怎么改对 /(哭笑) 不过也谢谢你了
4 个月之前 回复

看你的代码排版,感觉比自己重新写一个链表都难,可以选择插入代码段,代码格式规范,可以让看代码的人更加能理解你的思路

Ai_mankind
Ai_mankind 我选了代码段格式的 但是不知道为什么还是变成没格式的了。。。
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

0
在单链表中统计某区域内的元素,将获得元素插入新单链表,并打印新链表元素在原链表中的序号
1
用C语言完成以下功能:数据的录入、显示,链表的创建,插入数据,删除数据。每个功能用一个函数来实现。
1
leetcode876. 链表的中间结点。用javascript,为什么return是undefined?
1
链表程序vc6.0可以运行但vs不能运行
1
写了链表插入函数 主函数却没实现插入功能
1
关于数据结构中的单链表的输出问题。
1
Java语言的数组,如何增加和缩小长度,要实现动态的改变不想用链表了
1
链表插入时while(p)和while(p->Next)有何不同
1
如何实现 链表的头结点是指针数组,再用二级指针调用?
2
Java语言编写程序一个链表,并且计算链表上所有数的和
1
重赏求助,用java eclipse,分别用二叉链表、三叉链表为成员方法,查找二叉树中某节点的父节点?
1
c语言单链表每次进行查找操作和排序操作的时候程序就闪退
1
为什么我的插入、删除、计数出错,小白需要大神帮改下
1
我弄的C++类链表可以创建但是输出不了,程序没有报错,但只能调用setnum函数但是不能调用display函数,如图,请问是哪里出了问题?
1
c语言链表问题,请问一下我这个代码错在哪里,谢谢了
2
在链表某个位置插入数字后怎么让链表的数字显示在屏幕上?
1
数据结构java实验四验证教材中树结构的基本操作,设计实现指定操作的算法,并做算法分析。 以下各题二叉树的存储结构是二叉链表表示,方法声明如下: 二叉树的二叉链表结点类:
0
单链表中的插入和删除
1
以二叉链表建立二叉树链式存储结构,实现前序遍历、求叶子结点的个数计算、中序遍历、后序遍历、求深度。
0
C语言 如何调用链表里的数据?