/*----------------------------------------------------------------------------------
程序说明:
这一个程序是《数据结构》这本书上面的例子来的。
功能是实现两个多项式的相加。
这一个程序的核心代码(伪代码)是来源于书上。而我的工作就是将它实现。虽然书上面提供的
最核心思想,但是如果完照抄书上面的代码,你会发现其实那些代码是十分坑爹的,尤其是要
用到指针的地方。本应是要用引用或者指针的,可是书上往往会写成直接传数值,而不是地址
或者引用。
总结:
如果不是那么严格,这一个小小程序,应该可以算是一个比较小的课程设计吧。不过,这一个
程序虽小,但是我也足足花一个下午加上晚上的时间才完成。本来,我打算一个下午时间就可以
完成的。谁知道,竟然大部分时间用在调试方面。尤其是在结构指针上面,往往忘记了分配内存
就使用。看来是太久没有动手做点比较大的东西。。
-------------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------------
addpolyn.c
提供测试代码
edited by Seed,2011
-------------------------------------------------------------------------------*/
#include<stdio.h>
#include"addpolyn.h"
int main(void)
{
Polynomial Pa, Pb ;
int m ;
printf("请输入多项式 A 的项数 : ") ; //构造多项式A
scanf("%d",&m) ;
CreatPolyn(&Pa,m) ;
PrintPolyn(Pa) ;
printf("请输入多项式 B 的项数 : ") ; //构造多项式B
scanf("%d",&m) ;
CreatPolyn(&Pb,m) ;
PrintPolyn(Pb) ;
AddPolyn(&Pa, &Pb) ; //合并A和B
PrintPolyn(Pa) ;
Destroy(&Pa) ;
return 0 ;
}
/*------------------------------------------------------------------
File : addpolyn.h
Fuction : 提供各种各样的定义
edited by Seed , 2011
----------------------------------------------------------------*/
#ifndef ADDPOLYN_H_
#define ADDPOLYN_H_
/*-----------------------------------------------------------
数据类型定义
---------------------------------------------------------*/
typedef struct
{
float coef ;
int expn ;
} term, ElemType ;
typedef struct LNode
{
ElemType data ;
struct LNode *next ;
} LNode ,*Link, *Position ;
typedef struct
{
Link head , tail ;
int len ;
} LinkList ;
typedef LinkList Polynomial ;
/*---------------------------------------------------------
函数头声明、以及定义函数返回值定义
-------------------------------------------------------*/
typedef int Status ;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
Link GetHead(Polynomial *P) ;
Status InitList(Polynomial *P) ;
Status SetCurElem(Link *p,ElemType e) ;
Status LocateElem(Polynomial *P,ElemType e,Position *q,int (*compare)(ElemType,ElemType) ) ;
Status MakeNode(Link *p,ElemType e) ;
Status InsFirst(Link h,Link s) ;
int cmp(term a,term b) ;
void CreatPolyn(Polynomial *P ,int m) ;
Link NextPos(Polynomial *P, Link l) ;
ElemType GetCurElem(Link p) ;
void FreeNode(Link P) ;
Status ListEmpty(LinkList L) ;
Status Append(LinkList *L,Link s) ;
void AddPolyn(Polynomial *Pa, Polynomial *Pb) ;
void Destroy(Polynomial *P) ;
void PrintPolyn(Polynomial P) ;
#endif
/*------------------------------------------------------------------
File : polyn.h
Fuction : 提供接口的实现
edited by Seed , 2011
----------------------------------------------------------------*/
#include"addpolyn.h"
#include<stdio.h>
#include<stdlib.h>
Link GetHead(Polynomial *P)
{
return (P->head) ;
} //GetHead
Status InitList(Polynomial *P)
{
if((P->head = P->tail = (Link) malloc(sizeof(LNode))) == NULL) //我曾经在这里写成p->head = p->tail = e ;但是这会造成程序崩溃
{
printf("Can't assign room\n") ;
exit(1) ;
}
//因为e只是临时变量,函数返回时会自动释放,所以函数返回时不存在,
P->len = 0 ; //也就是说指向了已经释放的内存.
P->head->next = NULL ;
return OK ;
} //InitList
Status SetCurElem(Link *p,ElemType e)
{
if(NULL == p)
{
printf("Error\n") ;
return ERROR ;
}
else
{
(*p)->data = e ;
return OK ;
}
} //SetCurElem
int cmp(term a,term b)
{
if(a.expn > b.expn )
return 1 ;
else if(a.expn == b.expn )
return 0 ;
else
return -1 ;
} // cmp
Status LocateElem(Polynomial *P,ElemType e,Link *q,int (*compare)(ElemType,ElemType) )
{
Link temp = (Link)malloc(sizeof(LNode)) ;
Link pre = (Link) malloc(sizeof(LNode)) ;
ElemType t ;
temp = P->head->next ;
pre = P->head ;
while(temp != NULL)
{
t = temp->data ;
switch((*compare)(t,e))
{
case 1 :
(*q) = pre ;
return 1 ;
case 0 :
return 0 ;
} //switch-case
temp = temp->next ;
pre = pre->next ;
} //while
return -1 ;
} //LocateElem
Status MakeNode(Link *p,ElemType e)
{
if(((*p) = (Link) malloc(sizeof(LNode))) != NULL)
{
(*p)->data = e ;
(*p)->next = NULL ;
return TRUE ;
}
return FALSE ;
} //MakeNode
Status InsFirst(Link h,Link s)
{
Link temp ;
if((temp = (Link) malloc(sizeof(LNode))) != NULL )
{
temp = h->next ;
s->next = temp ;
h->next = s ;
return OK ;
}
return FALSE ;
}
void CreatPolyn(Polynomial *P ,int m)
{
Link h ,s = NULL;
ElemType e ;
int i = 0 ;
Link *q = (Link *) malloc(sizeof(LNode)) ;
Link last = (Link) malloc(sizeof(LNode)) ;
e.coef = 0.0 ;
e.expn = -5 ;
InitList(P) ;
h = GetHead(P) ;
if(!SetCurElem(&h,e))
{
printf("The pointer is NUUL\n") ;
exit(1) ;
}
for(i = 0 ; i < m ; i++)
{
printf("\n请输入系数:") ;
scanf("%f",&(e.coef )) ;
printf("\n请输入指数: ") ;
scanf("%d",&(e.expn) ) ;
switch(LocateElem(P,e,q,cmp))
{
case 0 :
break ;
case 1 :
if(MakeNode(&s,e))
{
if(InsFirst(*q,s))
{
P->len++ ;
}
}
break ;
case -1 :
if(MakeNode(&s,e))
{
last = P->tail ;
last->next = s ;
P->tail = s ;
P->len++ ;
} //if
break ;
}//switch
} //for
} //CreatPolyn
Link NextPos(Polynomial *P, Link l)
{
Link cur = P->head ;
while(cur != l && cur != NULL)
cur = cur->next ;
if(NULL == cur)
return NULL ;
else
return l->next ;
} //NextPos
ElemType GetCurElem(Link p)
{
return p->data ;
} //GetCurElem
Status DelFirst(Link h, Link q)
{
Link temp ;
if(NULL == h->next )
{
q = NULL ;
return ERROR ;
}
temp = h->next ;
h->next = h->next ->next ;
q = temp ;
return OK ;
} //DelFirst
void FreeNode(Link P)
{
if(NULL == P)
;
else
{
free(P) ;
P = NULL ;
}
} //FreeNode
Status ListEmpty(LinkList L)
{
if(L.head == L.tail)
return TRUE ;
else
return FALSE ;
} //ListEmpty
Status Append(LinkList *L,Link s)
{
int count = 0 ;
L->tail->next = s ;
while(s != NULL)
{
s = s->next ;
count++ ;
}
L->tail = s ;
L->len += count ;
return TRUE ;
}//Append
void AddPolyn(Polynomial *Pa,Polynomial *Pb)
{
Link ha ,hb ;
Link qa, qb ;
ElemType a ,b ;
float sum ;
ha = GetHead(Pa) ;
hb = GetHead(Pb) ;
qa = NextPos(Pa,ha) ;
qb = NextPos(Pb,hb) ;
while((qa != NULL) && (qb != NULL))
{
a = GetCurElem(qa) ;
b = GetCurElem(qb) ;
switch(cmp(a,b))
{
case -1 :
ha = qa ;
qa = NextPos(Pa,qa) ;
break ;
case 0 :
sum = a.coef + b.coef ;
a.coef = sum ;
if(sum != 0.0)
{
SetCurElem(&qa,a) ; //Status SetCurElem(Link *p,ElemType e)
ha = qa ;
}
else
{
if(DelFirst(ha,qa))
{
Pa->len-- ;
}
FreeNode(qa) ;
}
DelFirst(hb,qb) ;
FreeNode(qb) ;
qb = NextPos(Pb,hb) ;
qa = NextPos(Pa,ha) ;
break ;
case 1 :
DelFirst(hb,qb) ;
InsFirst(ha,qb) ;
qb = NextPos(Pb,hb) ;
ha = NextPos(Pa,ha) ;
break ;
} //switch
} //while
if(!ListEmpty(*Pb))
{
Append(Pa,qb) ;
}
FreeNode(hb) ;
} //AddPolyn
void Destroy(Polynomial *P)
{
Link h = P->head ;
Link temp ;
while(h != NULL)
{
temp = h ;
h = h->next ;
free(temp) ;
}
} //Destroy
void PrintPolyn(Polynomial P)
{
Link h= P.head ;
while(h != NULL)
{
printf("%.2f^%d + " ,h->data.coef ,h->data.expn ) ;
h = h->next ;
}
printf("\n\n\n") ;
} //PrintPolyn
数据结构应用-------------多项式的相加
最新推荐文章于 2023-04-11 13:22:11 发布