数据结构多项式操作及文件存取

⑴ 输入并建立多项式;
⑵ 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。所有输出都按指数降序排列。
⑶ 多项式A和B相加,建立多项式A+B,输出相加的多项式;
⑷ 多项式A和B相减,建立多项式A-B,输出相减的多项式;
⑸ 多项式A和B相乘,建立多项式A×B,输出相乘的多项式;
⑹ 设计一个菜单,至少具有上述操作要求的基本功能。
(7) 通过文件输入、输出多项式

链式存储表示的类型定义

typedef struct ploy
{
	float coef;  /*系数部分*/
	int expn;    /*指数部分*/
	struct ploy *next;
}PLoy;

初始化链表,生成只有头结点的空链表

PLoy *init_Ploy_LinkList(void)
{
	PLoy *head;
	head = (PLoy *)malloc(sizeof(PLoy));
	head->coef = 0.0;
	head->expn = 0;
	head->next = NULL;
	return head;
}

将项(co,ex)以k的方式插入到以L为头指针的一元多项式链表中
插入后的一元多项式链表是按指数从大到小排列的

void add_ploy_item(PLoy *L,float co,int ex,int k)
{
	PLoy *pre = L, *p = L->next, *q;
	float x;
	while (p != NULL && p->expn > ex)
	{
		pre = p;
		p = p->next;
	}
	if (p == NULL)//链表已经到最后,开辟新结点,直接插入到最后
	{
		q = (PLoy *)malloc(sizeof(PLoy));
		q->coef = k*co;
		q->expn = ex;
		q->next = p;
		pre->next = q;
	}
	else if (p->expn == ex)//有同类项
	{
		x = p->coef + k * co;
		if (fabs(x) <= 1.0e-6)//合并后系数为0,删除该结点
		{
			pre->next = p->next;
			free(p);
			p = pre->next;
		}
		else
		{
			p->coef = x;//合并后不为0,修改该系数
		}
	}
	else//没有同类项,开辟新结点,直接插入
	{
		q = (PLoy *)malloc(sizeof(PLoy));
		q->coef = k * co;
		q->expn = ex;
		q->next = p;
		pre->next = q;
	}
}

每输入一项(co,ex),调用add_ploy_item函数,将其插入到以head为头结点的链表的合适位置`

void create_Ploy_LinkList(PLoy *head)
{
	float coef;
	int expn;
	while (1)
	{
		printf("\n请输入一元多项式的系数(0.0表示结束): ");
		scanf("%f", &coef);
		if (coef == 0.0)
		{
			break;
		}
		else
		{
			printf("\n请输入一元多项式的指数: ");
			scanf("%d", &expn);
			add_ploy_item(head, coef, expn, 1);
		}
	}
}

将按指数从小到大有序的多项式LA和LB相加得到结果多项式链表LC

void add_ploy_LinkList(PLoy *LC, PLoy *LA, PLoy *LB)
{
	PLoy *p;
	p = LA->next;
	while (p != NULL)
	{
		add_ploy_item(LC, p->coef, p->expn, 1);
		//将多项式LA的每一项(c,e),依次将其插入到结果多项式链表的合适位置
		p = p->next;
	}
	p = LB->next;
	while (p != NULL)
	{
		add_ploy_item(LC, p->coef, p->expn, 1);
		//将多项式LB的每一项(c,e)相加插入到结果多项式链表的合适位置
		p = p->next;
	}
}

将按指数从小到大有序的多项式LA和LB相乘得到结果多项式链表LC

void multi_ploy_LinkList(PLoy *LC, PLoy *LA, PLoy *LB)
{
	PLoy *p = LA->next, *q;
	float coef;
	int expn;
	while (p != NULL)//将多项式LA的每一项(c,e)
	{
		q = LB->next;
		while (q != NULL)//与多项式LB的所有项依次相乘
		{
			coef = (float)p->coef * q->coef; //系数相乘得到积的系数
			expn = p->expn + q->expn;//指数相加得到积的指数
			if (fabs(coef) > 1.0e-6)//积的系数不为0,将其插入到结果多项式链表的合适位置
			{
				add_ploy_item(LC, coef, expn, 1);
			}
			q = q->next;
		}
		p = p->next;
	}
}

输出以L为头结点的单链表中所有结点的值

void output_Ploy_LinkList(PLoy *L)
{
	PLoy *p = L->next;
	int first = 1;
	if (p == NULL)
	{
		printf("\n您所输入的多项式为空!!\n\n");
	}
	else
	{
		while (p != NULL)
		{
			if (p->coef > 0 && first)
			{
				printf("%g", p->coef);
				first = 0;
			}
			else if (p->coef > 0)
			{
				printf("+%g", p->coef);
			}
			else
			{
				printf("%g", p->coef);
				first = 0;
			}
			if (p->expn != 0 && p->expn != 1)
			{
				printf("X^");
				printf("%d", p->expn);
			}
			else if (p->expn == 1)
			{
				printf("X");
			}
			p = p->next;/*  移动指针p   */
		}
	}
	printf("\n\n");
}

将读取的多项式式,依照k方式写入到存放结果文件ployC.txt

void read_ploy_LinkList(PLoy *L)
{
	FILE *fp;
	PLoy *p = L->next;
	fp = fopen("ployC.txt", "at+");
	if (fp == NULL)
	{
		printf("Fail to open file!\n\n");
	}
	if ( p == NULL )
	{
		printf("输入文件的多项式为空\n\n");
	}
	fprintf(fp, ",");
	while (p != NULL)
	{
		fprintf(fp, "%g %d, ", p->coef, p->expn);
		p = p->next;
	}
	fprintf(fp,"\n");
	fclose(fp);
}

读取k方式的文件,读出第n个多项式,写到多项式L上

void write_ploy_LinkList(PLoy *head, int k,int n)
{
	float coef;
	int expn,i = 0,c;
	char ch;
	FILE *fr;
	if (k == 1)
	{
		fr = fopen("ployA.txt", "r");
	}
	else
	{
		fr = fopen("ployB.txt", "r");
	}
	while (i < n-1 && (c = fgetc(fr)) != EOF)// n-1就是你想跳过的行数
	{
		if (c == '\n')
		{
			i++;
		}
	}
	while (1)
	{
		if ((ch = fgetc(fr)) == '\n') //读到换行符,结束
		{
			break;
		}
		else
		{
			fscanf(fr, "%g %d,", &coef, &expn);
			//printf("%g,%d\n", coef, expn);
			add_ploy_item(head, coef, expn, 1);
		}
	}
	fclose(fr);
}

注:文件格式:
,1 2,(空格)1 2,(空格)1 2,(回车)

原创文章 7 获赞 8 访问量 1166

猜你喜欢

转载自blog.csdn.net/bestlinton/article/details/105152994