数据结构知识点(4)

2018-11-19 20:54

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;


数据结构知识点(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:安全继续考试题目答案(自己整理,基本够用)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: