数据结构(c语言描述)马秋菊源代码和习题参考答案.pdf
《数据结构(c语言描述)马秋菊源代码和习题参考答案.pdf》由会员分享,可在线阅读,更多相关《数据结构(c语言描述)马秋菊源代码和习题参考答案.pdf(27页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、习题配套 第一章 2C、A、B、B、A、A、D 3 D=A,B,C,E,F,G,H,I,J;R=,4顺序、链式、索引、哈希。*5解:100n22nn至少要多大 6.(n)、(n)、(n)、(n)、(5)当 nm,(n),当 mn,(m)7n!2100lgnn1/2n3/2(3/2)n2nnlgnnn 第二章 1、2AAD 4顺序表 void Delete_SeqListx(SeqList*L,ElemType x)/*删除表中值为x元素*/inti,j;for(i=1;ilength;i+)if(L-elemi=x)for(j=i;jlength-1;j+)L-elemj=L-elemj+1;
2、L-length-;/*向上挪动*/O(n2)A B C E F G H I 题 1-3 图 J 链表 void del_link(LinkList H,int x)/*删除数据域为 x 的结点*/LNode*p,*q;p=H;q=H-next;while(q!=NULL)if(q-data=x)p-next=q-next;free(q);q=p-next;elsep=q;q=q-next;O(n)5 int Delete_SeqListx(SeqList*L,int i,int k)/*删除表中删除自第i个结点开始的k个结点*/intj;if(i1|kL-length)/*检查空表及删除位置
3、的合法性*/printf(不存在第i个元素);return ERROR;for(j=i;jlength-k;j+)L-elemj=L-elemj+k;/*向上挪动*/L-length-=k;Return OK;/*删除成功*/O(n)6 void Delete_SeqListx(SeqList*L,ElemType x)/*将表中值为x元素换成y*/inti,j;for(i=1;ilength;i+)if(L-elem=x)L-elemi=y;/*/O(n)7写一算法在循环单链表上实现线性表的 CList_length(L)运算。int link_length(LinkList H)LNode
4、*p;int i=0;p=H;while(p-next!=H)i+;p=p-next;return i;O(n)8 在用头指针表示的单循环链表中,查找开始结点 a1的时间是 O(1),然而要查找终端结点那么需从头指针开始遍历整个链表,其时间是 O(n)。但在很多实际问题中,表的操作常常是在表的首、尾位置上进展,假设改用尾指针 rear 来表示单循环链表,那么查找开始结点 a1和终端结点 an都很方便,它们的存储位置分别是 rear-next-next 和 rear,显然,查找时间都是 O(1)。9.int Insert_LinkListab(LinkList H,ElemType a,Elem
5、Type b)/*在单链表中值为a的结点前插入一个值为b的结点*/LNode*q=H,*s;*p=H-next;while(p!=NULL&p-data!=a)/*q-next&q-next-data!=a*/q=p;p=p-next;/*查找a结点*/s=(LinkList)malloc(sizeof(LNode);/*申请、填装结点*/s-data=b;s-next=q-next;/*新结点插入在第i-1个结点的后面*/q-next=s;return OK;/*Insert_LinkListab*/10顺序表 void Reverse_Sq(SqList*L)/*顺序表的就地逆置*/for
6、(i=1,j=L.len;inext;q=p-next;s=q-next;p-next=NULL;while(s-next)q-next=p;p=q;q=s;s=s-next;/*把 H 的元素逐个插入新表表头*/q-next=p;s-next=q;H-next=s;/*Reverse_L*/分析:本算法的思想是,逐个地把 L 的当前元素 q 插入新的链表头部,p 为新表表头。11 void merge1(LinkList&A,LinkList&B,LinkList&C)/*把链表 A 和 B 合并为 C,A 和 B 的元素间隔排列,且使用原存储空间*/p=A-next;q=B-next;C=
7、A;while(p&q)s=p-next;p-next=q;/*将 B 的元素插入*/if(s)t=q-next;q-next=s;/*如 A 非空,将 A 的元素插入*/p=s;q=t;/*while*/*merge1*/12 Status Delete_Pre(CiLNode s)/*删除单循环链表中结点 p 的直接前驱*/q=p;while(q-next-next!=p)q=q-next;/*找到 p 的前驱的前驱*/s=q-next;q-next=p;free(s);return OK;/*Delete_Pre*/13 Status Insert_SqList(SeqList&L,in
8、t x)if(L-length+1m-1)return ERROR;L-length+;i=L-length;while(L-elemix&i0;)L-elemi+1=L-elemi;i-;L-elemi+1=x;return OK;/*Insert_SqList 14 intInsert_Linkx(LinkList H,ElemType x)/*在值递增单链表中插入一个值为x的结点,仍递增*/LNode*q=H,*s;*p=H-next;while(p!=NULL&p-datanext&q-next-datanext;/*查找a结点*/s=(LinkList)malloc(sizeof(L
9、Node);/*申请、填装结点*/s-data=x;s-next=q-next;/*新结点插入*/q-next=s;return OK;/*Insert_Linkx*/15 源程序代码:在测试通过#include#include structnode intnumber;/*人的序号*/intcipher;/*密码*/structnode*next;/*指向下一个节点的指针*/;structnode*CreatList(intnum)/*建立循环链表*/inti;structnode*ptr1,*head;if(ptr1=(structnode*)malloc(sizeof(structnod
10、e)=NULL)perror(malloc);returnptr1;head=ptr1;ptr1-next=head;for(i=1;inext=(structnode*)malloc(sizeof(structnode)=NULL)perror(malloc);ptr1-next=head;returnhead;ptr1=ptr1-next;ptr1-next=head;returnhead;main()inti,n=30,m;/*人数 n 为 30 个*/structnode*head,*ptr;randomize();head=CreatList(n);for(i=1;inumber=i
11、;head-cipher=rand();head=head-next;m=rand();/*m 取随机数*/i=0;/*因为我没方法删除 head 指向的节点,只会删除 head 的下一节点,所以只能从 0 数起。*/while(head-next!=head)/*当剩下最后一个人时,退出循环*/if(i=m)ptr=head-next;/*ptr 记录数到 m 的那个人的位置*/printf(number:%dn,ptr-number);printf(cipher:%dn,ptr-cipher);m=ptr-cipher;/*让 m 等于数到 m 的人的密码*/head-next=ptr-n
12、ext;/*让 ptr 从链表中脱节,将前后两个节点连接起来*/head=hea/d-next;/*head 移向后一个节点*/free(ptr);/*释放 ptr 指向的内存*/i=0;/*将 i 重新置为 0,从 0 再开始数*/else head=head-next;i+;printf(number:%dn,head-number);printf(cipher:%dn,head-cipher);free(head);/*让最后一个人也出列*/16 void SqList_Intersect(SqList A,SqList B,SqList&C)/*求元素递增排列的线性表 A 和 B 的元
13、素的交集并存入 C 中*/i=1;j=1;k=0;while(A.elemi&B.elemj)if(A.elemiB.elemj)j+;if(A.elemi=B.elemj)C.elem+k=A.elemi;/当发现了一个在 A,B 中都存在的元素,/就添加到 C 中 i+;j+;/*while*/*SqList_Intersect*/17 Status DuLNode_Pre(DuLinkList*H)/*完成双向循环链表结点的 pre 域*/p=H;while(q-next!=H)p-next-pre=p;p=p-next;return OK;/*DuLNode_Pre*/第三章 栈与队列
14、 1假定有编号A、B、C的3辆列车顺序开进一个栈式构造的站台,请写出每一种开出站台的列车编号顺序(注:每一列车开出栈开出站台后,不允许再进栈)。2指出下述程序段的功能是什么?void Demo1(SeqStack*S)int i;arra16;n=16;initStack(&S);for(i=0,inext=NULL;s=(LinkStack*)mallocsizeofLinkStack;s-top=p;判栈空 int Empty_LSLinkStack*s return s-top-next=NULL;入栈 LinkStack *Push_LSLinkStack*s,ElemType x S
15、tackNode *p=(StackNode*)mallocsizeofStackNode;p-data=x;p-next=s-top-next;/*将元素 x 插入链栈顶*/s-top-next=p;return s;出栈 int Pop_LS(LinkStack*s,ElemType *y)StackNode *p;if Empty_LS s printf(Stack Underflow.);/*下溢*/return OVERFLOW;else *y=s-top-next-data;=s-top-next;s-top-next=p-next;free(p);return OK;取栈顶元素
16、int GetTop(LinkStack*s,ElemType*y)if(Empty_LS(s)printf(Stack underflow.);/*下溢*/return OVERFLOW;else*y=s-top-next-data;return OK;4 Status AllBrackets_Test(char str)/*判别表达式中三种括号是否匹配*/InitStack(s);for(p=str;*p;p+)if(*p=(|*p=|*p=push(s,*p);else if(*p=)|*p=|*p=)if(StackEmpty(s)return ERROR;pop(s,c);if(*p
17、=)&c!=()return ERROR;if(*p=)&c!=return ERROR;if(*p=)&c!=return ERROR;/*必须与当前栈顶括号匹配*/*for*/if(!StackEmpty(s)return ERROR;return OK;/*AllBrackets_Test*/或 int PairBracket(char*S)/*检查表达式中括号是否配对*/int i;SeqStack T;/*定义一个栈*/InitStack(&T);for(i=0;istrlen(S);i+)if(Si=()Push(&T,Si);/*遇(时进栈*/if(Si=)Pop(&T);/*遇
18、)时出栈*/return!EmptyStack(&T);/*由栈空否返回正确配对与否*/5写出计算表达式5+3*3/6-7时操作数和算符栈的变化情况。表达式5+3*4/6-7的求值过程 步骤 运算符栈 OPTR 对象栈 OPND 读字符 主要操作 1#5 5+3*3/6-7#5 入栈 OPND 2#+5+3*3/6-7#+入栈 OPTR 3#+5,3 3*3/6-7#3 入栈 OPND 4#+*5,3*3/6-7#*入栈 OPTR 5#+*(5,3 3/6-7#(入栈 OPTR 6#+*(5,3,3 4/6-7#3 入栈 OPND 7#+*(/5,3,3/6-7#/入栈 OPTR 8#+*(/
19、5,3,3,6 6-7#6 入栈 OPND 9#+*(5,3,-7#3,6 出栈 OPND,/出栈 OPTR 求 4/6OPND 10#+*(-5,3,-7#-入栈 OPTR 11#+*(-5,3,7 7#7 入栈 OPND 12#+*(5,3,#0.5,7 出栈 OPND,-出栈 OPTR OPND 13#+*5,3,#(出栈 14#+5,#3,OPND,*出栈 OPTR OPND 15#5,OPND,*出栈 OPTROPND 16#RERTURN()6对于给定的十进制正整数,输出对应的八进制正整数。(1)写出递归算法。(2)写出非递归算法。(1)递归算法。void conversion1(
20、int N,int R)if(N0)push(S,n);n=n-1;while(!EmptyStack(S)Pop(S,i);f=f*i;return(f);8.void huiwen()Init_LS(s);printf(Please input a string:n);for(i=0;(i20)&(ai=getchar()!=n);+i);/*输入字符串*/for(j=0;ji/2;+j)/*字符串的前一半入栈*/Push_LS(s,aj);for(j=i-i/2;jrear-sq-front sq-rear=sq-front count=m-(sq-front-sq-rear)sq-re
21、arfront 11循环队列的优点是什么?如何判别它的空和满?优点:防止假溢出;判别循环队列的空:return(sq-rear=sq-front);判别循环队列的满:return(sq-rear+1)%MAXSIZE=sq-front)12假设以带头结点的循环链表表示队列,并且只设一个指针指向队尾元素位置(注意不设头指针),试编写相应的置空队、判队空、入队和出队等算法。typedef struct qnode ElemType data;struct qnode*next;QCNode;/*链式循环链队列结点的类型*/typedef struct QCNode *rear;LCQueue;/*
22、只设一个指向队尾元素的指针*/1置空队算法:void Init_LCQueue(LCQueue *Lcq)p=(QCnode*)malloc(sizeof(QCNode);/*申请头结点*/p-next=p;Lcq-rear=p;2判队空算法:int Empty_LCQueue(LCQueue*Lcq)return Lcq-rear-next=Lcq-rear;/*或 Lq-rear=NULL;*/3入队算法:void In_LCQueue(LCQueue*Lcq,ElemType x)/*进队操作*/LCQueue*p;p=(QCNode*)malloc(sizeof(QCNode);/*申
23、请新结点*/p-data=x;p-next=Lcq-rear-next;Lcq-rear-next=p;Lcq-rear=p;/*In_LCQueue*/4出队算法:int Out_LCQueue(LCQueue*Lq,ElemType*y)LCQueue p;if(Empty_LCQueue(Lq)printf(队空);return OVERFLOW;/*队空,出队失败*/else p=Lcq-rear-next-next;/*队头第一个数据元素结点*/Lcq-rear-next-next=p-next;*y=p-data;/*队头元素放 y 中*/free(p);return OK;13假
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 语言 描述 秋菊 源代码 习题 参考答案
限制150内