Unique_Dust 2023-01-07 22:00 采纳率: 50%
浏览 42
已结题

按增序初始化链表当中while循环出错

在写合并链表的时候遇到一个while循环把条件换一下就会出错
在while(current && u->e>current->e )这个语句中把&&两边的条件换一下子就会报错提醒thread 1 received segmentation fault,SIGSEGV
#include<stdio.h>
#include<stdlib.h>

typedef struct list{
    double var;
    int e;
    struct list *next;
}list;

/*按增序初始化链表*/
void initial_list(list *head){
    list *u=(list*)malloc(sizeof(list));
    list *pc;
    list *current;
    pc=head;
    current=head->next;
//    printf("%p",current);
    printf("输入系数:");
    scanf("%lf",&u->var);
    printf("输入指数:");
    scanf("%d",&u->e);
    u->next=NULL;
    while(current && u->e>current->e ){
        pc=current;
        current=current->next;
    }
    pc->next=u;
    u->next=current;
}
/*合并链表,这个没错不用看*/
void insert_list(list *la,list *lb){
    list *pc=la,*pa=la->next,*pb=lb->next;
    list *temp1,*temp2;
    while(pa && pb){
        if(pa->e > pb->e){
            pc->next=pb;
            pc=pb;
            pb=pb->next;
        }
        else if(pa->e==pb->e){
            if(pa->var+pb->var==0){
                temp1=pb;temp2=pa;free(temp1);free(temp2);
                pb=pb->next; pa=pa->next;
            }
            else{
                pa->var+=pb->var;
                pc->next=pa;
                pc=pa;
                pa=pa->next;
                pb=pb->next;
            }
        }else{
            pc->next=pa;
            pc=pa;
            pa=pa->next;
        }
    }
    pc->next=pa ? pa:pb;
    free(lb);
}
/*打印链表*/
void show_list(list *la){
    la=la->next;
    while(la){
        printf("+(%.1f)x^%d",la->var,la->e);
        la=la->next;
    }
    printf("\n");
}
/*释放内存空间*/
void free_list(list *la){
    list *temp;
    while(la){
        temp=la->next;
        free(la);
        la=temp;
    }
}

int main()
{
    list *la=(list *)malloc(sizeof(list));
    list *lb=(list *)malloc(sizeof(list));
    int i=0;
    int sum;
    la->next=NULL;
    lb->next=NULL;
    printf("输入la有几项:"); scanf("%d",&sum);
    for(;i<sum;i++){
        initial_list(la);
    }
    show_list(la);
    printf("输入lb有几项:"); scanf("%d",&sum);
    for(i=0;i<sum;i++){
        initial_list(lb);
    }
    show_list(lb);
    insert_list(la,lb);
    show_list(la);
    return 0;
    
    free_list(la);
}



设置断点调试的时候就是在initial_list函数中的while语句while(current && u->e>current->e )交换&&两边条件就会报错
我怀疑是不是没有分配给u空间于是还初始化了一下添加了u->e=0;但是没用
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
  • 写回答

2条回答 默认 最新

  • X-道至简 2023-01-07 22:32
    关注

    见下面说明
    如果 交换的话,会先访问 current->e, 如果这个时候current是null空的,会出现地址非法访问

     //while(current && u->e>current->e ){ //这句话是先判断current是否为null,如果不为null才能访问e
       while(u->e>current->e && current  ){//这句话是先访问current的e,如果为null,会出现地址非法访问
            pc=current;
            current=current->next;
        }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月15日
  • 已采纳回答 1月7日
  • 创建了问题 1月7日

悬赏问题

  • ¥15 对于这个复杂问题的解释说明
  • ¥50 三种调度算法报错 采用的你的方案
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败