C语言用链表实现一元多项式的相加

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct polynode
{
float coef;
int exp;
struct polynode *next;
}polynode,*PLinklist;

PLinklist Create(int n)
{
PLinklist L,p;
int i;
L=(PLinklist)malloc(sizeof(polynode));
L->next=NULL;
for(i=n;i>0;--i)
{
p=(PLinklist)malloc(sizeof(polynode));
scanf("%f %d",&p->coef,&p->exp);
p->next=L->next;
L->next=p;
}
return(L);
}

PLinklist Attach(float co,int ex,PLinklist o)
{
PLinklist c;
c=(PLinklist)malloc(sizeof(polynode));
c->coef=co;
c->exp=ex;
o->next=c;
return c;
}

PLinklist Print(PLinklist L)
{
int i=0;
PLinklist p=L;
while(p->next!=NULL)
{
i++;
printf("%fx^%d ",p->coef,p->exp);
p=p->next;
}
printf("\n");
}

PLinklist Add(PLinklist A,PLinklist B)
{
PLinklist C;
PLinklist o;
PLinklist p=A;
PLinklist q=B;
int sum;
C=(PLinklist)malloc(sizeof(polynode));
o=C;
while(p!=NULL&&q!=NULL)
{
if(p->exp==q->exp)
{
sum=p->coef+q->coef;
if(sum!=0)
o=Attach(sum,p->exp,o);
p=p->next;
q=q->next;
}

else if(p->exp<q->exp)
{
o=Attach(q->coef,q->exp,o);
q=q->next;
}
else{
o=Attach(p->coef,p->exp,o);
p=p->next;
}
}
while(p!=NULL)
{
o=Attach(p->coef,p->exp,o);
p=p->next;
}
while(q!=NULL)
{
o=Attach(q->coef,q->exp,o);
q=q->next;
}
o->next=NULL;
p=C;
C=C->next;
return C;
}

void main()
{
int n,m;
PLinklist *A,*B,*C;
printf("Input the length of A :\n");
scanf("%d",&n);
A=Create(n);
Print(A);
printf("Input the length of B :\n");
scanf("%d",&n);
b=Create(n);
Print(b);
C=Add(A,B);
Print(C);
}

这是我写的程序,弄了好久出不来,请高手看看吧

C语言代码:

#include "stdio.h"
#include "malloc.h"

/* é“¾è¡¨ç»“点结构 */
typedef struct LNode{
    double coef;          /* ç³»æ•° */
    int exp;              /* æŒ‡æ•° */
    struct LNode *next;
}LNode;

/* åˆå§‹åŒ–链表 */
LNode *Init()
{
    LNode *head = (LNode*)malloc(sizeof(LNode));
    head->next = NULL;
    return head;
}

/* å°†å€¼ä¸ºdata的结点插入到head链表的最后 */
void AddNode(LNode *head, double coef, int exp)
{
    LNode *pre = head->next;
    LNode *temp;
    temp = (LNode*)malloc(sizeof(LNode));
    temp->coef = coef;
    temp->exp = exp;
    temp->next = NULL;
    
    if(pre == NULL)
    {
        head->next = temp;
        return;
    }
    for(; pre->next!=NULL; pre=pre->next);
    pre->next = temp;
}

/* è¾“出head链表的所有结点的值 */
void List(LNode *head)
{
    LNode *curr;
    printf("All nodes : ");
    for(curr=head->next; curr!=NULL; curr=curr->next)
    {
  printf("(%lf, %d)\t", curr->coef, curr->exp);
    }
    printf("\n");
}

/* è¿”回head链表的所有结点的数量 */
int Size(LNode *head)
{
    int len = 0;
    LNode *curr;
    for(curr=head->next; curr!=NULL; curr=curr->next,len++);
    return len;
}

LNode *Add(LNode *headA, LNode *headB)
{
    LNode *currA, *currB, *headC;
    double sum;
    currA = headA->next;
    currB = headB->next;
    headC = Init();
    while(currA!=NULL && currB!=NULL)
    {
        if(currA->exp > currB->exp)
        {
            AddNode(headC, currA->coef, currA->exp);
            currA = currA->next;
        }
        else if(currA->exp < currB->exp)
        {
            AddNode(headC, currB->coef, currB->exp);
            currB = currB->next;
        }
        else
        {
           sum = currA->coef + currB->coef;
           if(sum != 0)
           {
               AddNode(headC, sum, currA->exp);
           }
           currA = currA->next;
           currB = currB->next;
        }
    }
    while(currA != NULL)
    {
        AddNode(headC, currA->coef, currA->exp);
        currA = currA->next;
    }
    while(currB != NULL)
    {
        AddNode(headC, currB->coef, currB->exp);
        currB = currB->next;
    }
    return headC;
}

