利用單連結清單實作多項式的乘法與加法
題目:
利用單連結清單實作對多項式的加法與乘法。
輸入多項式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;
}
記得點贊哦^ - ^