鱼C论坛

 找回密码
 立即注册
查看: 991|回复: 2

[已解决]求大神指点 插入链表代码编译没有报错 运行后报错

[复制链接]
发表于 2019-2-27 15:01:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在插入链表部分出错,不能正确插入数据,插入的是一堆乱七八糟的数,并且调试出现这个错误
Program received signal SIGSEGV,Segmentation fault.

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5.         struct ren
  6. {
  7.         int num;
  8.         double score;
  9.         ren *next;
  10. };/*定义结构体*/
  11.         ren *head,*p1,*p2,*p,*p3,*p4,*p5,*p6,*p7,*p8,*p9;/*定义指针*/
  12.         int n=0,num;
  13.         head=NULL;/*头地址置零*/
  14.         p2=p1=(ren *)malloc(sizeof(ren));

  15.         printf("输入第一个学号:");/*输入第一个数据*/
  16.         scanf("%d",&p1->num);
  17.         printf("\n");
  18.         printf("请输入分数:");
  19.         scanf("%d",&p1->score);
  20.         printf("\n");
  21.         for(;p1->num!=0;)/*判断学号是否为0否则循环输入数据*/
  22.         {
  23.                         n++;
  24.                 if(n==1)
  25.                 {
  26.                         head=p1;
  27.                 }
  28.                 else
  29.                 {
  30.                         p2->next=p1;
  31.                 }
  32.                 p2=p1;
  33.         p1=(ren *)malloc(sizeof(ren));/*开辟新结点*/
  34.         printf("输入第一个学号:");
  35.                 scanf("%d",&p1->num);
  36.                 printf("\n");
  37.                 printf("请输入分数:");
  38.                 scanf("%d",&p1->score);
  39.                 printf("\n");
  40.         }
  41.         p2->next=NULL;/*最后地址置零*/
  42.         printf("一共%d名同学:\n",n);
  43.         p=head;/*打印数据*/
  44.         for(;p!=NULL;)
  45.         {
  46.                 printf("%d     %d\n",p->num,p->score);
  47.                 p=p->next;
  48.         }
  49.        
  50.        
  51.        
  52.         /*删除链表*****************
  53.         **************************/
  54.         if(head==NULL)/*判断是否为空链表*/
  55.         {
  56.                 printf("空表");
  57.         }
  58.         else
  59.         {
  60.                 p3=head;
  61.                 printf("输入删除的学号:");
  62.                 scanf("%d",&num);
  63.                 while(num!=p3->num&&p3->next!=NULL)/*不是删除节点且不是尾结点 指针下移*/
  64.                 {
  65.                     p4=p3;
  66.                         p3=p3->next;         
  67.                 }       
  68.         }
  69.                 if(num==p3->num)/*是否为删除节点*/
  70.                     {
  71.                              if(p3==head)/*删除头结点*/
  72.                              {
  73.                                       head=p3->next;
  74.                              }
  75.                              else/*一般情况*/
  76.                              {
  77.                                     p4->next=p3->next;
  78.                               }
  79.                     }
  80.         p5=head;/*打印删除后的链表*/
  81.         for(;p5!=NULL;)
  82.         {
  83.                 printf("%d     %d\n",p5->num,p5->score);
  84.                 p5=p5->next;
  85.         }
  86.        
  87.        
  88.         /*******************
  89.         ****插入链表********
  90.         *******************/
  91.         p6=(ren *)malloc(sizeof(ren));
  92.         printf("请输入学号:");
  93.         scanf("%d",p6->num);
  94.         printf("\n请输入分数:");
  95.         scanf("%d",p6->score);
  96.         p7=head;
  97.         if(p7==NULL)/*判断是否为空链表*/
  98.         {
  99.                 head=p6;
  100.                 p6->next=NULL;
  101.         }
  102.         else
  103.         {
  104.                 for(;p6->num>p7->num&&p7->next!=NULL;)/*当输入学号大于已知学号且不是尾结点,指针下移*/
  105.                 {
  106.                         p8=p7;
  107.                         p7=p7->next;
  108.                 }
  109.                 if(p6->num<p7->num)
  110.                 {
  111.                         if(p7==head)/*当输入学号大于迁移结点学号时判断是否为头结点*/
  112.                         {
  113.                                 head=p6;
  114.                                 p6->next=p7;
  115.                         }
  116.                         else     /*一般情况插入*/
  117.                         {
  118.                                 p8->next=p6;
  119.                                 p6->next=p7;       
  120.                         }       
  121.                 }
  122.                 else  /*尾结点插入*/
  123.                 {
  124.                         p7->next=p6;
  125.                         p6->next=NULL;
  126.                 }       
  127.         }
  128.         p=head;/*打印数据*/
  129.         for(;p!=NULL;)
  130.         {
  131.                 printf("%d     %d\n",p->num,p->score);
  132.                 p=p->next;
  133.         }
  134.          
  135.        
  136. }

