数据结构c语言 用单链表储存一元多项式,并实现两个多项式的相加运算(语法没有错误)可能指针错了

#include<stdio.h>
#include <malloc.h>
#define MAX 20 //多项式最多项数
typedef struct{
double ratio;
int exp;
} ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
void CreateListR(LinkList *&L,ElemType a[],int n)
{ LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for (i=0;i<n;i++)
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
void DestroyList(LinkList *&L) //销毁链表
{
LinkList *pre =L, *p=L->next;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
void DispList(LinkList *L)
{ LinkList *p=L->next;
while (p!=NULL)
{ printf("%dx^%d",p->data.ratio,p->data.exp);
p=p->next;
}
printf("\n");
}
void Add(LinkList *P1,LinkList *P2,LinkList *&P3)
{ LinkList *p=P1,*q=P2;
P3=(LinkList *)malloc(sizeof(LinkList));
int i;
for (i = 0; i<MAX; i++)
{
if ((p->data.exp)>(q->data.exp))
{
P3->data.exp = p->data.exp;
P3->data.ratio = p->data.ratio;
if (p!=NULL)
p = p->next;
}
else if ((p->data.exp) == (q->data.exp))
{
P3->data.ratio = (p->data.ratio) + (q->data.ratio);
P3->data.exp = p->data.exp;
if (p != NULL)
p = p->next;
if (q != NULL)
q = q->next;
}
else{
P3->data.exp = q->data.exp;
P3->data.ratio = q->data.ratio;
if (q != NULL)
q= q->next;
}
}
}
void BubbleSort(ElemType st[],int n)
{
int i, j;
ElemType tmp;
for (i = 0; i < n; i++)
{
for(j=n-1;j>i;j--)
if(st[j].exp<st[j-1].exp)
{
tmp=st[j];
st[j]=st[j-1];
st[j - 1] = tmp;
}
}
}
void main()
{
int num1=5, num2=5;
LinkList *L1, *L2, *L3;
L1 = (LinkList *)malloc(sizeof(LinkList));
L2 = (LinkList *)malloc(sizeof(LinkList));
L3 = (LinkList *)malloc(sizeof(LinkList));
ElemType st1[] = { {5,5}, {4,4}, {7,7}, {6,6}, {2,2} };
ElemType st2[] = { {5,5}, {8,8}, {7,7}, {3,3}, {2,2} };
BubbleSort(st1, num1);
BubbleSort(st2, num2);
CreateListR(L1, st1, num1);
CreateListR(L2, st2, num2);
Add(L1, L2, L3);
DispList(L3);
DestroyList(L1);
DestroyList(L2);
DestroyList(L3);

}
void Add(LinkList *P1,LinkList *P2,LinkList *&P3)里面的算法有点问题!

我依照你的算法,补充了一下程序!里面新编写了一个函数void CopyList(LinkList * a,LinkList *b) ;
同时void Add(LinkList *P1,LinkList *P2,LinkList *&P3做了一点修改!也许,程序的可读性不好,你可以自己再修改!代码如下:

#include<stdio.h>
#include <malloc.h>
#define MAX 20 //亏银多项式最多项数
typedef struct{
double ratio;
int exp;
} ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
} LinkList;
void CreateListR(LinkList *&L,ElemType a[],int n)
{ LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for (i=0;i<n;i++)
{ s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
/*
将一个链表的部分或全部结点复制到另一个链表中,
a是新链表的最后一个结点,b是被复制链姿培表的某一结点
即让要复制的结点加到新链表的尾部*/
void CopyList(LinkList * a,LinkList *b) //
{
LinkList *temp,*last; //temp临时指针,last指向新链表的最后一个结点
last=a;
/*循环体中实现从结点b开始到链表结束,将各结点复制到新链表中*/
while(b!=NULL)
{
temp=(LinkList *)malloc(sizeof(LinkList)); //新建一个结点
temp->data=b->data; //将链表当前要复制的结点b复制到新结点中
last->next=temp; //将新建的结点销册宴加到新链表的末端
last=temp; //last指向尾结点,刚才新建的结点已成为新链表的尾结点
b=b->next; //遍历链表的下一个结点b
}
last->next=NULL; //新链表尾结点中next指针的值设为NULL,即新链表创建完成
}
void DestroyList(LinkList *&L) //销毁链表
{
LinkList *pre =L, *p=L->next;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
void DispList(LinkList *L)
{ LinkList *p=L->next;
while (p!=NULL)
{ printf("%fx^%d ",p->data.ratio,p->data.exp);
p=p->next;
}
printf("\n");
}
void Add(LinkList *P1,LinkList *P2,LinkList *&P3)
{ LinkList *p=P1->next,*q=P2->next;
LinkList *head; //链表P3的头指针
head=(LinkList *)malloc(sizeof(LinkList)); //新建头结点
P3=head;
int i;
for (i = 0; i<MAX; i++)
{
P1=(LinkList *)malloc(sizeof(LinkList)); //新建一个结点
P3->next=P1; //将新建的结点加到合并后链表中
P3=P1;

/*注意这里是'<',链表的结点已经从小到大排列有序,
每次比较都选择较小的结点加到合并后的链表P3中*/

if ((p->data.exp)<(q->data.exp))
{
P3->data.exp = p->data.exp;
P3->data.ratio = p->data.ratio;
if (p->next!=NULL) //如果链表P1的下一个结点存在,则遍历下一个结点
p = p->next;
else //否则,将另一个链表P2剩余的结点加到链表P3中,链表P3建立完成
{
CopyList(P3,q);
break;
}
}

/*下面其他两种情况的处理都是同一个道理,
在比较过程中,只要其中一个链表的所有结点都遍历了,
此时只需要将另一个链表的剩余结点都加到P3中,就可以完成链表的合并
*/

else if ((p->data.exp) == (q->data.exp))
{
P3->data.ratio = (p->data.ratio) + (q->data.ratio);
P3->data.exp = p->data.exp;
if (p ->next!= NULL)
p = p->next;
else
{
CopyList(P3,q->next);
break;
}
if (q->next != NULL)
q = q->next;
else
{
CopyList(P3,p->next);
break;
}
}
else{
P3->data.exp = q->data.exp;
P3->data.ratio = q->data.ratio;
if (q->next != NULL)
q= q->next;
else
{
CopyList(P3,p);
break;
}
}
}
/*在建立链表过程中,指针P3的值一直在改变,因此在完成合并链表后必须使P3指向头结点*/
P3=head;
}
void BubbleSort(ElemType st[],int n)
{
int i, j;
ElemType tmp;
for (i = 0; i < n; i++)
{
for(j=n-1;j>i;j--)
if(st[j].exp<st[j-1].exp)
{
tmp=st[j];
st[j]=st[j-1];
st[j - 1] = tmp;
}
}
}
void main()
{
int num1=5, num2=5;
LinkList *L1, *L2, *L3;
L1 = (LinkList *)malloc(sizeof(LinkList));
L2 = (LinkList *)malloc(sizeof(LinkList));
L3 = (LinkList *)malloc(sizeof(LinkList));
ElemType st1[] = { {5,5}, {4,4}, {7,7}, {6,6}, {2,2} };
ElemType st2[] = { {5,5}, {8,8}, {7,7}, {3,3}, {2,2} };
BubbleSort(st1, num1);
BubbleSort(st2, num2);
CreateListR(L1, st1, num1);
CreateListR(L2, st2, num2);
DispList(L1);
DispList(L2);
Add(L1, L2, L3);
DispList(L3);
DestroyList(L1);
DestroyList(L2);
DestroyList(L3);

}