链表实现两个多项式相加--C语言实现

#include
#include

struct node{
	int exp;
	float coef;
	struct node *next;
}; 

typedef struct node ListNode;

ListNode *createpoly()	//创建多项式链表 
{	
	ListNode *h=NULL, *p, *q; 
	int e;
	float c;
	printf("请输入系数和指数:\n");
	scanf("%f,%d", &c,&e);
	
	while(e!=0||c!=0)//如果指数和系数都不为0进入循环 
	{
		p=(ListNode*)malloc(sizeof(ListNode));
		p->coef=c;
		p->exp=e;
		p->next=NULL;
		if(h==NULL)
		h=p;
		else
		q->next=p;
		q=p;
		printf("请输入系数和指数:\n");
		scanf("%f,%d", &c,&e);
	}
	
	return h;
}

void disppoly(ListNode *h)//输出多项式 
{
	ListNode *p=h;
	while(p!=NULL)
	{
		if(p->exp==0)		//如果指数是0,则输出其系数 
		printf("%.3f", p->coef);
		else
			printf("%fx^%d", p->coef, p->exp);
		p=p->next;
		if(p!=NULL)
		printf("+");
	} 
	printf("\n");
}

ListNode *addpoly(ListNode *h1, ListNode *h2)//两个多项式相加 ,用新链表保存相加后的结果 
{
	ListNode *p, *r=NULL, *s1, *s2, *s=NULL;
	
	float c;
	int e;
	s1=h1;
	s2=h2;
	while(s1!=NULL&&s2!=NULL)
	{
		if(s1->exp==s2->exp)	//1.如果两个指数相等,指数相加 
		{
			c=s1->exp+s2->exp;
			e=s1->exp;
			s1=s1->next;
			s2=s2->next; 
		}
		else if(s1->exp>s2->exp)//2.如果s1的指数=大于s2的指数,取s1的指数 
		{
			c=s1->coef;
			e=s1->exp;
			s1=s1->next; 
		}
		else					//3.如果s1的指数小于等于s2,则将s2的指数作为结果 
		{
			c=s2->coef;
			e=s2->exp;
			s2=s2->next;
		}
		
		if(c!=0)		//如果相加后系数不为0, 则需要生成一个结点放到链表中 
		{
			p=(ListNode*)malloc(sizeof(ListNode));
			p->coef=c;
			p->exp=e;
			p->next=NULL;
			if(s==NULL)
				s=p;
			else
				r->next=p;
			r=p;
		}
	}
	
	while(s1!=NULL)		//如果一个链表已经到大末尾,另一个还有结点,将剩下的结点插入新链表中 
	{
		c=s1->coef;
		e=s1->exp;
		s1=s1->next;
		
		if(c!=0)
		{
			p=(ListNode*)malloc(sizeof(ListNode));
			p->coef=c;
			p->exp=e;
			p->next=NULL;
			if(s==NULL)
				s=p;
			else
				r->next=p;
			r=p;
		}
		
	} 

	while(s2!=NULL)
	{
		c=s2->coef;
		e=s2->exp;
		s2=s2->next;
		
		if(c!=0)
		{
			p=(ListNode*)malloc(sizeof(ListNode));
			p->coef=c;
			p->exp=e;
			p->next=NULL;
			if(s==NULL)
				s=p;
			else
				r->next=p;
			r=p;
		}		
	}

	return s;
}

void deletepoly(ListNode *h)//释放多项式占用的内存空间 
{
	ListNode *p, *r=h;
	while(r!=NULL)
	{
		p=r->next;
		free(r);
		r=p; 
	} 
	
}


int  main()
{
	ListNode *head1, *head2, *head;
	printf("创建第一个多项式:\n");
	head1=createpoly();
	printf("创建第二个多项式:");
	head2=createpoly();

	printf("将两个多项式相加:");
	head=addpoly(head1, head2); 
	disppoly(head);
	
	
	deletepoly(head);
return 0;
}

你可能感兴趣的:(算法学习)