0
点赞
收藏
分享

微信扫一扫

A + B for Polynomials

追梦人的自留地 2022-01-15 阅读 90
#include <stdio.h>
#include <stdlib.h>

/* 注:
1. 多项式采用单链表结构存储,表结点为结构体类型
2. 指数默认递减输入,因此对于输入不需要再进一步排序,实际上此题类似于两个
   有序单链表的合并。
3. 两个指数相同结点的系数之和可能为0,此时不计入最终结果即可。
*/

// 结点数据类型定义
typedef struct{
	int exponents;
	float coexponents;
}Elemtype; 

// 单链表结点定义,头结点定义
typedef struct ListNode{
	Elemtype data;
	struct ListNode *next;
}*LinkList, LinkNode;

// 读取输入,创建链表
void CreateList(LinkList &L)
{
	int n, i, j;
	scanf("%d", &n);
	L = (LinkList)malloc(sizeof(LinkNode));
	LinkNode *p, *s;
	p = L;
	for(i=0;i<n;i++){
		s = (LinkNode*)malloc(sizeof(LinkNode));
		scanf("%d%f", &s->data.exponents, &s->data.coexponents);
		p->next = s;
		p = s;
	}
	p->next = NULL;
}

/* 求两个多项式之和,多项式采用链表结构存储,实际上类似于两个
   有序链表的合并*/
void Add(LinkList L1, LinkList L2, LinkList &L3, int &nums)
{
	LinkNode *p, *q, *s;
	int count = 0;
	p = L1->next;
	q = L2->next;
	L3 = (LinkList)malloc(sizeof(LinkNode));
	s = L3;
	while(p&&q){
		if(p->data.exponents > q->data.exponents){
			s->next = p;
			s = s->next;
			p = p->next;
			count++;
		}
		else if(p->data.exponents == q->data.exponents){
			p->data.coexponents += q->data.coexponents;
            if(p->data.coexponents == 0){
                p = p->next;
                q = q->next;
                continue;
            }
			s->next = p;
			s = s->next;
			p = p->next;
			q = q->next;
			count++;
		}
		else{
			s->next = q;
			s = s->next;
			q = q->next;
			count++;
		}
	}
	while(p){
		s->next = p;
		s = s->next;
		p = p->next;
		count++;
	}
	while(q){
		s->next = q;
		s = s->next;
		q = q->next;
		count++;
	}
	nums = count;
	s->next = NULL;	
}

// 输出结果,注意单独输出单链表长度时不要带空格,因为0的输出没有空格
void ExportList(LinkList L, int nums)
{
	LinkNode *p;
	p = L->next;
	printf("%d", nums);
	while(p){
        printf(" %d %.1f", p->data.exponents, p->data.coexponents);
		p = p->next;
	}
	
}

int main(void)
{
	LinkList L1, L2, L3;
	int n;
	CreateList(L1);
	CreateList(L2);
	Add(L1, L2, L3, n);
	ExportList(L3, n);
	return 0;
}
举报

相关推荐

0 条评论