多项式用链表保存,设多项式的最高次为M和N,则申请一个大小为M+1+N的散列表,其中M+1+N不必是素数,用结果多项式的阶次对M+1+N取余作为散列函数,可以把多项式第i阶次项的系数保存在散列表第i项上,方便后续重建多项式的链表。
// sparse_polynomial.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
struct ListNode; //声明存多项式的链表
typedef struct ListNode *List;
struct HashTbl; //用于存结果的散列表,大小为M+N
typedef struct HashTbl *HashTable;
struct ListNode
{
double coefficient;
int degree;
List Next;
int maxDegree;
};
List InitializeList(char Tag, int n) //链表初始化函数
{
List L = (List)malloc(sizeof(ListNode));
L->Next = NULL;
cout << "请输入" << Tag << "最高阶次:";
cin >> L->maxDegree;
cout << endl;
for (int i = 0; i < n; i++) {
List p= (List)malloc(sizeof(ListNode));
cout << "请输入"<<Tag<< "目标项阶次:";
cin >> p->degree;
cout << "请输入" << Tag << "该项系数:";
cin >> p->coefficient;
cout << endl;
p->Next = L->Next;
L->Next = p;
}
return L;
}
void printList(List L) //多项式打印函数
{
while (L->Next != NULL) {
if (L->Next->coefficient != 1)
cout << L->Next->coefficient << "x^" << L->Next->degree;
else
cout << "x^" << L->Next->degree;
if (L->Next->Next != NULL)cout << "+";
L = L->Next;
}
cout << endl;
}
struct HashTbl
{
int TableSize;
double *result;
};
HashTable InitializeTable(int TableSize) //初始化散列表
{
HashTable H=(HashTable)malloc(sizeof(HashTbl));
if (H == NULL)
cout << "out of space";
H->TableSize = TableSize+1;
H->result = (double *)malloc(sizeof(double)*H->TableSize); //申请一片地址空间
if (H->result == NULL)
cout << "out of space";
for (int i = 0; i < H->TableSize; i++)
H->result[i] = 0;
return H;
}
int Hash(int key, int tableSize)
{
return key%tableSize;
}
HashTable multiplication(const List A, const List B) //用散列表保存乘法的结果
{
int M = A->maxDegree;
int N = B->maxDegree;
HashTable H = InitializeTable(M+N); //申请一个M+N+1大小的散列表
List nodeA = A->Next;
List nodeB = B->Next;
int resultDegree;
double resultCoefficient;
while (nodeA) {
nodeB = B->Next;
while (nodeB)
{
resultDegree = nodeA->degree + nodeB->degree;
resultCoefficient = nodeA->coefficient*nodeB->coefficient;
H->result[Hash(resultDegree, H->TableSize)] += resultCoefficient; //散列表第几个槽代表第几阶次;
nodeB = nodeB->Next;
}
nodeA = nodeA->Next;
}
return H;
}
List makeResultList(HashTable H) //检测散列表中不为0的项存在结果链表上
{
List ResultList = (List)malloc(sizeof(ListNode));
ResultList->Next = NULL;
int maxDegree = H->TableSize-1;
ResultList->maxDegree = maxDegree;
for (int i = 0; i<=maxDegree; i++)
if (H->result[i] != 0) {
List p = (List)malloc(sizeof(ListNode));
p->degree = i;
p->coefficient = H->result[i];
p->Next = ResultList->Next;
ResultList->Next = p;
}
return ResultList;
}
int main()
{
int m, n;
cout << "请输入第一个多项式A的项数:";
cin >> m;
List A = InitializeList('A',m);
cout << "请输入第二个多项式B的项数:";
cin >> n;
cout << endl;
List B = InitializeList('B', n);
printList(A);
printList(B);
HashTable H = multiplication(A, B);
List Result = makeResultList(H);
printList(Result);
while (1);
return 0;
}