ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:33.13KB ,
资源ID:4301681      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4301681.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构作业C语言版习题.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构作业C语言版习题.docx

1、数据结构作业C语言版习题数据结构作业(C语言版)习题1.4,试仿照三元组的抽象数据类型分别写出抽象数据类型复数和有理数的定义(有理数是其分子、分母均为自然数且分母不为零的分数)。复数:ADT TripletD=r,i|r,i为实数 R= InitComplex(&C,re,im) ADT Complex有理数:ADT TripletD=c1,c2,c3 | c1,c2,c3Z,c30;R=;C3=c1/c2;ADT Triplet1.9 假设n为2的乘幂,并且n2,试求下列算法的时间复杂度及变量count的值(以n的函数形式表示)。int Time (int n)count=0;x=2;whi

2、le(xn/2)x*=2;count+;return(count)/Time 解:count=1.16 试写一算法,自大至小依次输出顺序读入的三个整数X,Y和Z的值。Void bubble-sort(int aX,Y,Z,int i)for (i=n-1,change=TRUE; i&change; -i)change=FALSE;for(j=0;jaj+1)aj+1ajchange=TRUE;/bubble-sort解:int max3(int x,int y,int z) if(xy) if(xz) return x; else return z; else if(yz) return y

3、; else return z;2.1描述以下三个概念的区别:头指针,头结点,首元结点(第一个元素结点)。头结点:在单链表的第一个结点之前附设一个结点,即称之为头结点头指针:链表中第一个结点的存储位置即称之为头指针首元结点:首元结点是指链表中存储线性表中第一个数据元素a1的结点(1) 在顺序表中插入或删除一个元素,需要平均移动表中一半元素,具体移动的元素个数与表长和该元素在表中的位置有关。(2) 顺序表中逻辑上相邻的元素的物理位置必定相邻。单链表中逻辑上相邻的元素的物理位置不一定相邻。(3) 在单链表中,除了首元结点外,任一结点的存储位置由其直接前驱结点的链域的性指示。(40在单链表中设置头结

4、点的作用是插入或删除首元素不必进行特殊处理。2.4对以下单链表分别执行下列各程序段,并画出结果示意图。2573864(1)Q=P-next;(2)L=P-next;(3)R-data=P-data;(4)R-data=P-next-data;(5)P-next-next-next-data=P-data;(6)T=P;While(T!=NULL)T-data=T-data*2;T=t-next;(7)T=PWhile(T-next!=NULL)T-data=T-data*2;T=T-next; 2.5画出执行下列各行语句后各指针及链表的示意图。L=(LinkList)malloc(sizeof

5、(LNode);P=LFor(i=1;inext=(LinkList)malloc(sizeof(LNode);P=P-next;p-data=i*2-1;P-next=NULL;for(i=4;i=1;i-;)Ins-LinkList(L,i+1,i*2);for(i=1;inext=S;(2)P-next=P-next-next;(3)P-next=S-next;(4)S-next=P-next;(5)S-next=L;(6)S-next=NULL;(7)Q=P(8)while(P-next!=Q)P=P-next;(9)while(P-next!=NULL)P=P-next;(10)P=

6、Q(11)P=L;(12)L=S;(13)L=P;a.(11)(3)(14)b.(10)(12)(8)(11)(3)(14)c.(10)(12)(7)(3)(14)d.(12)(11)(3)(14)e(9)(11)(3)(14)a.(7)(12)(6)(3)b.(8)(13)(5)(4)c.(15)(1)(11)(18)d.(16)(2)(10)(18)e.(9)(14)(17)Status DeleteK(SqList &a,int i,int k) int j; if(ia.length-1|ka.length-i) return INFEASIBLE; for(j=0;jdata!=x)

7、 p=p-next; i+; if(!p) return 0; else return i;2.14.解:int ListLength_L(LinkList &L) int i=0; LinkList p=L; if(p) p=p-next; while(p) p=p-next; i+; return i;3.1.解:(1)123 231 321 213 132(2) 可以得到135426的出站序列,但不能得到435612的出站序列。因为4356出站说明12已经在栈中,1不可能先于2出栈。3.3解:stack3.4.解:(1) 栈中的数据元素逆置 (2) 如果栈中存在元素e,将其从栈中清除3.

8、 12.解:char3. 13解:队列逆置Status Insert_SqList(SqList &va,int x)/把x插入递增有序表va中if(va.length+1va.listsize) return ERROR;va.length+;for(i=va.length-1;va.elemix&i=0;i-)va.elemi+1=va.elemi;va.elemi+1=x;return OK;/Insert_SqList 2.13 LNode* Locate(LinkList L,int x)/链表上的元素查找,返回指针for(p=L-next;p&p-data!=x;p=p-next)

9、;return p;/Locate 2.14 int Length(LinkList L)/求链表的长度for(k=0,p=L;p-next;p=p-next,k+);return k;/Length2.15 void ListConcat(LinkList ha,LinkList hb,LinkList &hc)/把链表hb接在ha后面形成链表hchc=ha;p=ha;while(p-next) p=p-next;p-next=hb-next;free(hb);/ListConcat 2.22 void LinkList_reverse(Linklist &L)/利用头插法实现链表的就地逆置

10、;为简化算法,假设表长大于2p=L-next;q=p-next;s=q-next;p-next=NULL;while(s-next)q-next=p;p=q;q=s;s=s-next; /把L的元素逐个插入新表表头q-next=p;s-next=q;L-next=s;/LinkList_reverse分析:本算法的思想是,利用头插法,逐个地把L的当前元素q插入新的链表头部,p为新表的首元结点.补充题:(是题2.14的扩充)int number(LinkedNode head) /计算带头结点的单循环链表的结点个数 p=head; i=0; while(p-next != head) i+; p

11、=p-next; return i; 3.16 void Train_arrange(char *train)/这里用字符串train表示火车,H表示硬席,S表示软席 p=train;q=train; InitStack(s); while(*p) if(*p=H) push(s,*p); /把H存入栈中 else *(q+)=*p; /把S调到前部 p+; while(!StackEmpty(s) pop(s,c); *(q+)=c; /把H接在后部 /Train_arrange 3.17 int IsReverse()/判断输入的字符串中&前和&后部分是否为逆串,是则返回1,否则返回0 I

12、nitStack(s); while(e=getchar()!=&) push(s,e); while(e=getchar()!=) if(StackEmpty(s) return 0; pop(s,c); if(e!=c) return 0; if(!StackEmpty(s) return 0; return 1; /IsReverse 3.18 Status Bracket_Test(char *str)/判别表达式中小括号是否匹配 count=0; for(p=str;*p;p+) if(*p=() count+; else if(*p=) count-; if (count=0) s

13、=0; else if(m0&n=0) s=n+g(m-1,2*n); else return ERROR; return OK; /g 3.25 Status F_recursive(int n,int &s)/递归算法 if(nlchild,B2-lchild)&Bitree_Sim(B1-rchild,B2-rchild)return 1;else return 0;/Bitree_Sim 6.41 int c,k; /这里把k和计数器c作为全局变量处理 void Get_PreSeq(Bitree T)/求先序序列为k的结点的值 if(T) c+; /每访问一个子树的根都会使前序序号计

14、数器加1 if(c=k) printf(Value is %dn,T-data); exit (1); else Get_PreSeq(T-lchild); /在左子树中查找 Get_PreSeq(T-rchild); /在右子树中查找 /if /Get_PreSeq 6.42 int LeafCount_BiTree(Bitree T)/求二叉树中叶子结点的数目if(!T) return 0; /空树没有叶子else if(!T-lchild&!T-rchild) return 1; /叶子结点else return Leaf_Count(T-lchild)+Leaf_Count(T-rch

15、ild);/左子树的叶子数加上右子树的叶子数/LeafCount_BiTree 6.43 void Bitree_Revolute(Bitree T)/交换所有结点的左右子树T-lchildT-rchild; /交换左右子树if(T-lchild) Bitree_Revolute(T-lchild);if(T-rchild) Bitree_Revolute(T-rchild); /左右子树再分别交换各自的左右子树/Bitree_Revolute 6.44 int Get_Sub_Depth(Bitree T,int x)/求二叉树中以值为x的结点为根的子树深度 if(T-data=x) pri

16、ntf(%dn,Get_Depth(T); /找到了值为x的结点,求其深度 exit 1; else if(T-lchild) Get_Sub_Depth(T-lchild,x); if(T-rchild) Get_Sub_Depth(T-rchild,x); /在左右子树中继续寻找 /Get_Sub_Depth int Get_Depth(Bitree T)/求子树深度的递归算法 if(!T) return 0; else m=Get_Depth(T-lchild); n=Get_Depth(T-rchild); return (mn?m:n)+1; /Get_Depth 6.45 void

17、 Del_Sub_x(Bitree T,int x)/删除所有以元素x为根的子树 if(T-data=x) Del_Sub(T); /删除该子树 else if(T-lchild) Del_Sub_x(T-lchild,x); if(T-rchild) Del_Sub_x(T-rchild,x); /在左右子树中继续查找 /else /Del_Sub_x void Del_Sub(Bitree T)/删除子树T if(T-lchild) Del_Sub(T-lchild); if(T-rchild) Del_Sub(T-rchild); free(T); /Del_Sub 6.47 void

18、LayerOrder(Bitree T)/层序遍历二叉树 InitQueue(Q); /建立工作队列 EnQueue(Q,T); while(!QueueEmpty(Q) DeQueue(Q,p); visit(p); if(p-lchild) EnQueue(Q,p-lchild); if(p-rchild) EnQueue(Q,p-rchild); /LayerOrder 9.26 int Search_Bin_Recursive(SSTable ST,int key,int low,int high)/折半查找的递归算法if(lowhigh) return 0; /查找不到时返回0mid

19、=(low+high)/2;if(ST.elemmid.key=key) return mid;else if(ST.elemmid.keykey)return Search_Bin_Recursive(ST,key,low,mid-1);else return Search_Bin_Recursive(ST,key,mid+1,high);/Search_Bin_Recursive10.23 void Insert_Sort1(SqList &L)/监视哨设在高下标端的插入排序算法 k=L.length; for(i=k-1;i;-i) /从后向前逐个插入排序 if(L.ri.keyL.ri

20、+1.key) L.rk+1.key=L.ri.key; /监视哨 for(j=i+1;L.rj.keyL.ri.key;+j) L.rj-1.key=L.rj.key; /前移 L.rj-1.key=L.rk+1.key; /插入 /Insert_Sort1 10.27 void Bubble_Sort2(int a ,int n)/相邻两趟是反方向起泡的冒泡排序算法 low=0;high=n-1; /冒泡的上下界 change=1; while(lowhigh&change) change=0; for(i=low;iai+1) aiai+1; change=1; high-; /修改上界 for(i=high;ilow;i-) /从下向上起泡 if(aiai-1) aiai-1; change=1; low+; /修改下界 /while /Bubble_Sort2 10.29 void OE_Sort(int a ,int n)/奇偶交换排序的算法 change=1; while(change) change=0; for(i=1;iai+1) aiai+1; change=1; for(i=0;iai+1) aiai+1; change=1; /while /OE_Sort 分析:本算法的结束条件是连续两趟比较无交换发生

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

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