printf(\插入位置不合理\); return ERROR; }
s=(DNode *)malloc(sizeof(DNode)); s->data=e;
s->prior=p->prior; p->prior->next=s; s->next=p; p->prior=s; return OK;
}
2、双向链表的删除操作
算法思想:欲删除双向链表中的第i个结点,则指针的变化情况如下图所示:
算法:
typedef struct DNode {
ElemType data;
struct DNode *prior,*next; }DNode,*DoubleList;
int DlinkDel(DoubleList L,int i,ElemType *e) /*将删除的元素保存到*e中*/ {
DNode *p; int k; if(i<=0) return ERROR; p=L;k=0;
while(p!=NULL&&knext; k++; }
if(p==NULL)
{ printf(\插入位置错误\); return ERROR; }
*e=p->data;
p->prior->next=p->next; p->next=p->prior; free(p); return OK; }
3、应用举例
例题:已知:设一个循环双链表L?(a,b,c,d)编写一个算法将链表转换为L?(b,a,c,d)。
算法思想:实际上是交换表中前两个元素的次序。 算法:
typedef struct DNode {
ElemType data;
struct DNode *prior,*next; }DNode,*DoubleList; void swep(DLinkList L) {
DNode *p,*q,*r; p=L->next; q=p->next; r=p->prior;
p->next=q->next; q->next->prior=p; p->prior=q; q->next=p; q->prior=r; L->next=q; return L; }
2.4 一元多项式的表示及相加
2.4.1 一元多项式的表示
一元多项式可按升幂的形式写成:
ene1e2Pn(x)?p0?p1x?p2x???pnx
其中,ei为第i项的指数,pi是指数ei的项的系数,且
1?e1?e2???en。
假设Qm(x)是一个一元多项式,则它可以用一个线性表Q来表示。即:Q?(q0,q1,q2,?,qm)
若假设m?n,则两个多项式相加的结果Rn(x)?Pn(x)?Qn(x),也可以用线性表R来表示:
R?(p0?q0,p1?q1,p2?q2,?,pm?qm,pm?1,?,pn)
2.4.2 一元多项式的存储 1、一元多项式的顺序存储表示
2、一元多项式的链式存储表示
在链式存储中,对一元多项式只存非零项,则该多项式中每一项
由两部分组成(指数项和系数项),用单链表存储表示的结点结构如下图:
系数coef 结点结构定义如下:
typedef struct Polynode {
int coef; int exp;
struct Polynode *next; }Polynode,* Polylist;
指数exp 指针next
建立多项式链表:
算法描述:通过键盘输入一组多项式的系数和指数,用尾插法建立一元多项式链表。以输入系数0为结束标志,并约定建立多项式链表时,总是按指数由小到大的顺序排列。
算法:
typedef struct Polynode
{
int coef; int exp;
Polynode *next; }Polynode,*Polylist; Polylist PolyCreate() {
Polynode *head,*rear,*s; int c,e;
/*申请头结点*/
head=(Polynode *)malloc(sizeof(Polynode)); rear=head; /*rear始终指向最后一个结点*/ scanf(\,&c,&e); while(c!=0) { /*申请一个新的结点*/ s=(Polynode *)malloc(sizeof(Polynode)); s->coef=c; s->exp=e; rear->next=s; /*将链表连接起来*/ rear=s; /*链表的结尾后移一位*/
}
scanf(\,&c,&e); }
rear->next=NULL;/*结束链表*/ return head;/*返回链表的头结点*/
3、两个多项式相加
运算规则:?指数相同项的对应系数相加,若不为0,则构成“和
多项式”中的一项;
?指数不相同的项均按升幂顺序复制到“和多项式” 中。
算法思想:设p、q分别指向单链表polya和polyb的当前项,比较p、q结点的指数项,由此得到以下运算规则:
① 若p??exp?q??exp,则结点p所指的一项应该是“和多项式”中的一项,令指针p后移。
② 若p??exp?q??exp,则将两个结点的指数相加,当和不为0时,修改结点p的系数域,释放q结点;当和为0时,应该从polya中删去p结点,同时释放p和q结点。
③ 当p??exp?q??exp,则结点q所指的一项应该是“和多项式”中的一项,将结点q插入在p之前,同时令指针q后移。
算法:
typedef struct Polynode {
int coef; int exp;
Polynode *next; }Polynode,*Polylist;
void PolyAdd(Polylist polya,Polylist polyb) {
/*p指向polya的当前比较点,q指向polyb的当 前比较点tail指向和多项式的末尾点*/ Polynode *p,*q,*tail,*temp; int sum;