使用VC6.0写程序之使用链表完成多项式求和

题目:
	 p1为m项多项式,p2为n项多项式,求p3=p1+p2。 
	 要求: 
	 		1.使用单向链表;
	 		2.化简;

例:在这里插入图片描述
结构体:

typedef struct node{
		int coef;			//系数
		int expon;			// 指数 
		struct node *next; 
}PolyList_t;

模块代码:
1.创建表头:

/*****************************
*创建链表
*
******************************/
PolyList_t *PolyList_create()		//创建链表
{
	PolyList_t *head = (PolyList_t *)malloc(sizeof(PolyList_t));	//开辟一个内存空间
	if(head == NULL)			//如果开辟空间失败,报错
	{
		perror("malloc!\n");
		return NULL;
	}
	head->next = NULL;
	return head;				//返回表头
}

2.向链表插入数据,在表尾插入数据

/*****************************
*插入数据
*
******************************/
void PolyList_insert(PolyList_t *head, int c,int e)
{
	if(head == NULL)
	{
		perror("head is NULL!\n");
		return ;
	}	
	PolyList_t *p = head;		//指针指向表头
	PolyList_t *news =(PolyList_t *)malloc(sizeof(PolyList_t));		//为新添加的结构体数据开辟空间
	if(news==NULL)
	{
		perror("new!\n");
		return ;
	}
	news->coef = c;
	news->expon = e;
	news->next = NULL;
	
	while( p->next!= NULL )		//循环遍历,指针指向表尾
	{
		if(p->next->expon == e)
		{
			p->next->coef += c;
			return ;
		}
		p = p->next;
	}	
	
	p->next = news; 			//表尾的next指向需要添加数据的地址
	return ;
}

3.展示链表,分指数的几种情况,展示多项式。

void displayPloy(PolyList_t *head)		
{
	if(head == NULL)
	{
		perror("head is NULL!\n");
		return ;
	}	
	PolyList_t *p=head->next;
	
    while( p!=NULL )
    {
		if(p->coef != 0 )						
		{
			if(p->coef == 1)
				printf("x^%d",p->expon);
			else 
				if(p->expon!=0)
					printf("%d*x^%d",p->coef,p->expon);
				else
					printf("%d",p->coef);
		if(p->next != NULL)			
			printf(" + ");
		}
		p = p->next;
    }
    printf("\n");
    return ;
}

4.链表排序,将多显示按照系数大小排序。

/*****************************
*排序算法
*冒泡排序
******************************/
void PolyList_paixu(PolyList_t *head)
{
	if(head == NULL)			//如果开辟空间失败,报错
	{
		perror("malloc!\n");
		return ;
	}
	int c,e;
	PolyList_t *p = head->next;
	PolyList_t *q = head->next;
	while(p!=NULL)
	{
		while(q->next!=NULL)
		{
			if( q->expon > q->next->expon)
			{
				e = q->expon;
				q->expon = q->next->expon;
				q->next->expon =e;
					
				c = q->coef;
				q->coef = q->next->coef;
				q->next->coef = c;
			}
			q = q->next;	
		}
		q = head->next;
		p = p->next;
	}
	return ;
}

5.链表相加,p1、p2相加得p3。

//比较函数
int cmp(int a,int b){
	if(a>b)
		return 1;
	else if(a==b)
		return 0;
	else
		return -1;
}
void AddPoly(PolyList_t *pa, PolyList_t *pb, PolyList_t *pc) //多项式加法   
{
	PolyList_t *q1,*q2;
	q1=pa->next; 
	q2=pb->next;					
	while(q1!=NULL || q2!=NULL)
	{
		if(q1 != NULL && q2 == NULL )
		{
			while(q1!=NULL)
			{
				PolyList_insert(pc, q1->coef,q1->expon);
				q1=q1->next;
			}
		}
		else 
			if(q1 == NULL && q2 != NULL)
			{
				while(q2!=NULL)
				{
					PolyList_insert(pc, q2->coef,q2->expon);
					q2=q2->next;
				}
			}
			else
			{
				switch(cmp(q1->expon,q2->expon))
				{
					case -1:							//q1<q2
						{
							PolyList_insert(pc, q1->coef,q1->expon);
							q1=q1->next;
							break;
						}
					case 0:	//q1=q2
						{
							PolyList_insert(pc,(q1->coef+q2->coef),q1->expon);
							q1=q1->next;
							q2=q2->next;
							break;
						}
					case 1:								//q1>q2
						{
							PolyList_insert(pc, q2->coef,q2->expon);
							q2=q2->next;
							break;
						}
				}
			}
	}
	return ;
}

链表的主要运用为链表的创建、删除,链表的数据的增、删、改、查,将几个功能掌握后就能完成。

以下时全部代码,若有不懂的,可私信我。
总代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node{
		int coef;			//系数
		int expon;			// 指数 
		struct node *next; 
}PolyList_t;

PolyList_t *PolyList_create();					//创建一个链表表头
void PolyList_insert(PolyList_t *head, int c,int e);		//插入数据
void displayPloy(PolyList_t *p);			//显示数据
void PolyList_paixu(PolyList_t *head);
void AddPoly(PolyList_t *pa, PolyList_t *pb, PolyList_t *pc);	//相加
	
