用链表实现带菜单功能的一元多项式的基本操作 (Use linked list to realize the basic operation of a one-dimensional polynom)

问题描述:
从键盘读入一元多项式中每一项的系数和指数,编写算法和建立文本菜单实现: 
建立带表头结点的单链表存放一元多项式(按照指数升序排列); 
输出一元多项式的所有数据元素(按照指数升序输出每一系数非0项的系数和指数); 
将单链表存放的一元多项式就地逆置,变成按照指数降序排列; 
输入自变量的值,计算一元多项式的值(设计高效算法); 
求2个一元多项式的和多项式;

程序使用说明:

1.       在选择1未建表的情况下,选择2-5会提示无法执行,此时可在选择1或选择6进行A表的建立。

2.       若在选择1建表后,选择6将直接进入B表的建立。

3.       选择6执行后产生的新的一元多项式为新表A,可继续对该新表进行操作。

4.       A表存在后,选择1将显示当前操作的表,无法再建立新表。

5.       选择2-5的基本操作默认针对表A进行。

6.       出现“按任意键继续”时,根据提示操作即可。


代码如下:

#include
#include
#include
#include
#include
#define MAXSIZE 20

typedef struct Node
{
	int coef;
	int exp;
	struct Node *next;
}Node, *LinkList;

void LinkList_Screen();                                         //进入页面显示函数
int LinkList_TailCreate(LinkList &L);				//尾插法建表
int LinkList_ExpInscending(LinkList &L, int len);		//指数升序排序函数
int LinkList_ExpInscendingElementPrint(LinkList &L, int len);	//指数升序输出所有元素
int LinkList_Reverse(LinkList &L);			        //就地逆置函数
int LinkList_Cuculate(LinkList &L);				//计算输入的x的值
int LinkList_Add(LinkList &A, LinkList &B);		        //两个一元多项式相加
int LinkList_Print(LinkList &L);				//输出函数
int LinkList_MergeSame(LinkList &L);				//合并同类项函数

int main()
{
	LinkList A,B;
	int len[MAXSIZE], i=0;					//储存建立的表的长度
	memset(len, 0, sizeof(len));
	while (1)
	{
		LinkList_Screen();
		switch (_getch())
		{
			case '1': 
			{ 
				system("cls");
				if (len[i] != 0)
				{
					printf("已存在以下一元多项式,请选择需要的操作!\n");
					LinkList_Print(A);
					system("pause");
					break;
				}
				printf("现在建立第1个一元多项式\n");
				len[++i]=LinkList_TailCreate(A); 
				break; 
			}
			case '2': 
			{ 
				if (len[i] == 0)
				{
					printf("没有可操作的表!请先建表!\n");
					system("pause");
					break;
				}
				system("cls");
				LinkList_ExpInscending(A,len[i]); 
				break; 
			}
			case '3': 
			{ 
				if (len[i] == 0)
				{
					printf("没有可操作的表!请先建表!\n");
					system("pause");
					break;
				}
				system("cls");
				LinkList_ExpInscendingElementPrint(A,len[i]); 
				break; 
			}
			case '4': 
			{ 
				if (len[i] == 0)
				{
					printf("没有可操作的表!请先建表!\n");
					system("pause");
					break;
				}
				system("cls");
				LinkList_Reverse(A); 
				break; 
			}
			case '5': 
			{ 
				if (len[i] == 0)
				{
					printf("没有可操作的表!请先建表!\n");
					system("pause");
					break;
				}
				system("cls");
				LinkList_Cuculate(A); 
				break;
			}
			case '6': 
			{ 
				system("cls");
				if (len[i] == 0)
				{
					printf("现在建立第%d个一元多项式\n",i+1);
					len[++i] = LinkList_TailCreate(A);
				}
				printf("第%d个一元多项式",i);
				LinkList_ExpInscending(A, len[i]);
				printf("现在建立第%d个一元多项式\n",i+1);
				len[++i] = LinkList_TailCreate(B);
				printf("第%d个一元多项式",i);
				LinkList_ExpInscending(B, len[i]); 
				len[++i] = LinkList_Add(A, B);
				break; 
			}
			case '7': { exit(0); break; }
		}
		LinkList_Screen();
	}
	system("pause");
}

void LinkList_Screen()
{
	system("cls");
	printf("请输入要进行的操作\n");
	printf("*************************************\n");
	printf("\t 1.建立一元多项式\n");
	printf("\t 2.对一元多项式进行指数升序排列\n");
	printf("\t 3.按指数升序输出一元多项式系数与指数\n");
	printf("\t 4.逆置一元多项式\n");
	printf("\t 5.输入x,计算一元多项式的值\n");
	printf("\t 6.求两个一元多项式的和多项式\n");
	printf("\t 7.退出\n");
	printf("*************************************\n");
	printf("请输入选择:\n");
}

int LinkList_TailCreate(LinkList &L)//输入每一项系数与指数
{
	LinkList p, s;
	int coef, exp, i, length, len;
	L = (LinkList)malloc(sizeof(Node));
	L->next = NULL;
	p = L;
	printf("请输入该一元多项式的项数:");
	scanf_s("%d", &length);
	for (i = 0; i < length; i++)
	{
		printf("请输入第%d项系数:", i + 1);
		scanf_s("%d", &coef);
		printf("请输入第%d项指数:", i + 1);
		scanf_s("%d", &exp);
		while (coef == 0)
		{
			printf("无效项!请重新输入!\n");
			printf("请输入第%d项系数:", i + 1);
			scanf_s("%d", &coef);
			printf("请输入第%d项指数:", i + 1);
			scanf_s("%d", &exp);
		}
		s = (LinkList)malloc(sizeof(Node));
		s->coef = coef;
		s->exp = exp;
		s->next = NULL;
		p->next = s;
		p = p->next;
	}
	len = LinkList_MergeSame(L);
	length -= len;
	printf("新建的一元多项式为:");
	LinkList_Print(L);
	system("pause");
	return length;
}

