Anyview第四章15年数据结构.docx

上传人:b****6 文档编号:7084846 上传时间:2023-01-17 格式:DOCX 页数:17 大小:18.21KB
下载 相关 举报
Anyview第四章15年数据结构.docx_第1页
第1页 / 共17页
Anyview第四章15年数据结构.docx_第2页
第2页 / 共17页
Anyview第四章15年数据结构.docx_第3页
第3页 / 共17页
Anyview第四章15年数据结构.docx_第4页
第4页 / 共17页
Anyview第四章15年数据结构.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

Anyview第四章15年数据结构.docx

《Anyview第四章15年数据结构.docx》由会员分享,可在线阅读,更多相关《Anyview第四章15年数据结构.docx(17页珍藏版)》请在冰豆网上搜索。

Anyview第四章15年数据结构.docx

Anyview第四章15年数据结构

DS03-PE22

/**********

【题目】试写一算法,借助辅助栈,复制顺序栈S1得到S2。

顺序栈的类型定义为:

typedefstruct{

ElemType*elem;//存储空间的基址

inttop;//栈顶元素的下一个位置,简称栈顶位标

intsize;//当前分配的存储容量

intincrement;//扩容时,增加的存储容量

}SqStack;//顺序栈

可调用顺序栈接口中下列函数:

StatusInitStack_Sq(SqStack&S,intsize,intinc);//初始化顺序栈S

StatusDestroyStack_Sq(SqStack&S);//销毁顺序栈S

StatusStackEmpty_Sq(SqStackS);//栈S判空,若空则返回TRUE,否则FALSE

StatusPush_Sq(SqStack&S,ElemTypee);//将元素e压入栈S

StatusPop_Sq(SqStack&S,ElemType&e);//栈S的栈顶元素出栈到e

***********/

StatusCopyStack_Sq(SqStackS1,SqStack&S2)

/*借助辅助栈,复制顺序栈S1得到S2。

*/

/*若复制成功,则返回TRUE;否则FALSE。

*/

{

//if(TRUE==StackEmpty_Sq(S1))returnFALSE;//当S1是空的时候

SqStackS3;

if(ERROR==InitStack_Sq(S2,S1.size,S1.increment))returnFALSE;

if(ERROR==InitStack_Sq(S3,S1.size,S1.increment))returnFALSE;//对S1、S2的初始化

if(!

StackEmpty_Sq(S2))returnFALSE;

if(!

StackEmpty_Sq(S3))returnFALSE;//对S1、S2的判空

ElemTypee;

while(S1.top)

{

Pop_Sq(S1,e);

Push_Sq(S3,e);

}

while(S3.top)

{

Pop_Sq(S3,e);

Push_Sq(S2,e);

}

//DestroyStack_Sq(S1);

//DestroyStack_Sq(S3);

returnTRUE;

}

DS03-PE37

/**********

【题目】假设将循环队列定义为:

以域变量rear

和length分别指示循环队列中队尾元素的位置和内

含元素的个数。

试给出此循环队列的队满条件,并

写出相应的入队列和出队列的算法(在出队列的算

法中要返回队头元素)。

本题的循环队列CLenQueue的类型定义如下:

typedefstruct{

ElemTypeelem[MAXQSIZE];

intlength;

intrear;

}CLenQueue;

**********/

StatusEnCQueue(CLenQueue&Q,ElemTypex)

/*将元素x加入队列Q,并返回OK;*/

/*若失败,则返回ERROR。

*/

{

if(MAXQSIZE<=Q.length)returnERROR;//队满,无法插入

Q.rear=(Q.rear+1)%MAXQSIZE;

Q.elem[Q.rear]=x;

Q.length+=1;

returnOK;

}

StatusDeCQueue(CLenQueue&Q,ElemType&x)

/*将队列Q的队头元素退队到x,并返回OK;*/

/*若失败,则返回ERROR。

*/

{

if(0==Q.length)returnERROR;

x=Q.elem[((Q.rear+MAXQSIZE-Q.length+1)%MAXQSIZE)];

Q.length-=1;

returnOK;

}

DS03-PE44

/**********

【题目】已知k阶斐波那契序列的定义为:

f0=0,f1=0,…,fk-2=0,fk-1=1;

fn=fn-1+fn-2+…+fn-k,n=k,k+1,…

试利用循环队列编写求k阶斐波那契序列中第

项fn+1n的算法。

本题的循环队列的类型定义如下:

typedefstruct{

ElemType*base;//存储空间的基址

intfront;//队头位标

intrear;//队尾位标,指示队尾元素的下一位置

intmaxSize;//最大长度

}SqQueue;

**********/

longAddSum(intn,ElemType*q)