int main(){
	PolyList_t *p1,*p2,*p3;
	int i;
	int c1,e1,n1;			//多项式1的系数和指数,项数
	int c2,e2,n2;			//多项式2的系数和指数,项数
	p1 = PolyList_create();			//创建多项式1的表头
	printf("请输入多项式pl的项数:");
	scanf("%d",&n1);
	printf("输入系数和指数(以空格隔开,回车结束):\n");
	for(i=0;i<n1;i++)
	{
		scanf("%d %d",&c1,&e1);
		getchar();
		PolyList_insert(p1,c1,e1);
	}
	printf("第一个多项式内容:");
	displayPloy(p1);
	//printf("排序:");
	PolyList_paixu(p1);
	//displayPloy(p1);
	p2 = PolyList_create();			//创建多项式2的表头
	printf("请输入多项式p2的项数:");
	scanf("%d",&n2);
	printf("输入系数和指数(以空格隔开,回车结束):\n");
	for(i=0;i<n2;i++)
	{
		scanf("%d %d",&c2,&e2);
		getchar();
		PolyList_insert(p2,c2,e2);
	}
	printf("第二个多项式内容:");
	displayPloy(p2);
	PolyList_paixu(p2);
	p3 = PolyList_create();	
	if(p3 == NULL)
	{
		perror("p3!\n");
	}	
	AddPoly(p1,p2,p3);			//加法操作
	printf("多项式p1和p2相加后的结果是:");
	displayPloy(p3);
	return 0;
}
/*****************************
*排序算法
*
******************************/
void PolyList_paixu(PolyList_t *head)
{
	if(head == NULL)			//如果开辟空间失败,报错
	{
		perror("malloc!\n");
		return ;
	}
	int c,e;
	PolyList_t *p = head->next;
	PolyList_t *q = head->next;
	while(p!=NULL)
	{
		while(q->next!=NULL)
		{
			if( q->expon > q->next->expon)
			{
				e = q->expon;
				q->expon = q->next->expon;
				q->next->expon =e;
					
				c = q->coef;
				q->coef = q->next->coef;
				q->next->coef = c;
			}
	
			q = q->next;	
		}
		q = head->next;
		p = p->next;
	}
	return ;
}
/*****************************
*创建链表
*
******************************/
PolyList_t *PolyList_create()		//创建链表
{
	PolyList_t *head = (PolyList_t *)malloc(sizeof(PolyList_t));		//开辟一个内存空间
	if(head == NULL)			//如果开辟空间失败,报错
	{
		perror("malloc!\n");
		return NULL;
	}
	head->next = NULL;
	return head;
}
/*****************************
*插入数据
*
******************************/
void PolyList_insert(PolyList_t *head, int c,int e)
{
	if(head == NULL)
	{
		perror("head is NULL!\n");
		return ;
	}	
	PolyList_t *p = head;		//指针指向表头
	PolyList_t *news =(PolyList_t *)malloc(sizeof(PolyList_t));		//为新添加的结构体数据开辟空间
	if(news==NULL)
	{
		perror("new!\n");
		return ;
	}
	news->coef = c;
	news->expon = e;
	news->next = NULL;
	
	while( p->next!= NULL )		//循环遍历,指针指向表尾
	{
		if(p->next->expon == e)
		{
			p->next->coef += c;
			return ;
		}
		p = p->next;
	}	
	p->next = news; 			//表尾的next指向需要添加的结构体的地址
	return ;
}

int cmp(int a,int b){
	if(a>b)
		return 1;
	else if(a==b)
		return 0;
	else
		return -1}
void AddPoly(PolyList_t *pa, PolyList_t *pb, PolyList_t *pc) //多项式加法   
{
	PolyList_t *q1,*q2;
	q1=pa->next; 
	q2=pb->next;					
	while(q1!=NULL || q2!=NULL)
	{
		if(q1 != NULL && q2 == NULL )
		{
			while(q1!=NULL)
			{
				PolyList_insert(pc, q1->coef,q1->expon);
				q1=q1->next;
			}
		}
		else 
			if(q1 == NULL && q2 != NULL)
			{
				while(q2!=NULL)
				{
					PolyList_insert(pc, q2->coef,q2->expon);
					q2=q2->next;
				}
				
			}
			else
			{
				switch(cmp(q1->expon,q2->expon))
				{
					case -1:							//q1<q2
						{
							PolyList_insert(pc, q1->coef,q1->expon);
							q1=q1->next;
							break;
						}
					case 0:	//q1=q2
						{
							PolyList_insert(pc,(q1->coef+q2->coef),q1->expon);
							q1=q1->next;
							q2=q2->next;
							break;
						}
					case 1:								//q1>q2
						{
							PolyList_insert(pc, q2->coef,q2->expon);
							q2=q2->next;
							break;
						}
				}
			}
	}
	return ;
}
void displayPloy(PolyList_t *head)		
{
	if(head == NULL)
	{
		perror("head is NULL!\n");
		return ;
	}	
	PolyList_t *p=head->next;
	
    while( p!=NULL )
    {
		if(p->coef != 0 )
		{
			if(p->coef == 1)
				printf("x^%d",p->expon);
			else 
				if(p->expon!=0)
					printf("%d*x^%d",p->coef,p->expon);
				else
					printf("%d",p->coef);
		if(p->next != NULL)			
			printf(" + ");
		}
		p = p->next;
    }
    printf("\n");
    return ;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值