標頭檔案:polynomial.h
#include
#include
using namespace std;
#define true 1
#define false 0
#define ok 1
#define error 0
typedef int status;
typedef struct
term, elemtype;
typedef struct lnode
*link, *position;
typedef struct
linklist_l;
typedef linklist_l polynomial;
//分配由p指向的值為e的結點,並返回ok;若分配失敗,則返回error
status makenode(link& p, elemtype e)
//釋放p所指向的結點
void freenode(link& p)
//構造乙個空的線性鍊錶l
status initlist(linklist_l& l)
//將線性鍊錶l置為空表
status clearlist(linklist_l& l)
link p = l.head->next;
while (p)
l.head->next = null;
l.tail = l.head;
l.len = 0;
return ok; }
//銷毀線性鍊錶l
status destroylist(linklist_l& l)
//已知h指向線性鍊錶的頭結點,將s所指向結點插入在第乙個結點之前
status insfirst(link h, link s)
//已知h指向線性鍊錶的頭結點,刪除鍊錶中的第乙個結點並以q返回
status delfirst(link h, link& q)
return error; }
s = s->next; }
return error; }
//刪除線性鍊錶l中的尾結點並以q返回,改變鍊錶l的尾指標指向新的尾結點
status remove(linklist_l& l, link& q)
s = s->next; }
return error; }
//已知p指向線性鍊錶l中的乙個結點,將s所指結點插入在p所指結點之前,並修改指標p指向新插入的結點
status insbefore(linklist_l& l, link& p, link s)
q = q->next; }
return error; }
//已知p指向線性鍊錶l中的乙個結點,將s所指結點插入p所指結點之後,並修改指標p指向新插入的結點
status insafter(linklist_l& l, link& p, link s)
//已知p指向線性鍊錶中的乙個結點,用e更新p所指結點中資料元素的值
status setcurelem(link& p, elemtype e)
//已知p指向線性鍊錶中的乙個結點,返回p所指向結點的資料元素
elemtype getcurelem(link p)
//若線性鍊錶l為空,則返回true;否則返回false
status listempty(linklist_l l)
//返回線性鍊錶l中元素個數
int listlength(linklist_l l)
//返回線性鍊錶l中頭結點的位置
position gethead(linklist_l l)
//返回線性鍊錶l中最後乙個結點的位置
position getlast(linklist_l l)
//返回線性鍊錶中第i個結點
position getnode(linklist_l l, int i)
return p; }
//已知p指向線性鍊錶l中的乙個結點,返回p所指結點的直接前驅的位置,若無前驅則返回null
position priorpos(linklist_l l, link p)
return null; }
//已知p指向線性鍊錶l中的乙個結點,返回p所指結點的直接後繼的位置,若無後繼則返回null
position nextpos(linklist_l l, link p)
//用結點p替換線性鍊錶中第i個結點
status displacelink(linklist_l& l, int i, link p)
//返回p指示線性鍊錶l中第i個結點的位置,並返回ok,i值不合法時返回error
status locatepos(linklist_l l, int i, link& p)
return ok; }
//若當前項a的指數小於b的指數,返回-1,若相等返回0,若大於則返回1
int compare(elemtype a, elemtype b)
}//若一元多項式中存在和e指數相同的項,返回ok,否則返回error
status locateelem(linklist_l l, elemtype e, link& q, status(*compare)(elemtype, elemtype))
if (!q)
return error;
return ok; }
//在帶頭結點的單鏈表l的第i個元素之前插入元素e
status listinsert(linklist_l& l, int i, elemtype e)
if (!locatepos(l, i - 1, h))
return error;
insfirst(h, s);
if (!s->next)
l.tail = s;
l.len++;
return ok; }
//在帶頭結點的單鏈表l中刪除第i個元素,並用e返回
status listdelete(linklist_l& l, int i, elemtype& e)
//將線性鍊錶l複製給s
status copy(linklist_l& s, linklist_l l)
return ok; }
//輸入m項的係數和指數,建立表示一元多項式的有序鍊錶p
void creatpolyn(polynomial& p, int m)
} else
} }//銷毀一元多項式p
void destroypolyn(polynomial& p)
freenode(p.head); }
//列印輸出一元多項式p
void printpolyn(polynomial p)
if (h->next)
h = h->next; }
cout << endl; }
//返回一元多項式p中的項數
int polynlength(polynomial p)
//多項式加法:pa=pa+pb,利用兩個多項式的結點構成"和多項式"
void addpolyn(polynomial& pa, polynomial& pb)
else //如果係數之和等於0
delfirst(hb, qb); //pa=pa+pb,不管係數之和等於0或不等於0,pb的當前項都要刪除
pb.len--;
freenode(qb); //釋放空間
qb = nextpos(pb, hb); //結點qb後移
qa = nextpos(pa, ha); //結點qa後移
break;
case 1: //pa當前項的指數大於pb當前項的指數
delfirst(hb, qb); //刪除pb的當前項
pb.len--;
insfirst(ha, qb); //插入到pa中與當前項的前面
pa.len++;
qb = nextpos(pb, hb); //結點qb後移
ha = nextpos(pa, ha); //結點ha後移到剛插入的結點
break; }
}if (!listempty(pb))
freenode(hb); }
//多項式減法:pa=pa-pb,可理解為pa=pa+(-pb),並銷毀一元多項式pb
void subtractpolyn(polynomial& pa, polynomial& pb)
addpolyn(pa, pb); }
//多項式相乘運算,即pa=pa*pb,並銷毀一元多項式pb
void multiplypolyn(polynomial& pa, polynomial& pb)
if (i > 1)
} destroylist(pd); }
主函式:
#include"polynomial.h"
void main(void)
一元多項式的表示及相加
符號多項式的操作,已經成為表處理的典型用例。我們對多項式採用順序儲存結構,可以只儲存每項係數,指數隱含在係數的序號裡。在這種情況下,如果多項式的次數很高且變化很大,那麼便很難來確定順序儲存的最大長度,另外對記憶體空間也極為浪費。一般情況下,對於那些多項式的次數很高,但項數不多的多項式我們可以將一元n...
一元多項式的表示及相加
題目 若a a0x0 a1x1 a2x2 a3x3 anxn b b0x0 b1x1 b2x2 b3x3 bnxn 求a b 順序儲存結構的實現 實現乙個陣列每兩個元素為乙個單位,左邊指數,右邊是係數。從係數為0,一直寫到最大的那個係數。利用鍊錶的思維 上大,上移 上小,下插入上。上移名 上下相等,...
一元多項式的表示及相加
對於一元多項式,可以用線性表來處理,可以採用順序儲存或者是鏈式儲存 一 一元多項式的順序儲存表示 1 一元多項式pn x 只儲存該一元多項式各項的係數,每個係數所對應的指數項則隱含在儲存係數的順序表的下標中。即p 0 存係數p0,對應為 2 只儲存非零項,此時只需要儲存非零項係數和非零項指數兩部分,...