void main()
{
    LNode *headA, *headB, *headC;
 headA = Init();
 headB = Init();
    AddNode(headA, 1.0, 5);
    AddNode(headA, -1.0, 3);
    AddNode(headA, 1, 0);
    AddNode(headB, 0.5, 5);
    AddNode(headB, 1.0, 4);
    AddNode(headB, 1.0, 3);
    List(headA);
    List(headB);
    headC = Add(headA, headB);
    List(headC);
    
}


运行测试:

温馨提示:内容为网友见解,仅供参考
第1个回答  2009-10-09
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

typedef struct polynode
{
float coef;
int exp;
struct polynode *next;
}polynode,*PLinklist;

PLinklist Create(int n)
{
PLinklist L,p;
int i;

L = (PLinklist)malloc(sizeof(polynode));
L->next = NULL;

for(i=n; i>0 ;--i)
{
p = (PLinklist)malloc(sizeof(polynode));
scanf("%f%d",&p->coef,&p->exp);
p->next = L->next;
L->next = p;
}

return(L);
}

PLinklist Attach(float co,int ex,PLinklist o)
{
PLinklist c;
c = (PLinklist)malloc(sizeof(polynode));
c->coef = co;
c->exp = ex;
o->next = c;
return c;
}

void Print(PLinklist L)
{
int i = 0;
PLinklist p = L;

while(p->next != NULL)
{
i++;
printf("%fx^%d ",p->coef,p->exp);
p=p->next;
}

printf("\n");
}

PLinklist Add(PLinklist A,PLinklist B)
{
PLinklist C;
PLinklist o;
PLinklist p = A;
PLinklist q = B;

float sum;

C = (PLinklist)malloc(sizeof(polynode));

o=C;

while((p != NULL) && (q != NULL))
{
if(p->exp == q->exp)
{
sum = p->coef+q->coef;
if(sum != 0)
o = Attach(sum,p->exp,o);
p = p->next;
q = q->next;
}

else if(p->exp < q->exp)
{
o = Attach(q->coef,q->exp,o);
q = q->next;
}
else{
o = Attach(p->coef,p->exp,o);
p = p->next;
}
}
while(p != NULL)
{
o = Attach(p->coef,p->exp,o);
p = p->next;
}
while(q != NULL)
{
o = Attach(q->coef,q->exp,o);
q = q->next;
}
o->next = NULL;
p = C;
C = C->next;
return C;
}

void main()
{
int n;
PLinklist A, B, C;
printf("Input the length of A :\n");
scanf("%d",&n);
A = Create(n);
Print(A);
printf("Input the length of B :\n");
scanf("%d",&n);
B = Create(n);
Print(B);
C = Add(A,B);
Print(C);
}

OK啦 ...帮你改了下细节部分,没改你实现思路....可以编译通过的本回答被提问者采纳
第2个回答  2009-10-10
我写了一个 你看下

思路相同

#include "stdio.h"
#include "stdlib.h"
#define Null 0

typedef struct LNode
{
int coef;
int expn;
struct LNode *next;
}LNode,*Linklist;

void Creat(Linklist *L)
{
int i,j;
Linklist p,q;
(*L)=(Linklist)malloc(sizeof(LNode));
(*L)->coef=0;(*L)->next=Null;
p=*L;
scanf("%d,%d",&i,&j);
while(i!=0)
{
q=(Linklist)malloc(sizeof(LNode));
q->coef=i;q->expn=j;q->next=Null;
p->next=q;
p=q;
scanf("%d,%d",&i,&j);
}
}

void Add(Linklist La, Linklist Lb, Linklist *Lc)
{
Linklist pa=La->next,pb=Lb->next,pc;
*Lc=(Linklist)malloc(sizeof(LNode));
(*Lc)->coef=0;(*Lc)->next=Null;
pc=*Lc;
while(pa&&pb)
{
if(pa->expn<pb->expn)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
if(pa->expn>pb->expn)
{
pc->next=pb;
pc=pb;
pb=pb->next;
}
else
{
pa->coef=pa->coef+pb->coef;
pc=pa;
pa=pa->next;
pb=pb->next;
}
}
}
if(pa) pc->next=pa;
else pc->next=pb;
}

void Print(Linklist L)
{
Linklist p=L->next;
while(p)
{
printf("%d,%d\n",(int)p->coef,p->expn);
p=p->next;
}
}

