两个多项式相加运算(用c语言)

多项式如下例所示:
7.2X500+9X100+2X3+2X2+100 与 3x3000+35X2000+18X100-2x3+1000
相加后的结果为:3x3000+35X2000 +7.2X500 +27X100+2X2+1100
提示:a. 多项式采用链表结构存储。
1. 采用尾插法建立多项式的存储结构即单链表
2. 将exp域值按递减排序构成有序单链表
3. 求两个有序单链表的合并:对于exp域值相同的两个结点进行合并,合并时判定两个结点的coef域值之和,不为0时创建新结点,插入到新链表中;对于exp域值不相同的结点直接按序插入到新链表中。

对于链表结构创建以下函数:
1. 尾插法创建链表
2. 对链表进行递减排序
3. 求两个有序链表的合并
4. 遍历链表,输出多项式

#include<stdio.h>
#include<malloc.h>
#define Null 0
typedef struct Node
{
int coeff;
int expo;
Node *next;
}listNode,*list;

list createList()
{
list head;
head = (list)malloc(sizeof(listNode));
head = NULL;
printf("want to create a new node?y/n\n");
char ch;
fflush(stdin);
scanf("%c",&ch);
while(ch=='Y' || ch== 'y')
{
list p;
p = (list)malloc(sizeof(listNode));
printf("input coeff\n");
int coeff;
scanf("%d",&coeff);
p->coeff = coeff;
printf("input expo\n");
int expo;
scanf("%d",&expo);
p->expo = expo;
p->next = NULL;
//链表为空的时候,即添加首个元素
if(head == NULL)
{
head=p;//添加代码
}
else
{
list prev,curr;
curr = head;
prev = NULL;
//找到添加位置
while(curr!=NULL && curr->expo>p->expo)
{
prev=curr;
curr=curr->next;//添加代码
}
if(curr!=NULL && curr->expo == p->expo)
{
curr->coeff = curr->coeff + p->coeff;
printf("want to create a new node?y/n\n");
fflush(stdin);
scanf("%c",&ch);
if(ch=='Y' || ch== 'y')
continue;
else
return head;
}
//插入结点,结点非首
if(prev != NULL)
{
p->next=curr;
prev->next=p;
//添加代码
}
//插入结点,结点为首
else
{
p->next=curr;
head=p;
//添加代码
}

}
printf("want to create a new node?y/n\n");
fflush(stdin);
scanf("%c",&ch);
}
return head;
}

list add(list head1,list head2)
{
list head,newNode,ptr1,ptr2,ptr3;
ptr1 = head1;
ptr2 = head2;
head = NULL;
while(ptr1 != NULL && ptr2 != NULL)
{
newNode = (list)malloc(sizeof(listNode));
if(ptr1->expo > ptr2->expo)
{
newNode->coeff = ptr1->coeff;
newNode->expo = ptr1->expo;
newNode->next = NULL;
ptr1 = ptr1->next;
}
else if(ptr1->expo < ptr2->expo)
{
newNode->coeff = ptr2->coeff;
newNode->expo = ptr2->expo;
newNode->next = NULL;
ptr2 = ptr2->next;//添加代码
}
else
{
newNode->coeff = ptr1->coeff + ptr2->coeff;
newNode->expo = ptr1->expo;
newNode->next = NULL;
ptr1 = ptr1->next;
ptr2 = ptr2->next;
}
if(head==NULL)
{
head = newNode;
}
else
{
ptr3 = head;
//添加代码
while(ptr3->next != NULL)
ptr3 = ptr3->next;
ptr3->next = newNode;
}
}
while(ptr1 != NULL)
{
newNode = (list)malloc(sizeof(listNode));
newNode->coeff = ptr1->coeff;
newNode->expo = ptr1->expo;
newNode->next = NULL;
ptr3 = head;
if(ptr3 == NULL)
head = ptr3 = newNode;
else
{
while(ptr3->next != NULL)
ptr3 = ptr3->next;
ptr3->next = newNode;//添加代码
}
ptr1 = ptr1->next;
}
while(ptr2 != NULL)
{
newNode = (list)malloc(sizeof(listNode));
newNode->coeff = ptr2->coeff;
newNode->expo = ptr2->expo;
ptr3 = head;
if(ptr3 == NULL)
head = ptr3 = newNode;
else
{
while(ptr3->next != NULL)
ptr3 = ptr3->next;
ptr3->next = newNode;
}
ptr2 = ptr2->next;
}
return head;
}

void display(list head)
{
list ptr = head;
while(ptr != NULL)
{
if(ptr != head )
printf("+");
printf("%d",ptr->coeff);
printf("x^");
printf("%d",ptr->expo);
ptr = ptr->next;
}
printf("\n");
}

int main(int argc, char* argv[])
{
list head,head1,head2;
printf("input the first list\n");
head1 = createList();
display(head1);
printf("input the second list\n");
head2 = createList();
display(head2);
head = add(head1,head2);
display(head);
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-06-19
这个问题比较简单了,用链表的话,创建一个结构体,三个元素,一个float型,一个int型,一个结构体指针

创建链表很简单,固定格式

两个链表合并更简单,吧第二个链表的head直接赋值给第一个链表的最后哪个节点就可以

排序,用哪个int型做比较,交换节点的指针就可以做到

输出更简单,固定格式,用指针,一路下去就可以,这个节点的哪个指针赋值给输出的指针,一路下去就可以,当指针成为null结束追问

求c程序啊

追答

链表我不是很熟悉了,好多年不用,忘记的差不多了。具体的格式我写出来估计错误很多
但是这些在c基础教程中有固定的格式,套用就可以。很简单

思路起始很简单

本回答被网友采纳
相似回答