西电数据结构上机题目-多项式加法-求和结果放在C表中,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;
	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;
} 

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);//调用多项式求和的函数
	printf("\n**************显示求和运算之后的多项式A链表为*****************\n");
	print(A);
	printf("\n**************显示求和运算之后的多项式B链表为*****************\n");
	print(B);
	printf("\n**************显示求和运算之后的多项式之和C链表为*****************\n");
	print(C); 
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值