int LinkList_ExpInscending(LinkList &L, int len)//指数exp升序排列
{
	LinkList p, q, r;
	int i, j, done=1;
	p = L->next;
	if (p == NULL || p->next == NULL)
	{
		printf("无需排列!\n");
		return 0;
	}
	for (i = 1; i <= len - 1 && done; i++)//冒泡排序
	{
		done = 0;
		r = L;
		p = r->next;
		q = p->next;
		for (j = 0; j < len - i; j++)
		{
			if (p->exp > q->exp)
			{
				p->next = q->next;
				q->next = p;
				r->next = q;
				q = p->next;
				r = r->next;
				done = 1;
			}
			else
			{
				r = p; 
				p = q;
				q = q->next;
			}
		}
	}
	printf("指数升序排列后为:");
	LinkList_Print(L);
	system("pause");
	return 1;
}

int LinkList_ExpInscendingElementPrint(LinkList &L, int len)//指数升序输出系数与指数
{
	LinkList p,q,r;
	int k = 1, i, j, done = 1;
	p = L->next;
	if (p == NULL)
	{
		printf("Empty List!");
		return 0;
	}
	for (i = 1; i <= len - 1 && done; i++)//冒泡排序
	{
		done = 0;
		r = L;
		p = r->next;
		q = p->next;
		for (j = 0; j < len - i; j++)
		{
			if (p->exp > q->exp)
			{
				p->next = q->next;
				q->next = p;
				r->next = q;
				q = p->next;
				r = r->next;
				done = 1;
			}
			else
			{
				r = p;
				p = q;
				q = q->next;
			}
		}
	}
	printf("指数升序输出所有元素为:\n");
	p = L->next;
	while (p)
	{
		printf("第%d项系数为%d,第%d项指数为%d\n", k, p->coef, k, p->exp);
		p = p->next;
		k++;
	}
	system("pause");
	return 1;
}

int LinkList_Reverse(LinkList &L)//就地逆置变为指数降序
{
	LinkList p, q;
	p = L->next;
	L->next = NULL;
	if (p == NULL)
	{
		printf("Empty List!");
		return 0;
	}
	while (p)
	{
		q = p->next;
		p->next = L->next;
		L->next = p;
		p = q;
	}
	printf("逆置后为:");
	LinkList_Print(L);
	system("pause");
	return 1;
}

int LinkList_Cuculate(LinkList &L)//高效算法:输入自变量x求一元多项式的值
{
	LinkList p, q;
	int sum = 0, result = 0, q_expresult = 1, x;
	printf("请输入自变量x:");
	scanf_s("%d", &x);
	p = L->next;
	q = L;
	q->exp = 0;
	if (p == NULL)
	{
		printf("Epmty List!");
		return 0;
	}
	while (p)
	{
		result = pow(x, p->exp - q->exp)*q_expresult;//利用前一项已算出的x次幂
		q_expresult = result;
		sum = sum + p->coef*result;
		q = p;
		p = p->next;
	}
	printf("x=%d时,多项式值y=%d\n", x, sum);
	system("pause");
	return sum;
}

int LinkList_Add(LinkList &A, LinkList &B)//求两个一元多项式的和多项式
{
	LinkList pa, pb, r, s;
	int len = 0;
	pa = A->next;
	pb = B->next;
	s = A;
	free(B);
	while (pa != NULL && pb != NULL)
	{
		if (pa->exp < pb->exp)
		{
			r = pa;
			pa = pa->next;
			s->next = r;
			s = r;
		}
		else if (pa->exp > pb->exp)
		{
			r = pb;
			pb = pb->next;
			s->next = r;
			s = r;
		}
		else if (pa->exp == pb->exp)
		{
			pa->coef = pa->coef + pb->coef;
			r = pb->next;
			free(pb);
			pb = r;
			if (pa->coef == 0)
			{
				r = pa->next;
				free(pa);
				pa = r;
			}
			else
			{
				r = pa;
				pa = pa->next;
				s->next = r;
				s = r;
			}
		}
	}
	if (pa == NULL)
		s->next = pb;
	if (pb == NULL)
		s->next = pa;
	printf("相加后当前新的一元多项式为:");
	LinkList_Print(A);
	r = A->next;
	while (r)
	{
		len++;
		r = r->next;
	}
	system("pause");
	return len;
}

int LinkList_Print(LinkList &L)
{
	LinkList p;
	p = L->next;
	if (p == NULL)
	{
		printf("Epmty List!");
		return 0;
	}
	printf("y = ");
	while (p != NULL)
	{
		if (p->exp == 0)
			printf("%d", p->coef);
		else
			printf("%dx^%d", p->coef, p->exp);
		p = p->next;
		if (p != NULL)
			printf(" + ");
	}
	printf("\n");
	return 1;
}

int LinkList_MergeSame(LinkList &L)
{
	LinkList p, q;
	int len = 0;
	p = L->next;
	if (p == NULL || p->next == NULL)
		return 0;
	while (p->next)
	{
		if (p->exp == p->next->exp)
		{
			q = p->next;
			p->coef += q->coef;
			p->next = q->next;
			free(q);
			len++;
		}
		else
			p = p->next;
	}
	return len;
}
编译环境: Visual Studio

你可能感兴趣的:(Data,Strutures,and,Algorithm,C,Linklist,one-dimensional,polynomial)