单链表实现一元多项式相加功能
作者:互联网
学习了链表后尝试使用链表来完成一元多项式的相加功能,在debug的过程中重新温习了程序调试的步骤,也发现了一个不容易发现的小bug:注意在创建链表时注意让最后一个指针的next域的初始化(即指向NULL),不然形成野指针在进行判断时会造成问题。
代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int coef;//系数
int exp;//指数
struct Node *next;
}Node,*LinkList;
void InitList(LinkList *L);
void CreatList_a(LinkList L);
void CreatList_b(LinkList L);
void AddList(LinkList La,LinkList Lb);
void PutList(LinkList La);
int main(){
LinkList La,Lb;
InitList(&La);
CreatList_a(La);
InitList(&Lb);
CreatList_b(Lb);//创建两个需要相加的单链表
AddList(La,Lb);
PutList(La);
return 0;
}
void InitList(LinkList* L){
*L=(Node*)malloc(sizeof(Node));
(*L)->next=NULL;
}
void CreatList_a(LinkList L){
Node *tail,*s;
int flag=1;
int c,e;//系数和指数
tail=L;
while(flag!=0){
printf("请从小到大顺序分别输入第一个系数和指数,指数输入-1时输入结束\n");
scanf("%d%d",&c,&e);
if(e!=-1){
s=(LinkList)malloc(sizeof(Node));
tail->next=s;
tail=s;
s->coef=c;
s->exp=e;
}else{
tail->next=NULL;//初始化最后一个节点的next域
flag =0;//输入结束
}
}
}
void CreatList_b(LinkList L){
Node *tail,*s;
int flag=1;
int c,e;//系数和指数
tail=L;
while(flag!=0){
printf("请从小到大顺序分别输入第二个系数和指数,指数输入-1时输入结束\n");
scanf("%d%d",&c,&e);
if(e!=-1){
s=(LinkList)malloc(sizeof(Node));
tail->next=s;
tail=s;
s->coef=c;
s->exp=e;
}else{
tail->next=NULL;
flag =0;//输入结束
}
}
}
void AddList(LinkList La,LinkList Lb){
Node *tail;//相加链表的尾指针
Node *p,*q;//读取的指针
Node *del;//删除用指针
int sum;
tail=La;
p=La->next;
q=Lb->next;
while(p!=NULL&&q!=NULL){
if(p->exp < q->exp){
tail->next=p;tail=p;p=p->next;//tail->next=p是必须的,不然tail的next有可能接入到q中
}else if(p->exp==q->exp){
sum=p->coef+q->coef;
if(sum!=0){
p->coef=sum;
tail->next=p;tail=p;p=p->next;
del=q;q=q->next;free(del);
}else{
del=p;p=p->next;free(del);
del=q;q=q->next;free(del);
}
}else if(p->exp>q->exp){
tail->next=q;tail=q;q=q->next;
}
}
if(p!=NULL){
tail->next=p;
}else{
tail->next=q;
}//判断未加完的线性表
free(Lb);
}//一元多项式相加
void PutList(LinkList La){
Node *m;
m=La->next;
while(m!=NULL){
if(m->next!=NULL){
printf("%dx%d+",m->coef,m->exp);
m=m->next;
}else{
printf("%dx%d",m->coef,m->exp);
m=m->next;
}
}
}//输出链表
标签:Node,单链,La,多项式,相加,next,LinkList,tail,exp 来源: https://blog.csdn.net/foreung/article/details/123647407