复制代码
最佳答案
2019-2-27 17:44:15
你有 指针 和 for 强迫证。


其中先明显指出
        /*******************
        ****插入链表********
        *******************/
        p6=(struct ren *)malloc(sizeof(struct ren));
        printf("请输入学号:");
        scanf("%d", &p6->num);
        printf("\n请输入分数:");
        scanf("%d", &p6->score);


按你的代码修改(仔细对比):
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5.         struct ren
  6.                 {
  7.                                 int num;
  8.                                 double score;
  9.                                 struct ren *next;
  10.                 };/*定义结构体*/

  11.         struct ren *head,*p1,*p2,*p,*p3,*p4,*p5,*p6,*p7,*p8;/*定义指针*/
  12.         int n=0,num;
  13.                
  14.                 head = p1 = p2 = NULL;
  15.         do
  16.                 {                       
  17.                         p1=(struct ren *)malloc(sizeof(struct ren));/*开辟新结点*/
  18.                         printf("输入第%d个学号:", n+1);
  19.                         scanf("%d",&p1->num);
  20.                         printf("\n");
  21.                         printf("请输入分数:");
  22.                         scanf("%d",&p1->score);
  23.                         printf("\n");

  24.                         // 头节点
  25.                         if(n==0)
  26.                         {
  27.                                 head=p2=p1;
  28.                         }

  29.                         p2->next=p1;

  30.                         // 不是结束结点
  31.                         if(p1->num!=0)
  32.                         {
  33.                                 p2=p1;
  34.                         }

  35.                         n++;

  36.         }while(p1->num!=0);


  37.         p2->next=NULL;/*最后地址置零*/
  38.         printf("一共%d名同学:\n",n);
  39.         p=head;/*打印数据*/
  40.         while(p!=NULL)
  41.         {
  42.                 printf("%d     %d\n",p->num,p->score);
  43.                 p=p->next;
  44.         }
  45.         
  46.         
  47.         
  48.         /*删除链表*****************
  49.         **************************/
  50.         if(head==NULL)/*判断是否为空链表*/
  51.         {
  52.                         printf("空表");
  53.         }
  54.         else
  55.         {
  56.                         p3=head;
  57.                         printf("输入删除的学号:");
  58.                         scanf("%d",&num);
  59.                         while(num!=p3->num && p3->next!=NULL)/*不是删除节点且不是尾结点 指针下移*/
  60.                         {
  61.                                 p4=p3;
  62.                                 p3=p3->next;         
  63.                         }     
  64.                        

  65.                         if(num==p3->num)/*是否为删除节点*/
  66.             {
  67.                                  if(p3==head)/*删除头结点*/
  68.                                  {
  69.                                         head=p3->next;
  70.                                  }
  71.                                  else/*一般情况*/
  72.                                  {
  73.                                         p4->next=p3->next;
  74.                                  }
  75.             }
  76.         }

  77.         p5=head;/*打印删除后的链表*/
  78.         while(p5!=NULL)
  79.         {
  80.                 printf("%d     %d\n",p5->num,p5->score);
  81.                 p5=p5->next;
  82.         }
  83.         
  84.         
  85.         /*******************
  86.         ****插入链表********
  87.         *******************/
  88.         p6=(struct ren *)malloc(sizeof(struct ren));
  89.         printf("请输入学号:");
  90.         scanf("%d", &p6->num);
  91.         printf("\n请输入分数:");
  92.         scanf("%d", &p6->score);
  93.         
  94.         if(head==NULL)/*判断是否为空链表*/
  95.         {
  96.                 head=p6;
  97.                 head->next=NULL;
  98.         }
  99.         else
  100.         {
  101.                         p7 = head;       
  102.             while( (p6->num > p7->num) && (p7->next != NULL) )/*当输入学号大于已知学号且不是尾结点,指针下移*/
  103.             {
  104.                     p8=p7;
  105.                     p7=p7->next;
  106.             }


  107.                         // 头插
  108.                         if (p6->num < p7->num)
  109.                         {
  110.                                 if(p7==head)
  111.                                 {
  112.                                                 head=p6;
  113.                                                 p6->next=p7;
  114.                                 }
  115.                                 else     /*一般情况插入*/
  116.                                 {
  117.                                                 p8->next=p6;
  118.                                                 p6->next=p7;        
  119.                                 }        
  120.                         }

  121.             else  /*尾结点插入*/
  122.             {
  123.                     p7->next=p6;
  124.                     p6->next=NULL;
  125.             }        
  126.         }

  127.         p=head;/*打印数据*/
  128.         while(p!=NULL)
  129.         {
  130.                         printf("%d     %d\n",p->num,p->score);
  131.                         p=p->next;
  132.         }
  133.          
  134.         
  135. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-27 17:44:15 | 显示全部楼层    本楼为最佳答案   
你有 指针 和 for 强迫证。