{

longsum=0;

inti;

for(i=0;i

sum+=q[i];

returnsum;

}

longFib(intk,intn)

/*求k阶斐波那契序列的第n+1项fn*/

{

if(k<2||n<-1)returnERROR;

if(n

if(n+1==k)return1;

SqQueueQ;

inta,i;

Q.base=(ElemType*)malloc(k*sizeof(ElemType));

if(NULL==Q.base)returnERROR;

Q.maxSize=k;

for(i=0;i

{

Q.base[i]=0;

}

//初始化序列

Q.base[k-1]=1;

Q.front=0;

Q.rear=k-1;

a=k;

while(a<=n)

{

Q.rear=(Q.rear+1)%k;

Q.base[Q.rear]=AddSum(k,Q.base);

a++;

}

returnQ.base[Q.rear];

}

DS03-PE81

/**********

【题目】试对一元稀疏多项式Pn(x)采用存储量同多项式

项数m成正比的顺序存储结构,编写求Pn(x0)的算法(x0

为给定值)。

一元稀疏多项式的顺序存储结构:

typedefstruct{

intcoef;//系数

intexp;//指数

}Term;

typedefstruct{

Term*elem;//存储空间基址

intlength;//长度(项数)

}Poly;

**********/

floatFunction(Term*p,floatx)

{

inta;

floatsum=1;

if(0==p->exp)returnsum;

for(a=0;aexp;a++)

sum*=x;

returnsum;

}

floatEvaluate(PolyP,floatx)

/*P.elem[i].coef存放ai,*/

/*P.elem[i].exp存放ei(i=1,2,...,m)*/

/*本算法计算并返回多项式的值。

不判别溢出。

*/

/*入口时要求0≤e1

{

floatsum=0;

Term*p;

p=P.elem;

if(0==P.length)returnsum;

while(P.length--)

{

sum+=p->coef*Function(p,x);

p++;

}

returnsum;

}

DS03-PE85

/**********

【题目】假设有两个集合A和B分别用两个线性表LA和LB

表示(即:

线性表中的数据元素即为集合中的成员),

试写一算法,求并集A=A∪B。

1、在每个元素遍历的时候,排除相同的元素

2、插入

顺序表类型定义如下

typedefstruct{

ElemType*elem;//存储空间的基址

intlength;//当前长度

intsize;//存储容量

intincrement;//空间不够增加空间大小

}SqList;//顺序表

可调用顺序表的以下接口函数:

StatusInitList_Sq(SqList&L,intsize,intinc);//初始化顺序表L

intListLength_Sq(SqListL);//返回顺序表L中元素个数

StatusGetElem_Sq(SqListL,inti,ElemType&e);

//用e返回顺序表L中第i个元素的值

intSearch_Sq(SqListL,ElemTypee);

//在顺序表L顺序查找元素e,成功时返回该元素在表中第一次出现的位置,否则返回-1

StatusAppend_Sq(SqList&L,ElemTypee);//在顺序表L表尾添加元素e

**********/

voidAppend_Sq1(SqListL,ElemTypee)

{

L.elem[L.length]=e;

}

voidUnion(SqList&La,SqListLb)

{

ElemTypee;

inta=ListLength_Sq(Lb);

intb=ListLength_Sq(La);

ElemType*p;

p=(ElemType*)realloc(La.elem,(a+b)*sizeof(ElemType));

La.elem=p;

La.length=b;

La.size=a+b;

inti=1;

while(i<=a)

{

GetElem_Sq(Lb,i,e);

if(-1==Search_Sq(La,e))

{

Append_Sq1(La,e);

La.length++;

}

i++;

}

}

DS04-PE38

/**********

【题目】假设以带头结点的循环链表表示队列,并且

只设一个指针指向队尾元素结点(注意不设头指针),

试编写相应的队列初始化、入队列和出队列的算法。

带头结点循环链队列CLQueue的类型定义为:

typedefstructLQNode{

ElemTypedata;

structLQNode*next;

}LQNode,*CLQueue;

**********/

StatusInitCLQueue(CLQueue&rear)//初始化空队列

{

rear=(CLQueue)malloc(sizeof(LQNode));

if(NULL==rear)returnERROR;

rear->next=rear;

returnOK;

}

StatusEnCLQueue(CLQueue&rear,ElemTypex)//入队

{

LQNode*p;

p=(LQNode*)malloc(sizeof(LQNode));

if(NULL==p)returnERROR;

p->data=x;

p->next=rear->next;

rear->next=p;

rear=p;

returnOK;

}

StatusDeCLQueue(CLQueue&rear,ElemType&x)//出队

{

if(rear->next==rear)

returnERROR;

CLQueuep;

p=rear->next->next;

x=p->data;

if(p==rear)

{

rear=rear->next;

rear->next=p;

}

else

{

rear->next->next=p->next;

}

returnOK;

}

DS04-PE62

/**********

【题目】试写一算法,在带头结点单链表L插入第i元素e。

带头结点单链表的类型定义为:

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

**********/

intLengthLinkList(LinkListL)

{

LinkListp=L;

intlength=0;

while(p->next)

{

length++;

p=p->next;

}

returnlength;

}

StatusInsert_L(LinkListL,inti,ElemTypee)

/*在带头结点单链表L插入第i元素e,并返回OK。

*/

/*若参数不合理,则返回ERROR。

*/

{

if(NULL==L)returnERROR;

intlength=LengthLinkList(L);

if(i>length+1||i==0)returnERROR;

LinkListp=L;

LinkListq;

q=(LNode*)malloc(sizeof(LNode));

if(NULL==q)returnERROR;

inta=0;

q->data=e;

if(i==length+1)

{

while(a++

p=p->next;

p->next=q;

}

else

{

while(a++

p=p->next;

q->next=p->next;

p->next=q;

}

returnOK;

}

DS04-PE64

/**********

【题目】试写一算法,在带头结点单链表删除第i元素到e。

带头结点单链表的类型定义为:

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

**********/

intLengthLinkList(LinkListL)

{

LinkListp=L;

intlength=0;

while(p->next)

{

length++;

p=p->next;

}

returnlength;

}

StatusDelete_L(LinkListL,inti,ElemType&e)

/*在带头结点单链表L删除第i元素到e,并返回OK。

*/

/*若参数不合理,则返回ERROR。

*/

{

intlength=LengthLinkList(L);

if(NULL==L||i==0||i>length)returnERROR;

LinkListp;

p=L;

if(i==length)

{

while(--i>0)

p=p->next;

e=p->next->data;

p->next=NULL;

}

else

{

while(--i>0)

p=p->next;

e=p->next->data;

p->next=p->next->next;

}

returnOK;

}

DSO4-PE66

/**********

【题目】试写一算法,在带头结点单链表的第i元素起的

所有元素从链表移除,并构成一个带头结点的新链表。

带头结点单链表的类型定义为:

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

**********/

intLengthLinkList(LinkListL)

{

LinkListp=L;

intlength=0;

while(p->next)

{

length++;

p=p->next;

}

returnlength;

}

StatusSplit_L(LinkListL,LinkList&Li,inti)

/*在带头结点单链表L的第i元素起的所有元素*/

/*移除,并构成带头结点链表Li,返回OK。

*/

/*若参数不合理,则Li为NULL,返回ERROR。

*/

{

if(NULL==L||i==0)returnERROR;

intlength=LengthLinkList(L);

if(i>length)

{

Li=NULL;

returnERROR;

}

Li=(LNode*)malloc(sizeof(LNode));

if(NULL==Li)

returnERROR;

LinkListp=L;

while(--i>0)

p=p->next;

Li->next=p->next;

p->next=NULL;

returnOK;

}

DS04-PE68

/**********

【题目】试写一算法,在带头结点单链表删除第i元素

起的所有元素。

带头结点单链表的类型定义为:

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

**********/

intLengthLinkList(LinkListL)

{

LinkListp=L;

intlength=0;

while(p->next)

{

length++;

p=p->next;

}

returnlength;

}

StatusCut_L(LinkListL,inti)

/*在带头结点单链表L删除第i元素起的所有元素,并返回OK。

*/

/*若参数不合理,则返回ERROR。

*/

{

if(NULL==L||i==0)returnERROR;

intlength=LengthLinkList(L);

if(i>length)

returnERROR;

LinkListp=L;

while(--i>0)

p=p->next;

p->next=NULL;

returnOK;

}

DS04-PE70

/**********

【题目】试写一算法,删除带头结点单链表中所有值

为x的元素,并释放被删结点空间。

单链表类型定义如下:

typedefstructLNode{

ElemTypedata;

structLNode*next;

}LNode,*LinkList;

**********/

StatusDeleteX_L(LinkListL,ElemTypex)

/*删除带头结点单链表L中所有值为x的元素,*/

/*并释放被删结点空间,返回实际删除的元素个数。

*/

{

if(NULL==L)returnERROR;

LinkListp;

p=L;

intcount=0;

if(NULL==L->next)returncount;

if(NULL==p->next->next)

{

if(x==p->next->data)

{

count++;

p->next=NULL;

}

returncount;

}

while(p->next->next)

{

if(x==p->next->data)

{

count++;

p->next=p->next->next;

}

else

p=p->next;

}

if(x==p->next->data)

{

count++;

p->next=NULL;

}

returncount;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1