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

来自:    更新日期:早些时候
C语言 链式储存问题,实现两个多项式的相加并运算~

把scanf格式串中的逗号去掉,直接写成%d%d,输入时中间留个空格。学学给代码下断点,看看中断处的变量值是否符合预期

线性表种简单、基本用数据结构其用途十广泛例用带表结点单链表求解元整系数项式加乘运算 现给两元整系数项式请求解两者乘积 输入 两组数据每组代表元整系数项式行组其每行给项式每项系数指数些行按指数递减序排序每组结束行输入0 -1 输 三组数据前两组元整系数项式组两项式乘积 元整系数项式输形式: (1)项式项4x输4X (2)项式项4x2输4X^2 (3)第项系数数加号要输 (4)除系数项外项系数1显式输-1输- 例4x3- x2+x-1确输形式4X^3-X^2+X-1错误输形式 +4X^3-1X^2+1X-1 例输入 3 14 -8 8 6 2 2 0 0 -1 2 10 4 8 -6 2 0 -1 例输 3X^14-8X^8+6X^2+2 2X^10+4X^8-6X^2 6X^24+12X^22-16X^18-50X^16+12X^12+76X^10+8X^8-36X^4-12X^2 刚做完项式加趁热打铁做项式乘其实乘遍历两项式系数相乘指数相加: 指数相同项合并; 没指数相同项按照指数递减顺序找合适位置存放该项目 再输

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);

}


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

相关评论:

相关主题精彩

版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

Copyright © 喜物网