多项式的加法链表c语言,(二)单向链表C语言实现和多项式相加

typedef struct Node{

//系数

int coef;

//指数

int index;

struct Node *next;

}Node,*pNode;

pNode CreateList(int len){

pNode head,tail,new;

head = (pNode)malloc(sizeof(Node));

tail=head;

tail->next=NULL;

int coef,index;

for (int i =0; icoef=coef;new->index=index;

new->next=NULL;

tail->next=new;

tail=new;

}

return head;

}

pNode MergeList(pNode L1,pNode L2){

pNode head,tail,new;

pNode temp1,temp2;

head=(pNode)malloc(sizeof(Node));

head->next=NULL;

tail=head;

temp1=L1->next;

temp2=L2->next;

while (temp1!=NULL && temp2!=NULL) {

new=(pNode)malloc(sizeof(Node));

if(temp1->index== temp2->index){

new->index=temp1->index;

new->coef=temp1->coef+temp2->coef;

temp1=temp1->next;

temp2=temp2->next;

new->next=NULL;

tail->next=new;

tail=new;

continue;

}

if(temp1->index>temp2->index){

new->index=temp1->index;

new->coef=temp1->coef;

temp1=temp1->next;

}else{

new->index=temp2->index;

new->coef=temp2->coef;

temp2=temp2->next;

}

new->next=NULL;

tail->next=new;

tail=new;

}

while (temp1!=NULL) {

new=(pNode)malloc(sizeof(Node));

new->index=temp1->index;

new->coef=temp1->coef;

new->next=NULL;

tail->next=new;

tail=new;

temp1=temp1->next;

}

while (temp2!=NULL) {

new=(pNode)malloc(sizeof(Node));

new->index=temp1->index;

new->coef=temp1->coef;

new->next=NULL;

tail->next=new;

tail=new;

temp2=temp2->next;

}

return head;

}

void TraverseList(pNode L){

pNode p=L->next;

while(p!=NULL){

printf("%d--%d ",p->coef,p->index);

p=p->next;

}

printf("\n");

}

int main(){

int len1,len2;

pNode L1,L2,L3;

printf("input L1 len:");

scanf("%d",&len1);

L1=CreateList(len1);

printf("input L2 len:");

scanf("%d",&len2);

L2=CreateList(len2);

TraverseList(L1);

TraverseList(L2);

L3=MergeList(L1, L2);

TraverseList(L3);

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表可以用来表示多项式,每个节点包含多项式的系数和指数。可以定义一个结构体来表示节点: ```c struct Node { int coefficient; // 系数 int exponent; // 指数 struct Node* next; }; ``` 对于多项式加法,可以使用两个指针分别指向两个多项式链表头节点,然后依次比较两个节点的指数大小,按照指数的大小关系进行合并。具体步骤如下: 1. 创建一个新链表来存储合并后的多项式。 2. 初始化两个指针分别指向两个多项式链表头节点。 3. 比较两个节点的指数大小,如果相等,则将系数相加,并将结果插入到新链表中,并将两个指针同时后移。 4. 如果第一个多项式的当前节点的指数小于第多项式的当前节点的指数,则将第一个多项式的当前节点插入到新链表中,并将第一个指针后移。 5. 如果第一个多项式的当前节点的指数大于第多项式的当前节点的指数,则将第多项式的当前节点插入到新链表中,并将第个指针后移。 6. 重复步骤 3-5 直到其中一个多项式遍历完。 7. 将剩余未遍历完的多项式直接插入到新链表的末尾。 8. 返回新链表作为合并后的多项式。 下面是一个示例实现: ```c #include <stdio.h> #include <stdlib.h> struct Node { int coefficient; int exponent; struct Node* next; }; typedef struct Node Node; Node* createNode(int coefficient, int exponent) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->coefficient = coefficient; newNode->exponent = exponent; newNode->next = NULL; return newNode; } void insert(Node** head, int coefficient, int exponent) { Node* newNode = createNode(coefficient, exponent); if (*head == NULL) { *head = newNode; return; } Node* temp = *head; while (temp->next != NULL) temp = temp->next; temp->next = newNode; } void display(Node* node) { if (node == NULL) { printf("NULL\n"); return; } while (node != NULL) { printf("%dx^%d", node->coefficient, node->exponent); node = node->next; if (node != NULL) printf(" + "); } printf("\n"); } Node* addPolynomials(Node* poly1, Node* poly2) { if (poly1 == NULL) return poly2; if (poly2 == NULL) return poly1; Node* result = NULL; Node* tail = NULL; while (poly1 != NULL && poly2 != NULL) { if (poly1->exponent == poly2->exponent) { int sum = poly1->coefficient + poly2->coefficient; if (sum != 0) { insert(&result, sum, poly1->exponent); tail = result; } poly1 = poly1->next; poly2 = poly2->next; } else if (poly1->exponent > poly2->exponent) { insert(&result, poly1->coefficient, poly1->exponent); tail = result; poly1 = poly1->next; } else { insert(&result, poly2->coefficient, poly2->exponent); tail = result; poly2 = poly2->next; } } while (poly1 != NULL) { insert(&result, poly1->coefficient, poly1->exponent); tail = result; poly1 = poly1->next; } while (poly2 != NULL) { insert(&result, poly2->coefficient, poly2->exponent); tail = result; poly2 = poly2->next; } return result; } int main() { Node* poly1 = NULL; Node* poly2 = NULL; Node* result = NULL; // 创建第一个多项式 3x^2 + 2x^1 + 1x^0 insert(&poly1, 3, 2); insert(&poly1, 2, 1); insert(&poly1, 1, 0); // 创建第多项式 2x^3 + 4x^1 + 2x^0 insert(&poly2, 2, 3); insert(&poly2, 4, 1); insert(&poly2, 2, 0); printf("第一个多项式: "); display(poly1); printf("第多项式: "); display(poly2); result = addPolynomials(poly1, poly2); printf("相加后的多项式: "); display(result); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值