写了一个晚上,只是把多项式相加的实现了。
多项式的销毁也没写完。其中LinkList也没太完全弄明白书里到底是什么意思,数据结构的书太乱了,给的是伪代码也就算了,还不给给全,真是太闹心了。
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int BOOL;
typedef int Status;
typedef struct {
float coef;
int expn;
}term, ElemType;
typedef struct LNode{
ElemType data;
struct LNode* next;
}*Link,*Position;
typedef struct {
Link head,tail;
int len;
}LinkList;
typedef LinkList polynomial;
Status InitList(LinkList& L);
// 构造一个空的线型链表L
Position GetHead(LinkList L);
// 返回线性链表L中头节点的位置
Status SetCurElem(Link& p,ElemType e);
// 已知p指向线性链表中的一个结点,用e更新p所指的结点中数据元素的值
Position LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType));
// 返回线型链表L中第一个与e满足函数compare()判定关系的元素位置,
// 若不存在返回NULL
Status MakeNode(Link& p,ElemType e);
// 分配由p指向值为e的结点,并返回OK;若分配失败,则返回ERROR
Status InsFirst(LinkList& L,Link s);
// 已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前
Position NextPos(LinkList L,Link p);
// 已知p指向线性链表L中的一个结点,返回p所指结点的直接后继位置,
// 若无后继,则返回NULL
ElemType GetCurElem(Link p);
// 已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值
Status DelFirst(Link h,Link& q);
// 已知h指向线性表的头结点,删除链表中的第一个结点并以q返回
Status ListEmpty(LinkList L);
// 若线性表L为空,则返回TRUE,否则返回FALSE
Status Append(LinkList& L,Link s);
// 将指针s所指(彼此以指针相链)的一串结点链接在线性表L的最后一个结点
// 之后,并改变链表Ld尾指针指向新的尾结点
// - - - - - 基本操作的函数原型说明 - - - - -
void CreatPolyn(polynomial& P,int m);
// 输入m项的系数和直属,建立表示一元多项式的有序链表P
void DestroyPolyn(polynomial& P);
// 销毁一元多项式P
void PrintPolyn(polynomial P);
// 打印输出一元多项式P
void PolynLength(polynomial P);
// 返回一元多项式P中的项数
void AddPolyn(polynomial& Pa,polynomial& Pb);
// 完成多项式相加运算,即:Pa = Pa + Pb,并销毁一元多项式Pb
void SubtractPolyn(polynomial& Pa,polynomial& Pb);
// 完成多项式相减运算,即:Pa = Pa - Pb,并销毁一元多项式Pb
void MultiplyPolyn(polynomial& Pa,polynomial& Pb);
// 完成多项式相乘运算,即:Pa = Pa * Pb,并销毁一元多项式Pb
// - - - - - - 基本操作的算法描述 - - - - -
Status Append(LinkList& L,Link s){
// 将指针s所指(彼此以指针相链)的一串结点链接在线性表L的最后一个结点
// 之后,并改变链表L的尾指针指向新的尾结点
Link p = L.head;
while(p->next) p = p->next;
p->next = s;
while(p->next) p = p->next;
L.tail = p;
return OK;
}
Status ListEmpty(LinkList L){
// 若线性表L为空,则返回TRUE,否则返回FALSE
Link h = L.head;
if (h->next != NULL)
return FALSE;
return TRUE;
}
Status DelFirst(Link h,Link& q){
// 已知h指向线性表的头结点,删除链表中的第一个结点并以q返回
q = h->next;
h->next = q->next;
return OK;
}
ElemType GetCurElem(Link p){
// 已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值
return p->data;
}
Position NextPos(LinkList L,Link p){
// 已知p指向线性链表L中的一个结点,返回p所指结点的直接后继位置,
// 若无后继,则返回NULL
return p->next;
}
Status InsFirst(LinkList& L,Link s){
// 已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前
if (L.head == L.tail){
L.head->next = s; L.tail = s; s->next = NULL;
return OK;
}
Link p = L.head;
s->next = p->next; p->next = s;
return OK;
}
Status MakeNode(Link& p,ElemType e){
// 分配由p指向值为e的结点,并返回OK;若分配失败,则返回ERROR
p = (Link)malloc(sizeof(LNode));
if (!p) exit(ERROR);
p->data = e;
return OK;
}
Status InitList(LinkList& L){
// 构造一个空的线性表L
L.len = 0;
L.head = (Link)malloc(sizeof(LNode));
if (!L.head) exit(OVERFLOW);
//L.tail = L.head;
L.head->next = NULL;
return OK;
}
Position GetHead(LinkList L){
// 返回线性链表L中头节点的位置
return L.head;
}
Status SetCurElem(Link& p,ElemType e){
if (!p) exit(OVERFLOW);
p->data = e;
return OK;
}
Position LocateElem(LinkList L,ElemType e,Status (*compare)(ElemType,ElemType)){
// 返回线型链表L中第一个与e满足函数compare()判定关系的元素位置,
// 若不存在返回NULL
Link p = GetHead(L);
while(p->next){
if (compare(p->next->data,e) == 0)
return p->next;
p = p->next;
}
return NULL;
}
int cmp(term a,term b);
// 依a的指数<(或=)(或>)b的指数值,分别返回-1、0和+1
int cmp(term a,term b){
// 依a的指数<(或=)(或>)b的指数值,分别返回-1、0和+1
if (a.expn < b.expn) return -1;
if (a.expn == b.expn) return 0;
return 1;
}
void CreatPolyn(polynomial& P,int m){
// 输入m项的系数和指数,建立表示一元多项式的有序链表P
InitList(P); Position h = GetHead(P);
ElemType e; e.coef = 0.0; e.expn = -1; SetCurElem(h,e); //设置头结点的数据元素
Link s;
for(int i = 1;i <= m;i++){ // 依次输入m个非零项
scanf("%f%d",&e.coef,&e.expn);
//cin>>e.coef>>e.expn;
//cout<<e.coef<<" "<<e.expn<<endl;
if (!LocateElem(P,e,cmp)){
if (MakeNode(s,e)) InsFirst(P,s);
}
}
}// CreatPolyn
void AddPolyn(polynomial& Pa,polynomial& Pb){
// 完成多项式相加运算,即:Pa = Pa + Pb,并销毁一元多项式Pb
Link ha = GetHead(Pa),hb = GetHead(Pb),qa,qb;
qa = NextPos(Pa,ha); qb = NextPos(Pb,hb);
ElemType a,b;
ElemType sum;
while(qa&&qb){
a = GetCurElem(qa); b = GetCurElem(qb);
switch(cmp(a,b)){
case -1:
ha = qa; qa = NextPos(Pa,qa); break;
case 0:
sum.expn = a.expn;
sum.coef = a.coef + b.coef;
if (sum.coef != 0.0){
SetCurElem(qa,sum); ha = qa;}
else{
DelFirst(ha,qa); free(qa);}
DelFirst(hb,qb); free(qb); qb = NextPos(Pb,hb);
qa = NextPos(Pa,ha); break;
case 1:
DelFirst(hb,qb); InsFirst(Pa,qb);
qb = NextPos(Pb,hb); ha = NextPos(Pa,ha); break;
}//switch
}//while
if (!ListEmpty(Pb)) Append(Pa,qb);
free(hb);
}
void PrintPolyn(polynomial P){
// 打印输出一元多项式P
Link p = P.head;
while(p->next){
cout<<"("<<p->next->data.coef<<","<<p->next->data.expn<<")"<<endl;
p = p->next;
}
}
int main(){
polynomial Pa,Pb;
CreatPolyn(Pa,4);
CreatPolyn(Pb,3);
AddPolyn(Pa,Pb);
PrintPolyn(Pa);
return 0;
}
这篇博客讲述了博主如何利用链表数据结构实现多项式相加,虽然花费了一晚上的时间,但仍然未能完成多项式的销毁部分。博主对《数据结构》中关于LinkList的解释感到困惑,认为书中伪代码不全且混乱。
1320

被折叠的 条评论
为什么被折叠?



