河南理工大学数据结构期末上机考试参考代码

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h> 
typedef struct 
{
	float coe;
	int exp;
}term;

typedef struct LNode
{
	term date;
	struct LNode *next;
}*LinkList;

//


/****  比 较 函 数 **************************************/
int compare(term e1,term e)
{
	if(e1.exp==e.exp)
		return 0;
	else
		return (e1.exp-e.exp)/abs(e1.exp-e.exp);
}


/****   初 始 化 **************************************/
int InitList(LinkList &L)
{
	L=(LinkList)malloc(sizeof(LNode));
	if(!L)
		return 0;
	L->next=NULL;
	return 1;
}


/****   确 定 位 置 **************************************/
int LocateList(LinkList L,term e,LinkList &p,int (*compare)(term,term))
{
	int k;
	LinkList q;
	q=L->next;
	p=L;
	while(q)
	{
		k=compare(q->date,e);
		if(k==0)    //  合并
		{
			p=q;
			return 0;
		}
		else if(k==1)
		{
			q=q->next;
			p=p->next;
		}
		else
			return -1;   // 要插入
	}
	return 1;      // 加在最后
}

/****   获 取 前 驱  **************************************/
void PriorList(LinkList L,LinkList p,LinkList &q)
{
	q=L;
	while(q->next!=p)
		q=q->next;
}


/****   创 建 链 表 **************************************/
int CreateList(LinkList &L,int m)
{
	LinkList p,s,q;
	term e;
	int i,k;
	
	if(InitList(L))    //初始化
		printf("请输入%d组数据:\n",m);

loop:
	for(i=0;i<m;i++)
	{
		scanf("%f%d",&e.coe,&e.exp);
		if(0.0==e.coe)
		{
			printf("系数不能为0\n请重新输入: ");
			goto loop;
		}
		k=LocateList(L,e,p,compare);   // p带回e在L中的位置 
		if(1==k)      //  加在结尾
		{
			s=(LinkList)malloc(sizeof(LNode));
			s->date=e;
			s->next=NULL;
			p->next=s;
			p=s;
		}
		else if(-1==k)     //  插入
		{
			s=(LinkList)malloc(sizeof(LNode));
			s->date=e;
			s->next=p->next;
			p->next=s;
		}
		else
		{
			p->date.coe+=e.coe;  //合并
			if(0==p->date.coe)
			{
				PriorList(L,p,q);
				q->next=p->next;
				free(p);
				p=q->next;
			}
		}
	}

	return 1;
}
	

/****  输 出 链 表 **************************************/
void PrintList(LinkList L)
{
	printf("****************************************************************************\n");
	if(!L->next)
	{
		printf("0\n");
		return ;
	}
	LinkList q;
	q=L->next;
	while(q->next)
	{
		printf("%.2f X^ %d + ",q->date.coe,q->date.exp);
		q=q->next;
	}
	printf("%.2f x^ %d\n",q->date.coe,q->date.exp);
	printf("****************************************************************************\n");
}


/****  加 法  **************************************/
void AddPolyn(LinkList &L1,LinkList &L2)
{
	int k;
	LinkList p1,p2,q1,q2;
	p1=L1;           // p2 的前驱
	p2=L1->next;     // 当前元素
	q1=L2;           // q2 的前驱
	q2=L2->next;     // 当前元素

	while(p2 && q2)
	{
		k=compare(p2->date,q2->date);
		switch(k)
		{
		case -1:
			q1->next=q2->next;
			p1->next=q2;
			q2->next=p2;
			p1=q2;
			q2=q1->next;
			break;
		case 0:
			p2->date.coe+=q2->date.coe;
			if(0==p2->date.coe)
			{
				p1->next=p2->next;
				free(p2);
				p2=p1->next;
			}

			q1->next=q2->next;
			free(q2);
			q2=q1->next;
			break;
		case 1:
			p1=p2;
			p2=p2->next;
			break;
		}
	}
	if(!p2)
		p1->next=q2;
	free(L2);


}


/****  乘 法 **************************************/
void MutiplyPolyn(LinkList L1,LinkList L2,LinkList &L)
{
	LinkList p1,p2,p,s;
	term e;
	int k;
	
	p1=L1->next;
	p2=L2->next;
	
	while(p1)
	{
		while(p2)
		{
			e.exp=p1->date.exp+p2->date.exp;
			e.coe=p1->date.coe * p2->date.coe;
			k=LocateList(L,e,p,compare);   // p带回e在L中的位置的前驱 
			if(1==k)      //  加在结尾
			{
				s=(LinkList)malloc(sizeof(LNode));
				s->date=e;
				s->next=NULL;
				p->next=s;
				p=s;
			}
			else if(-1==k)     //  插入
			{
				s=(LinkList)malloc(sizeof(LNode));
				s->date=e;
				s->next=p->next;
				p->next=s;
			}
			else
				p->date.coe+=e.coe;  //合并

			p2=p2->next;	
		}
		p1=p1->next;
		p2=L2->next;	
	}
}


/****  销 毁 链 表 **************************************/
void DestroyList(LinkList &L)
{
	LinkList p,q;
	p=L;
	while(p)
	{
		q=p;
		p=p->next;
		free(q);
	}
}



int  main()
{
	int m,S;
	LinkList L,L1,L2;

	system("CLS");    //清屏函数

	printf("输入多项式的项数: ");  // 创建
	scanf("%d",&m);

	CreateList(L1,m);
	printf("输入多项式的项数: ");
	scanf("%d",&m);

	CreateList(L2,m);

	printf("\n你输入多项式为:\n\n");  // 显示
	PrintList(L1);
	printf("\n");
	PrintList(L2);
loop1:
	printf("\n\n\t1.相加\t\t2.相乘\t\t3.重新输入\t\t4.退出\n\n\t\t请选择你的操作: "); 
	scanf("%d",&S);			 // 选择操作

	while(S<1 || S>4)
	{
		printf("\t\t输入操作不合法!\n\t\t请重新输入:");
		scanf("%d",&S);
	}
	switch(S)
	{
	case 1:
		AddPolyn(L1,L2);
		printf("相加的结果为:\n");
		PrintList(L1);
		printf("\n\t\t按1重新输入\t\t其他数字键退出");
		scanf("%d",&S);
		if(1==S)
		{
			DestroyList(L1);
			main();
		}
		else
			break;
	case 2:
		InitList(L);
		MutiplyPolyn(L1,L2,L);
		printf("相乘结果为:\n");
		PrintList(L);
		goto loop1;
	case 3:
		DestroyList(L1);
		DestroyList(L2);
		if(L)
			DestroyList(L);
		main();
	case 4:
		break;
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值