线性表练习4——一元稀疏多项式计算器

问题描述

在这里插入图片描述

解题思路

  • 用带表头节点的单链表存储多项式,多项式的项数存放在头结点

代码实现

  • 结构体和单链表定义
typedef struct
{
	int exp; //指数
	double res; //系数
}Polynomial;
typedef struct Node
{
	int exp;       //指数
	double res;    //系数
	struct Node* next;
}Node,*LinkList;
  • 链表初始化
void InitList(LinkList &L,char *pol)
{
	L = (LinkList)malloc(sizeof(Node));
	L-> next = nullptr;
	char a[10] = "";
	a[0] = pol[0];
	a[1] = '\0';
	int num = atoi(a);
	L->exp = num;  // 存储多项式的项数
	Node* p = L;
	int i = 2;
	int flag = 1;
	Polynomial pol_tmp;
	while (pol[i] != '\0')
	{
		char tmp[10] = "";
		int k = 0;
		if (pol[i] == 32)
		{
			i++;
			continue;
		}
		for (; pol[i] != 32 && pol[i] != '\0'; i++)
		{
			tmp[k] = pol[i];
			k++;
		}
		if (flag % 2 != 0)
			pol_tmp.exp = atoi(tmp);
		else
		{
			pol_tmp.res = atof(tmp);
			Node* newNode = (LinkList)malloc(sizeof(Node));
			newNode->exp = pol_tmp.exp;
			newNode->res = pol_tmp.res;
			p->next = newNode;
			p = newNode;
			p->next = nullptr;
		}
		flag++;
	}
	return;
}
  • 多项式相加
bool compare(int a, int b)
{
	return a >= b;
}
void handleList(LinkList& la,int exp,float res,bool(*compare)(int,int))
{
	Node* pa = la->next;
	while (pa != nullptr)
	{
		if (pa->exp == exp)
		{
			if (pa->res + res != 0)
				pa->res += res;
			else
			{
				pa->res += res;
				--la->exp;
			}
			return;
		}
		pa = pa->next;
	}
	//如果没有对应的系数,就将系数插入
	Node* pa1 = la->next;
	while (pa1 != nullptr)
	{
		if (compare(res, la->next->exp))
		{
			Node* newNode = (Node*)malloc(sizeof(Node));
			newNode->exp = exp;
			newNode->res = res;
			newNode->next = la->next;
			la->next = newNode;
			la->exp++;
			return;
		}
		if (pa1->next == nullptr || compare(pa1->res, res) && compare(res, pa1->next->res))
		{
			Node* newNode = (Node*)malloc(sizeof(Node));
			newNode->exp = exp;
			newNode->res = res;
			newNode->next = pa1->next;
			pa1->next = newNode;
			la->exp++;
			return;
		}
		pa1 = pa1->next;
	}
}

void showList(LinkList& la)
{
	Node* p = la->next;
	cout << la->exp;
	while (p != nullptr)
	{
		if (p->res != 0)
			cout << " " << p->exp << " " << p->res;
		p = p->next;
	}
}
void addList(LinkList& la, LinkList& lb)
{
	Node* pb = lb->next;
	while (pb != nullptr)
	{
		handleList(la, pb->exp, pb->res, compare);
		pb = pb->next;
	}
	showList(la);
}
  • 测试函数
int main()
{
	char A[1000], B[1000];
	int size = 0;
	cin.getline(A, 1000);
	cin.getline(B, 1000);
	LinkList LA, LB;
	InitList(LA, A);
	InitList(LB, B);
	addList(LA, LB);
	return 0;
}
发布了33 篇原创文章 · 获赞 3 · 访问量 597

猜你喜欢

转载自blog.csdn.net/qq_43647628/article/details/104698237
今日推荐