
uj5u.com熱心網友回復:
這貼的圖片,可能很難一下就看出哪里的問題阿。。。
uj5u.com熱心網友回復:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define NULL 0
typedef struct Polynode {
int coef; //因子
int exp; //冪
struct Polynode *next;
}Polynode , * Polylist;
Polylist polycreate( )
{
Polynode *rear, *head, *s;
int c, e;
rear=head=(Polynode *)malloc(sizeof(Polynode));
scanf("%d%d",&c,&e);
while(c!=0)
{
s=(Polynode*)malloc(sizeof(Polynode));
s->coef=c;
s->exp=e;
rear->next=s;
rear=s;
scanf("%d%d",&c,&e);
}
rear->next=NULL;
return(head);
}
Polylist multyploy(Polylist pa, Polylist pb)
{
Polynode *t1,*t2,*t3,*t,*rear,*p;
int c, e;
t1=pa->next;
t2=pb->next;
rear=p=(Polynode*)malloc(sizeof(Polynode));
while(t2)
{
t3=(Polynode*)malloc(sizeof(Polynode));
t3->coef=t1->coef*t2->coef;
t3->exp=t1->exp+t2->exp;
t3->next=NULL;
rear->next=t3;
rear=t3;
t2=t2->next;
}
t1=t1->next;
while(t1)
{
t2=pb->next;
rear=p;
while(t2)
{
e=t1->exp+t2->exp;
c=t1->coef*t2->coef;
while(rear->next&&rear->next->exp<e)
rear=rear->next;
if(rear->next&&rear->next->exp==e)
{
if(rear->next->coef+c)
rear->next->coef+=c;
else
{
t=rear->next;
rear->next=t->next;
free(t);
}
}
else
{
t=(Polynode*)malloc(sizeof(Polynode));
t->coef=c;
t->exp=e;
t->next=rear->next;
rear->next=t;
rear=rear->next;
}
}
t1=t1->next;
}
return (p);
}
void print(Polylist p)
{
p = p->next;
while(p)
{
printf("%d", p->coef);
printf("*x^%d",p->exp);
if(p->next!=NULL)
printf(" + ");
p = p->next;
}
printf("\n");
}
void main(int argc, char* argv[])
{
Polylist pa, pb,pc; //定義三個表示多項式的鏈表
pa = polycreate(); //創建pa鏈表
pb = polycreate(); //創建pb鏈表
pc = multyploy(pa, pb); //做乘法法,結果保存在pc鏈表上
print(pc); //將加法的結果用一個多項式格式顯示在輸出設備上
}
uj5u.com熱心網友回復:
大佬想要啥樣的,我實在找不出來問題在哪了
uj5u.com熱心網友回復:
試了一下上面的代碼, 貌似出現無限回圈的情況, 實在有點看不懂上面的代碼,下面改寫了一個,還請指正
/**
* 在多項式中查找是否有冪為exp的項,
* 如有,回傳指向Polynode指標
* 否則回傳NULL
*/
Polynode* searchByExp(Polylist p, int exp)
{
Polynode* x = p->next;
while(x!=NULL) {
if(x->exp == exp) {
return x;
}
x = x->next;
}
return NULL;
}
Polylist multyploy2(Polylist pa, Polylist pb)
{
Polynode *t1,*t2, *t3, *rear,*p;
t1=pa->next;
t2=pb->next;
rear=p=(Polynode*)malloc(sizeof(Polynode));
p->next = NULL;
while(t1!=NULL) {
t2 = pb->next;
while(t2!=NULL) {
t3 = searchByExp(p, t1->exp+t2->exp );
if(t3==NULL) {
// 生成新的項加入到p
t3=(Polynode*)malloc(sizeof(Polynode));
t3->coef=t1->coef*t2->coef;
t3->exp = t1->exp + t2->exp;
t3->next=NULL;
rear->next=t3;
rear=t3;
}
else {
t3->coef += (t1->coef*t2->coef);
}
t2=t2->next;
}
t1 = t1->next;
}
return p;
}
uj5u.com熱心網友回復:
我上面的代碼是,分別給pa,pb鏈表賦值,冪從小到大,當賦值到因子為零時,結束回圈,然后以第一個多項式的第一項和第二個多項式的每一項相乘,構造一個新的鏈表,然后以第一個多項式的第二項和第二個多項式的每一項相乘,查找第一個大于或等于這個冪的在鏈表中的位置,如果冪相等,則因數相加,相加如果等于零,則釋放掉這個空間,如果查找到的大于這個冪,則將其插入,最后輸出,可是我這構造的第一項與每一項相乘的新鏈表,單獨的話可以輸出,進行下面插入操作以后就不能輸出了,不知道問題出現在哪里。
uj5u.com熱心網友回復:
我的代碼和你的基本也差不多,唯一的一點時, 在計算時, 沒有處理coef==0 的情況, 問題是, 當計算某個項coef為0時, 后面的多項式又可能會出現這個項, 所以建議最后計算完后才處理coef==0 的式子, 另外一點,在生成 c 多項式時, 最好以插入排序的方式, 根據冪的大小, 由高到低排列, 這樣多項式列印時,比較符合習慣。
uj5u.com熱心網友回復:
我這個輸入時按從小到大輸入會比較方便,就是不懂為什么最后輸出不了
uj5u.com熱心網友回復:
不管是從大到小, 還是從小到大, 都可以,其實要處理coef =0 的情況還是有些麻煩的, 比如 一個多項式, p=0x, 需要化簡為 p=0, 還是 p=空
關于你的代碼,貌似沒有必要對第一次回圈做特殊處理, 只用2層while 就可以了把, 偽代碼是:
while each 式子 of A {
while each 式子 of B {
計算 A[i] * B[j] ,
加入到 C 中
}
}
while each 式子 of C {
處理coef ==0
}
uj5u.com熱心網友回復:
不管是從大到小, 還是從小到大, 都可以,
其實要處理coef =0 的情況還是有些麻煩的, 比如 一個多項式, p=0x, 需要化簡為 p=0, 還是 p=空
關于你的代碼,貌似沒有必要對第一次回圈做特殊處理, 只用2層while 就可以了把, 偽代碼是:
while each 式子 of A {
while each 式子 of B {
計算 A[i] * B[j] ,
加入到 C 中
}
}
while each 式子 of C {
處理coef ==0
}
我把中間相乘的函式改了一下,改成先把相乘結果各項存入鏈表,然后再同類項相加,可是還是無法輸出,如果知道為什么無法輸出,問題就解決了
Polylist multyploy(Polylist pa, Polylist pb)
{
Polynode *t1,*t2,*t3,*t,*rear,*p,*r;
int c, e;
t1=pa->next;
p=(Polynode*)malloc(sizeof(Polynode));
rear=p;
while(t1)
{
t2=pb->next;
while(t2)
{
t=(Polynode*)malloc(sizeof(Polynode));
t->coef=t1->coef*t2->coef;
t->exp=t1->exp+t2->exp;
t->next=NULL;
rear->next=t;
rear=t;
t2=t2->next;
}
t1=t1->next;
}
r=p->next;
while(r->next)
{
t3=r->next;
while(t3&&t3->exp!=r->exp)
t3=t3->next;
if(t3==NULL)
continue;
else
{
r->coef=r->coef+t3->coef;
t=t3->next;
t3->next=t->next;
free(t);
}
r=r->next;
}
return (p);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/159485.html
標籤:C語言
下一篇:python 裝飾器
