|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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;
- }
-
-
- }
复制代码
|
|