其中先明显指出
        /*******************
        ****插入链表********
        *******************/
        p6=(struct ren *)malloc(sizeof(struct ren));
        printf("请输入学号:");
        scanf("%d", &p6->num);
        printf("\n请输入分数:");
        scanf("%d", &p6->score);


按你的代码修改(仔细对比):
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main()
  4. {
  5.         struct ren
  6.                 {
  7.                                 int num;
  8.                                 double score;
  9.                                 struct ren *next;
  10.                 };/*定义结构体*/

  11.         struct ren *head,*p1,*p2,*p,*p3,*p4,*p5,*p6,*p7,*p8;/*定义指针*/
  12.         int n=0,num;
  13.                
  14.                 head = p1 = p2 = NULL;
  15.         do
  16.                 {                       
  17.                         p1=(struct ren *)malloc(sizeof(struct ren));/*开辟新结点*/
  18.                         printf("输入第%d个学号:", n+1);
  19.                         scanf("%d",&p1->num);
  20.                         printf("\n");
  21.                         printf("请输入分数:");
  22.                         scanf("%d",&p1->score);
  23.                         printf("\n");

  24.                         // 头节点
  25.                         if(n==0)
  26.                         {
  27.                                 head=p2=p1;
  28.                         }

  29.                         p2->next=p1;

  30.                         // 不是结束结点
  31.                         if(p1->num!=0)
  32.                         {
  33.                                 p2=p1;
  34.                         }

  35.                         n++;

  36.         }while(p1->num!=0);


  37.         p2->next=NULL;/*最后地址置零*/
  38.         printf("一共%d名同学:\n",n);
  39.         p=head;/*打印数据*/
  40.         while(p!=NULL)
  41.         {
  42.                 printf("%d     %d\n",p->num,p->score);
  43.                 p=p->next;
  44.         }
  45.         
  46.         
  47.         
  48.         /*删除链表*****************
  49.         **************************/
  50.         if(head==NULL)/*判断是否为空链表*/
  51.         {
  52.                         printf("空表");
  53.         }
  54.         else
  55.         {
  56.                         p3=head;
  57.                         printf("输入删除的学号:");
  58.                         scanf("%d",&num);
  59.                         while(num!=p3->num && p3->next!=NULL)/*不是删除节点且不是尾结点 指针下移*/
  60.                         {
  61.                                 p4=p3;
  62.                                 p3=p3->next;         
  63.                         }     
  64.                        

  65.                         if(num==p3->num)/*是否为删除节点*/
  66.             {
  67.                                  if(p3==head)/*删除头结点*/
  68.                                  {
  69.                                         head=p3->next;
  70.                                  }
  71.                                  else/*一般情况*/
  72.                                  {
  73.                                         p4->next=p3->next;
  74.                                  }
  75.             }
  76.         }

  77.         p5=head;/*打印删除后的链表*/
  78.         while(p5!=NULL)
  79.         {
  80.                 printf("%d     %d\n",p5->num,p5->score);
  81.                 p5=p5->next;
  82.         }
  83.         
  84.         
  85.         /*******************
  86.         ****插入链表********
  87.         *******************/
  88.         p6=(struct ren *)malloc(sizeof(struct ren));
  89.         printf("请输入学号:");
  90.         scanf("%d", &p6->num);
  91.         printf("\n请输入分数:");
  92.         scanf("%d", &p6->score);
  93.         
  94.         if(head==NULL)/*判断是否为空链表*/
  95.         {
  96.                 head=p6;
  97.                 head->next=NULL;
  98.         }
  99.         else
  100.         {
  101.                         p7 = head;       
  102.             while( (p6->num > p7->num) && (p7->next != NULL) )/*当输入学号大于已知学号且不是尾结点,指针下移*/
  103.             {
  104.                     p8=p7;
  105.                     p7=p7->next;
  106.             }


  107.                         // 头插
  108.                         if (p6->num < p7->num)
  109.                         {
  110.                                 if(p7==head)
  111.                                 {
  112.                                                 head=p6;
  113.                                                 p6->next=p7;
  114.                                 }
  115.                                 else     /*一般情况插入*/
  116.                                 {
  117.                                                 p8->next=p6;
  118.                                                 p6->next=p7;        
  119.                                 }        
  120.                         }

  121.             else  /*尾结点插入*/
  122.             {
  123.                     p7->next=p6;
  124.                     p6->next=NULL;
  125.             }        
  126.         }

  127.         p=head;/*打印数据*/
  128.         while(p!=NULL)
  129.         {
  130.                         printf("%d     %d\n",p->num,p->score);
  131.                         p=p->next;
  132.         }
  133.          
  134.         
  135. }

复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-28 09:13:05 | 显示全部楼层
ba21 发表于 2019-2-27 17:44
你有 指针 和 for 强迫证。

谢谢  谢谢!我是学土木的,又是这种不细心的错误,太业余了!  谢谢大佬!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-18 10:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表