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