西电数据结构上机题目-多项式加法-求和结果放在A表中B清空

希望学长的代码能给大二西电er们带来帮助(大家一定要好好学习数据结构,合理利用资源)

大家找到了什么bug或有什么改进意见可以私信我或在下方留言,我都会看的

不多说废话直接上代码​​​​​​​

#include<malloc.h>
#include<stdio.h>
//多项式单链表结构类型定义
typedef struct node
{
	int coef;
	int exp;
	struct node* next;
}linklist;

linklist* init()
{
	linklist* head = (linklist*)malloc(sizeof(linklist));
	head->coef = 0;
	head->exp = -1;
	head->next = NULL;
	return head;
}

linklist* create()
{
	int coef;
	int exp;
	linklist* head = init();
	linklist* s, * r;
	r = head;
	while (1)
	{
		scanf("%d %d", &coef, &exp);
		if (coef != 0)//输入0 0来结束输入
		{
			s = (linklist*)malloc(sizeof(linklist));
			s->coef = coef;//s用来保存当前节点
			s->exp = exp;
			r->next = s;
			r = s;
		}
		else
			break;
	}
	r->next = NULL;//尾插法建立单链表 
	return head;
}

void print(linklist* head)// 输出多项式信息
{
	linklist* p;
	p = head->next;
	if (p == NULL) {
		printf("表空\n");
		return;
	}
	while (p != NULL)
	{
		printf("(%d,%d),", p->coef, p->exp);
		p = p->next;
	}
	printf("\n");
}

linklist* sum(linklist* pa, linklist* pb)//进行多项式相加
{
	linklist* p, * q, * r, * s;
	int x;
	p = pa->next;//分别指向多项式的第一项
	q = pb->next;
	s = pa;//s用于保存当前节点
	while ((p != NULL) && (q != NULL))
	{
		if (p->exp < q->exp)//p的指数小于q的指数,将p放入链表中
		{
			s = p;
			p = p->next;
		}
		else if (p->exp > q->exp)//p的指数大于q的指数,将q放入链表中
		{
			r = q->next;
			q->next = p;
			s->next = q;
			s = q;
			q = r;
		}
		else//当两者指数相同时,进行合并
		{
			x = p->coef + q->coef;
			if (x != 0)
			{
				p->coef = x;
				s = p;
			}
			else//若合并结果为0,将该节点移除
			{
				s->next = p->next;
				free(p);
			}
			p = s->next;
			r = q;
			q = q->next;
			free(r);
		}
	}
	if (p)
		s->next = p;
	else
		s->next = q;
	return pa;
}

linklist* copy(linklist* L)
{
	linklist* NL = init();//新链表初始化
	linklist* pb = NL; //新链表还没有值,指向头指针 
	linklist* pa = L->next;
	while (pa != NULL)
	{
		linklist* l = new linklist; //为新节点开辟内存空间
		l->coef = pa->coef;
		l->exp = pa->exp;
		//尾插法
		l->next = NULL;
		pb->next = l;
		//保证指针始终指向最后一个节点
		pb = pb->next;
		pa = pa->next;
	}
	return NL;
}

void SumOfPoly(linklist* pa, linklist* pb) {
	pa = sum(pa, pb);
	pb->next = NULL;
}

int main()
{
	linklist* A, * B, * C, * D, * E;
	printf("**************请输入原多项式A链表为*****************\n");
	A = create();
	D = copy(A);
	printf("**************请输入原多项式B链表为*****************\n");
	B = create();
	E = copy(B);
	printf("\n**************显示原多项式A链表为*****************\n");
	print(A);
	printf("\n**************显示原多项式B链表为*****************\n");
	print(B);
	//C = sum(D, E);//调用多项式求和的函数
	SumOfPoly(A, B);
	printf("\n**************显示求和运算之后的多项式A链表为*****************\n");
	print(A);
	printf("\n**************显示求和运算之后的多项式B链表为*****************\n");
	print(B);
	//printf("\n**************显示求和运算之后的多项式之和C链表为*****************\n");
	//print(C);
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值