单链表操作之一元多项式的合并

多项式就是单项式的加减法,对于单项式可以用一组数表示,例如2X^3,可以表示为(2,3)。我们可以使用单链表来进行多项式的合并操作。

一:首先我们先建立新的数据类型multi

typedef struct multi{
 int coef;
 int index;
 struct multi *next;
}multi;

二:建立链表。我这里建立的为带有头结点的链表,这样方便之后的合并操作(关于建立的两种方法可以参考我的另一篇文章单链表的基础操作(头插法、尾插法、插入和删除)https://blog.csdn.net/weixin_43260290/article/details/82843347

struct multi *tailcreat(int a)
{
	struct multi *head;
	struct multi *p,*q;
	int n = 0;
	head = (struct multi*)malloc(sizeof(struct multi));
	p = (struct multi*)malloc(sizeof(struct multi));
	printf("请输入多项式%d配对的系数和指数:\n",a);
	do{
		q = (struct multi*)malloc(sizeof(struct multi));
		scanf("%d%d",&q->coef,&q->index);
		if(q->coef == 0)
			break;
		if(n == 0)
		{
			p->next = q;
			head->next = q;
			p = q;
			n++;
		}
		else
		{
			p->next = q;
			p = q;
		}
	}while(true);
	p->next = NULL;
	return(head);
}

三:链表的输出

void display(struct multi *head,int i)
{
	printf("第%d个多项式为:\n",i);
	while((head->next)!=NULL)
	{
		printf("%dx^%d+",(head->next)->coef,(head->next)->index);
		head = head->next;
	}
	printf("\b \n");                                   //\b为光标后退一格,后退后再输出个空格就将多项式最后一个+号覆盖啦~ 
}

四:链表的合并

在这里插入图片描述

struct multi *combine(struct multi *head1,struct multi *head2)
{
	struct multi *pa,*pb,*L,*p;
	pa = head1->next;
	pb = head2->next;
	L = p = head1;
	while(pa&&pb)
	{
		if(pa->index == pb->index)
		{
			if(pa->coef + pb->coef)
			{
				pa->coef = pa->coef + pb->coef;
				p->next = pa;
				p = pa;
				pa = pa->next;
				pb = pb->next;
			}
			else{
			pa = pa->next;
			pb = pb->next;
			}		
		}
		else if(pa->index > pb->index)
		{
			p->next = pb;
			p = pb;
			pb = pb->next;
		}
		else
		{
			p->next = pa;
			p = pa;
			pa = pa->next;
		}
	}
/*
	while(pa)
		p->next = pa;
	while(pb)
		p->next = pb;
*/   				 //永远无法跳出循环。我是智障叭!!!  
	if(pa == NULL)
	{
		p->next = pb;
	}
	else{
		p->next = pa;
	}
	return(L);
}

期间谢谢机机的指教hhhh,大家共同进步!

下面是完整的代码~

#include<stdio.h>
#include<stdlib.h>

typedef struct multi{
	int coef;
	int index;
	struct multi *next;
}multi; 

struct multi *tailcreat(int a)
{
	struct multi *head;
	struct multi *p,*q;
	int n = 0;
	head = (struct multi*)malloc(sizeof(struct multi));
	p = (struct multi*)malloc(sizeof(struct multi));
	printf("请输入多项式%d配对的系数和指数:\n",a);
	do{
		q = (struct multi*)malloc(sizeof(struct multi));
		scanf("%d%d",&q->coef,&q->index);
		if(q->coef == 0)
			break;
		if(n == 0)
		{
			p->next = q;
			head->next = q;
			p = q;
			n++;
		}
		else
		{
			p->next = q;
			p = q;
		}
	}while(true);
	p->next = NULL;
	return(head);
}

void display(struct multi *head,int i)
{
	printf("第%d个多项式为:\n",i);
	while((head->next)!=NULL)
	{
		printf("%dx^%d+",(head->next)->coef,(head->next)->index);
		head = head->next;
	}
	printf("\b \n");                                   //\b为光标后退一格,后退后再输出个空格就将多项式最后一个+号覆盖啦~ 
}

struct multi *combine(struct multi *head1,struct multi *head2)
{
	struct multi *pa,*pb,*L,*p;
	pa = head1->next;
	pb = head2->next;
	L = p = head1;
	while(pa&&pb)
	{
		if(pa->index == pb->index)
		{
			if(pa->coef + pb->coef)
			{
				pa->coef = pa->coef + pb->coef;
				p->next = pa;
				p = pa;
				pa = pa->next;
				pb = pb->next;
			}
			else{
			pa = pa->next;
			pb = pb->next;
			}		
		}
		else if(pa->index > pb->index)
		{
			p->next = pb;
			p = pb;
			pb = pb->next;
		}
		else
		{
			p->next = pa;
			p = pa;
			pa = pa->next;
		}
	}
/*
	while(pa)
		p->next = pa;
	while(pb)
		p->next = pb;
*/   				 //永远无法跳出循环。我是智障叭!!!  
	if(pa == NULL)
	{
		p->next = pb;
	}
	else{
		p->next = pa;
	}
	return(L);
}


int main()
{
	struct multi *head,*head1,*head2;
	head1 = tailcreat(1);
	display(head1,1);
	head2 = tailcreat(2);
	display(head2,2);
	head = combine(head1,head2);
	display(head,3);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43260290/article/details/82855987