#include
#include
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"输入lb有几项:"); scanf("%d",&sum);
for(i=0;i0;
free_list(la);
}
见下面说明
如果 交换的话,会先访问 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;
}
望采纳!!!点击回答右侧采纳即可采纳!!
这是因为在该语句中,你使用了两个变量:current和u->e。
如果在这个循环中,current变量是空指针或者u->e变量是一个非法值,就会发生段错误。这就是为什么你把条件换一下子就会报错的原因。
你可以尝试检查current变量和u->e变量的值,确保它们都有效。例如,你可以在循环开始前检查current是否是空指针,并在循环体内部检查u->e是否是一个有效的指数。