蓝色123经典 2019-11-07 23:03 采纳率: 75%
浏览 345

我写的链表,每次到末尾插入的时候就会报错 调试的时候出现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条回答 默认 最新

  • 关注
    评论

报告相同问题?

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行