|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
在插入链表部分出错,不能正确插入数据,插入的是一堆乱七八糟的数,并且调试出现这个错误
Program received signal SIGSEGV,Segmentation fault.
#include<stdio.h>
#include<stdlib.h>
int main()
{
struct ren
{
int num;
double score;
ren *next;
};/*定义结构体*/
ren *head,*p1,*p2,*p,*p3,*p4,*p5,*p6,*p7,*p8,*p9;/*定义指针*/
int n=0,num;
head=NULL;/*头地址置零*/
p2=p1=(ren *)malloc(sizeof(ren));
printf("输入第一个学号:");/*输入第一个数据*/
scanf("%d",&p1->num);
printf("\n");
printf("请输入分数:");
scanf("%d",&p1->score);
printf("\n");
for(;p1->num!=0;)/*判断学号是否为0否则循环输入数据*/
{
n++;
if(n==1)
{
head=p1;
}
else
{
p2->next=p1;
}
p2=p1;
p1=(ren *)malloc(sizeof(ren));/*开辟新结点*/
printf("输入第一个学号:");
scanf("%d",&p1->num);
printf("\n");
printf("请输入分数:");
scanf("%d",&p1->score);
printf("\n");
}
p2->next=NULL;/*最后地址置零*/
printf("一共%d名同学:\n",n);
p=head;/*打印数据*/
for(;p!=NULL;)
{
printf("%d %d\n",p->num,p->score);
p=p->next;
}
/*删除链表*****************
**************************/
if(head==NULL)/*判断是否为空链表*/
{
printf("空表");
}
else
{
p3=head;
printf("输入删除的学号:");
scanf("%d",&num);
while(num!=p3->num&&p3->next!=NULL)/*不是删除节点且不是尾结点 指针下移*/
{
p4=p3;
p3=p3->next;
}
}
if(num==p3->num)/*是否为删除节点*/
{
if(p3==head)/*删除头结点*/
{
head=p3->next;
}
else/*一般情况*/
{
p4->next=p3->next;
}
}
p5=head;/*打印删除后的链表*/
for(;p5!=NULL;)
{
printf("%d %d\n",p5->num,p5->score);
p5=p5->next;
}
/*******************
****插入链表********
*******************/
p6=(ren *)malloc(sizeof(ren));
printf("请输入学号:");
scanf("%d",p6->num);
printf("\n请输入分数:");
scanf("%d",p6->score);
p7=head;
if(p7==NULL)/*判断是否为空链表*/
{
head=p6;
p6->next=NULL;
}
else
{
for(;p6->num>p7->num&&p7->next!=NULL;)/*当输入学号大于已知学号且不是尾结点,指针下移*/
{
p8=p7;
p7=p7->next;
}
if(p6->num<p7->num)
{
if(p7==head)/*当输入学号大于迁移结点学号时判断是否为头结点*/
{
head=p6;
p6->next=p7;
}
else /*一般情况插入*/
{
p8->next=p6;
p6->next=p7;
}
}
else /*尾结点插入*/
{
p7->next=p6;
p6->next=NULL;
}
}
p=head;/*打印数据*/
for(;p!=NULL;)
{
printf("%d %d\n",p->num,p->score);
p=p->next;
}
}
你有 指针 和 for 强迫证。
其中先明显指出
/*******************
****插入链表********
*******************/
p6=(struct ren *)malloc(sizeof(struct ren));
printf("请输入学号:");
scanf("%d", &p6->num);
printf("\n请输入分数:");
scanf("%d", &p6->score);
按你的代码修改(仔细对比): #include<stdio.h>
#include<stdlib.h>
int main()
{
struct ren
{
int num;
double score;
struct ren *next;
};/*定义结构体*/
struct ren *head,*p1,*p2,*p,*p3,*p4,*p5,*p6,*p7,*p8;/*定义指针*/
int n=0,num;
head = p1 = p2 = NULL;
do
{
p1=(struct ren *)malloc(sizeof(struct ren));/*开辟新结点*/
printf("输入第%d个学号:", n+1);
scanf("%d",&p1->num);
printf("\n");
printf("请输入分数:");
scanf("%d",&p1->score);
printf("\n");
// 头节点
if(n==0)
{
head=p2=p1;
}
p2->next=p1;
// 不是结束结点
if(p1->num!=0)
{
p2=p1;
}
n++;
}while(p1->num!=0);
p2->next=NULL;/*最后地址置零*/
printf("一共%d名同学:\n",n);
p=head;/*打印数据*/
while(p!=NULL)
{
printf("%d %d\n",p->num,p->score);
p=p->next;
}
/*删除链表*****************
**************************/
if(head==NULL)/*判断是否为空链表*/
{
printf("空表");
}
else
{
p3=head;
printf("输入删除的学号:");
scanf("%d",&num);
while(num!=p3->num && p3->next!=NULL)/*不是删除节点且不是尾结点 指针下移*/
{
p4=p3;
p3=p3->next;
}
if(num==p3->num)/*是否为删除节点*/
{
if(p3==head)/*删除头结点*/
{
head=p3->next;
}
else/*一般情况*/
{
p4->next=p3->next;
}
}
}
p5=head;/*打印删除后的链表*/
while(p5!=NULL)
{
printf("%d %d\n",p5->num,p5->score);
p5=p5->next;
}
/*******************
****插入链表********
*******************/
p6=(struct ren *)malloc(sizeof(struct ren));
printf("请输入学号:");
scanf("%d", &p6->num);
printf("\n请输入分数:");
scanf("%d", &p6->score);
if(head==NULL)/*判断是否为空链表*/
{
head=p6;
head->next=NULL;
}
else
{
p7 = head;
while( (p6->num > p7->num) && (p7->next != NULL) )/*当输入学号大于已知学号且不是尾结点,指针下移*/
{
p8=p7;
p7=p7->next;
}
// 头插
if (p6->num < p7->num)
{
if(p7==head)
{
head=p6;
p6->next=p7;
}
else /*一般情况插入*/
{
p8->next=p6;
p6->next=p7;
}
}
else /*尾结点插入*/
{
p7->next=p6;
p6->next=NULL;
}
}
p=head;/*打印数据*/
while(p!=NULL)
{
printf("%d %d\n",p->num,p->score);
p=p->next;
}
}
|
|