int main()
{
Linklist La,Lb,Lc;
printf("Input the data of La:\n");
Creat(&La);
printf("Input the data of Lb:\n");
Creat(&Lb);
printf("\nLa:\n");
Print(La);
printf("\nLb:\n");
Print(Lb);
printf("\nAdd La and Lb to Lc:\n");
Add(La,Lb,&Lc);
Print(Lc);
printf("\n");
getch();
return 0;
}

用C语言实现数据结构的题目:一元多项式相加
struct poly *jisuan(struct poly *head1,struct poly *head2) \/\/多项式的相加 { struct poly *p1,*p2,*r1,*r2;r1=head1;p1=head1->next;r2=p2=head2->next;while(p1&&p2){ if(p1->zhi==p2->zhi){ p1->xi=(p1->xi)+(p2->xi);p2=p2->next;free(r2);r2=p2;r1=p1;p1=...

设计一个一元多项式计算器,输入输出,多项式相加(C语言)
}\/\/以上为将第二个多项式建立成链表 t1=h1=head;t2=tou;\/\/t1,t2分别指向当前结点,h1起辅助作用,第二个链表我们不要,所以可以用tou做辅助作用 while(t1&&t2)\/\/当前结点都不为空 { if(t1->expn<t2->expn)\/\/第一个链表的当前位置的指数小于第二个链表 { h1=t1;t1=t1->next;} else if...

C语言:用单链表实现任意两个一元多项式的加、减法运算
include <stdio.h> include <stdlib.h> include <string.h> define N 7 typedef enum { add, nul, sub, div1, yu, l, r }OP;int a[N][N] = { { 0, 0, -1, -1, -1, 1, 2 },{ 0, 0, -1, -1, -1, 1, 2 },{ 1, 1, 0, 0, 0, 1, 2 },{ 1, 1...

用链式结构写两个一元多项式相加
} \/\/两个多项式相加 void ListAdd(LinkList *&L1,LinkList *&L2,LinkList *&L3){ int coefficient[2*MAX],power[2*MAX],i=0;LinkList *p=L1->next,*q=L2->next;while(p!=NULL&&q!=NULL){ if(p->powerpower){ coefficient[i]=p->coefficient;power[i]=p->power;i++;p=p->...

[内附完整源码和文档] 基于C语言实现的一元多项式的计算
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减操作。3.1.1 单连表的抽象数据类型定义 ADT List{ 数据对象: D={ai|ai∈ElemSet,i=1,2,…,n,n≥0} 数据关系: R1={<ai-1,ai>| ai-1, ai∈D,i=2,…,n} 基本...

用链表写一个关于一元多项式相加的小程序,求大神看看帮忙讲解一下,十分...
if(ptr->cofe!=0) 是用于判断所求当前项的系数是否为0,如果为0那么这个项不再加入结果链表中,也就是free(ptr)将其释放了;否则的话,将当前项插入结果链表ans_h中,此时分为两种情况:如果ans_h为空链表,那么就将ans_h指向ptr所指的项,作为首节点;将ptr指针插入prev所指节点之后,即prev的...

C语言写多项式相加怎么写?求解
接着,输入第二个多项式的项数和创建链表,再打印第二个多项式。调用AddPolyn()函数实现两多项式的加法,将结果存储在第三个链表中。最后,打印相加结果并暂停程序执行。总结,通过定义链表节点结构并实现创建、打印、加法、删除和插入操作的函数,我们可以用C语言解决多项式相加的问题。程序结构清晰,易于理解...

...用单链表储存一元多项式,并实现两个多项式的相加运算(语法没有错误...
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;...

C语言写一个程序,用链表实现多项式相加相减
\/\/要求:多项式按降幂排列#include<stdafx.h>#include<iostream.h>struct node{int coef;\/\/系数int exp;\/\/指数node * next;};node * h1=NULL;\/\/第一个多项式的头指针node * h2=NULL;\/\/第二个多项式的头指针node * insert(int c,int e)\/\/创建一个系数为c,指数为e的结点,并返回其地址{...

C语言用单链表完成多项式相加,代码如下,麻烦帮忙修改一下
{ int coef;int exp;struct poly *next;}Lpoly;Lpoly* creatpoly();\/\/void creatpoly();\/\/<<<返回值类型!!void printpoly(Lpoly*h);Lpoly* addpoly(Lpoly*pa,Lpoly*pb);\/\/void addpoly(Lpoly*pa,Lpoly*pb);\/\/<<<返回值类型!!void main(){ Lpoly*pa,*pb,*pc;printf("第一个表达式...

相似回答