利用单链表实现多项式的乘法与加法

利用单链表实现多项式的乘法与加法

题目:
利用单链表实现对多项式的加法与乘法。

输入多项式A的项数及各项的系数和指数,多项式B的项数及各项的系数和指数。建立两个多项式,按照指数降序输出多项式。注意对系数为负数的情况进行处理。程序结构要清晰。数据结构的定义和函数的声明写在头文件(.h)中,函数的实现写在源文件(.c或.cpp)中。以菜单的形式展示各种运算的操作。
在这里插入图片描述
解题思路:
利用单链表的数据结构,在读取数据时就按指数次方排序好,再加法的运算中可以直接按指数的大小进行运算,相比随机的读入数据,这个方法优化了程序。乘法则是在加法的基础上把每一项的系数进行相乘并最后求和。注意指数相乘时x指数是相加的。
实现代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define ElemType int 
#define MaxSize 100
typedef struct SSS {          //定义一个链式结构体
	ElemType data;            //存放对应指数的数据
	ElemType index;          //存放指数
	struct SSS* next;
}ListNode;

void InitList(ListNode*& L);

void CreatListTail(ListNode*& l, ElemType* a, int n);

bool ListEmpty(ListNode* L);

void DestoryList(ListNode*& l);

int Input(ListNode*& l, ListNode*& j);

ListNode* Plus(ListNode* l, ListNode* j);

ListNode* Seck(ListNode* l, ListNode* j);

bool InsertElem(ListNode* &L, int i, ElemType e);

void Put(ListNode* l)
{
	l = l->next;
	while (l != NULL) {
        if(l->next!=NULL)
		    printf("%dx^%d+", l->data, l->index);
        else 
            printf("%dx^%d",l->data, l->index);
		l = l->next;
	}
    printf("\n");
}


void InitList(ListNode*& L)
{
	L = (ListNode*)malloc(sizeof(ListNode));
	L->next = NULL;
}

void CreatListTail(ListNode*& l, ElemType* a, int n)//尾插法
{
	ListNode* s, * r; int i;
//	l = (ListNode*)malloc(sizeof(ListNode));
	r = l;

	for (i = 0; i < MaxSize; i++) {
		if (a[i] != 0&&a[i]!='\0') {
			s = (ListNode*)malloc(sizeof(ListNode));
			s->data = a[i];
			s->index = i;
			r->next = s;
			r = s;
		}
	}
	r->next = NULL;
	//链表的逻辑顺序跟数组相同
}

bool ListEmpty(ListNode* L)  //判线性表是否为空表
{
	return(L->next == NULL);
}

void DestoryList(ListNode*& l)
{
	ListNode* pre = l, * p = l->next;

	while (p != NULL) {

		free(pre);
		pre = p;
		p = pre->next;

	}
	free(pre);
}


int Input(ListNode*& l, ListNode*& j)
{
	int flag = 0;
	InitList(l);
	InitList(j);
	int a[MaxSize] = { 0 }, b[MaxSize] = { 0 },in[MaxSize],in2[MaxSize], m = 0, n = 0;
	printf("请输入第一个多项式:");
	scanf("%d\n", &n);
	m = n*2;
	
	for (int i = 0; i < m; i++) {
		if (i == m - 1) scanf("%d", &in[i]);
		else scanf("%d ", &in[i]);
	}
	//printf("yes");



	for (int i = 1; i <  m; i++) {
		
		a[in[i]] = in[i - 1];
	    i++;
	}	

    CreatListTail(l, a, n);

	printf("请输入第二个多项式:");
	scanf("%d\n", &n);
	m = n * 2;

	for (int i = 0; i < m; i++) {
		if (i == m - 1) scanf("%d", &in2[i]);
		else scanf("%d ", &in2[i]);
	}
	//printf("yes");



	for (int i = 1; i < m; i++) {

		b[in2[i]] = in2[i - 1];
		i++;
	}


	CreatListTail(j, b, n);

	


	if (!ListEmpty(l) && !ListEmpty(j)) {
		printf("success\n");
	}
	else {
		printf("error\n");
	}
	Put(l);
//	printf("\n");
	Put(j);
	return flag;
}

bool InsertElem(ListNode* &L, int i, ElemType e)//插入元素
{
	int j = 0;
	ListNode* p = L, * s;

	if (j < 0) return false;

	while (j < i - 1 && p != NULL) {
		j++;
		p = p->next;
	}
	if (p == NULL) {
		return false;
	}
	else {
		s = (ListNode*)malloc(sizeof(ListNode));
		s->next = p->next;
		s->data = e;
		p->next = s;
	}

	return true;
}

ListNode* Plus(ListNode* l, ListNode* j)
{
	ListNode* h,*p=l->next,*q=j->next,*s,*r;
	InitList(h);
    s=h;


		while (p != NULL&&q != NULL) {
			if (p->index == q->index) {
				r = (ListNode*)malloc(sizeof(ListNode));
				r->data = p->data + q->data;
				r->index = p->index;
                s->next = r;
                s = r;
                p=p->next;
                q=q->next;
			}
			else if ( p->index < q->index ) {
				r = (ListNode*)malloc(sizeof(ListNode));
				r->data = p->data;
				r->index = p->index;
                s->next = r;
                s = r;
                p=p->next;
			}
			else if ( p->index > q->index ){
				r = (ListNode*)malloc(sizeof(ListNode));
				r->data = q->data;
				r->index = q->index;
                s->next = r;
                s = r;
                q=q->next;                
		    }
            
        }

		while(p!=NULL){
				r = (ListNode*)malloc(sizeof(ListNode));
				r->data = p->data;
				r->index = p->index;
                s->next = r;
                s = r;
                p=p->next;			
		}
		while(q!=NULL){
				r = (ListNode*)malloc(sizeof(ListNode));
				r->data = q->data;
				r->index = q->index;
                s->next = r;
                s = r;
                q=q->next;   			
		}

        s->next=NULL;
  //  Put(h);
	return h;
}

ListNode* Seck(ListNode* l, ListNode* j)
{
	ListNode*p=l->next,*q=j->next,*g,*h,*s,*r;
	int flag=0;

	InitList(h);   //初始化h,h作为每个元素每次乘的和链表

	while(p!=NULL){
		while(q!=NULL){
				InitList(g),    r=g;
			
			s=(ListNode*)malloc(sizeof(ListNode));
			s->data=p->data*q->data;
			s->index=p->index+q->index;
			r->next=s;
			r=s;
			r->next=NULL;

			h=Plus(g,h);
			DestoryList(g);

			q=q->next;
		}
		q=j->next;
		//printf("yes\n");
		p=p->next;
	}

    Put(h);
	return h;
}

int main()
{
	int i = 0,n=0,k=0,flag=0;
	ListNode* l,*j,*p,*s;
	InitList(l), InitList(j);

	/*printf("********************\n1.输入两个多项式\n2.加法\n3.乘法\n4.退出\n********************\n");
	scanf("%d", &k);
	while (1) {
		switch (k){
		    case 1: Input(l, j);    break;
			case 2: p=Plus(l, j, flag); break;
			case 3: s=Seck(l, j,flag); break;
			case 4: return 0;   break;
		}
		scanf("%d", &k);
	}

*/
	Input(l, j);
    p=Plus(l,j);
    Put(p);

	s=Seck(l,j);

    system("pause");
	return 0;
}

记得点赞哦^ - ^

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值