《数据结构(c语言版)习题集.docx》由会员分享,可在线阅读,更多相关《数据结构(c语言版)习题集.docx(110页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、第一章绪论1.16void print_descending(int x,int y,int z)按从大到小顺序输出三个数( 一 ,scanf(n%d,%d,%d;&x,&y,&z);if(xy; v-为袤示交换的双目运算符似下同if(yz) yz;if(xvy) xv-y; 冒泡排序 printf(M%d %d %dM,x,y,z); /pri nt_descendi ng1.17Status fib(int k,int m,int &f)求k阶斐波那契序列的第m项的值f (int tempd;if(k2llm0) return ERROR;if(mk-l) f=0;else if (m=k
2、-l II m=k) f=l;else(for(i=0;i=k-2;i+) tempi=0;tempk-1 =1 ;tempk=1;万初始化sum=l;j=0;for(i=k+l;iv=m;i+,j+) 求出序歹ij第k至第m个元素的值tempi=2*sum-temp|j;f=tempm;return OK;/fib分析:k阶斐波那契序列的第m项的值ffm=f(m-l+fm-2+fm-k=fm-l+fm-2+fm-k+fm-k-1 -fm-k-1 =2*fm-l-fm-k-l所以上述算法的时间复杂度仅为O(m).如果采用递归设计,将达到O(k八m).即使采用暂存中间结 果的方法,也将达到O(m
3、八2).1.18typedef struct char *sport;enum male,female gender;char schoolname; 校名为 A?B?C?D或Echar *result; int score; resulttype;typedef struct int malescore;int femalescore;int totalscore; scoretype;void summary(resulttype result)求各校的男女总分和团体总分,假设结果已经储存在result数 组中(scoretype scoreMAXSIZE;i=0;while(result
4、i.sport!=NULL)(switch(result i. schoolname)(case A:score 0 .totalscore+=resulti.score;if(resulti.gender=O) score 0 .malescore+=resulti.score;else score 0 .femalescore+=resulti.score;break;case B:score 0 .totalscore+=resulti.score;if(resulti.gender=O) score 0 .malescore+=resulti.score;else score 0 .f
5、emalescore+=resulti.score;break;i+;for(i=0;i5;i+)(printf(School %d:n”,i);printf(Total score of male:%dn,scorei.malescore);printf(nTotal score of female:%dn,scorei.femalescore);printf(Total score of all:%dnnn,scorei.totalscore);/summary1.19Status algoll9(int aARRSIZE)求 i!*2八i 序列的值且不超过 maxint last=l;f
6、or(i=l;i=ARRSIZE;i+)(ai-l=last*2*i;if(ai-ll/last)!=(2*i) reurn OVERFLOW;last=ai-l;return OK;/algoll9分析:当某一项的结果超过了 maxint时,它除以前面一项的商会发生异常.1.20void polyvalue()float temp;float *p=a;printf(Input number of terms:);scanfC%dn,&n);printf(Input value of x:);scanf(H%r,&x);printf(Input the %d coefficients fro
7、m aO to a%d:nn+l,n);p=a;xp=l ;sum=0; /xp用于存放x的i次方for(i=0;i=n;i+)(scanf(n%f&temp);sum+=xp*(temp);xp*=x;)printf(uVaIue is:%f*,sum);/polyvalue第二章线性表2.10Status DeleteK(SqList &a,int i,int k)删除线性表a中第i个元素起的k个元素 (if(illlka.length) return INFEASIBLE;for(count= 1 ;i+count-lva.listsize) return ERROR;va.length
8、+;for(i=va.length-l;va.elemix&i=0;i-)va.elemfi+l=va.elem(i;va.elemi+l=x;return OK;/Insert_SqList2.12int ListComp(SqList A,SqList B)比较字符表A和B,并用返回值表示结果,值为1,表示AB;值为-1,表示AB;值为0,表示A=B (for(i=l;i=A.length&iB.elemi? 1 :-l;if(A.length=B.length) return 0;return A.lengthB.length?l:-l; 当两个字符表可以互相比较的部分完全相同时,哪个较
9、长,哪个 融成关/ListComp2.13LNode* Locate(LinkList L,int x)链表上的元素查找,返回指针 (for(p=l-next;p&p-data!=x;p=p-next);return p;/Locate 2.14int Length(LinkList L)求链表的长度(for(k=0,p=L;p-next;p=p-next,k+);return k; /Length 2.15void ListConcat(LinkList ha,LinkList hb,LinkList &hc)把链表 hb 接在 ha 后面形成链表 he(hc=ha;p=ha;while(p
10、-next) p=p-next;p-next=hb;/ListConcat2.16见书后答案.2.17Status Insert(LinkList &L,int i,int b)在无头结点链表L的第i个元素之前插入元素b (p=L;q=(LinkList*)malloc(sizeof(LNode);q.data=b;if(i=l) q.next=p;L=q; 插入在链表头部1 else(while(il) p=p-next;q-next=p-next;p-next=q; 插入在第i个元素的位置/Insert2.18Status Delete(LinkList &L,int i)在无头结点链表L
11、中删除第i个元素 (if(i=l) L=L-next; 删除第一个兀素else(p=L;while(-il) p=p-next;p-next=p-next-next; 删除第 i 个元素/Delete2.19Status Delete_Between(Linklist &L,int mink,int maxk)删除元素递增排列的链表 L 中值大于 mink 且小于maxk的所有元素P=L; while(p-next-datanext; /p 是最后一个不大于 mink 的元素if(p-next) 如果还有比mink更大的元素(q=p-next;while(q-datanext; /q 是第一个
12、不小于 maxk 的元素p-next=q;/Delete_Between2.20Status Delete_Equal(Linklist &L)删除元素递增排列的链表L中所有值相同的元素 一p=L-next;q=p-next; /p,q 指向相邻两兀素while(p-next)(if(p-data !=q-data)(p=p-next;q=p-next; 当相邻两兀素不相等时,p,q都向后推一步else(while(q-data=p-data)(free(q);q=q-next;)p.next=q;p=q;q=p-next; 当相邻兀素相等时删除多余兀素/else/while/Delete_E
13、qual2.21void reverse(SqList &A)顺序表的就地逆置(for(i= 1 ,j=A.length;ij ;i+,j-)A.elemiA.elemj;/reverse2.22void LinkList_reverse(Linklist &L)链表的就地逆置;为简化算法,假设表长大于2(p=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; /LinkLi st_reverse分析:本算法的
14、思想是,逐个地把L的当前元素q插入新的链表头部,p为新表表头.2.23void merge l(LinkList &A,LinkList &B,LinkList &C)把链表 A 和 B 合并为 C,A 和 B 的元素间隔 排列,且使用原存储空间(p=A-next;q=B-next;C=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/merge 12.24void reverse_merge(LinkList &A,LinkList &B,LinkL
15、ist &C)把元素递增排列的链表 A 和 B 合并为C,且C中元素递减排列,使用原空间 .pa=A-next;pb=B-next;pre=NULL; /pa 和 pb 分别指向 A,B 的当前兀素while(pallpb)(if(pa-datadatall !pb)! 一pc=pa;q=pa-next;pa-next=pre;pa=q; 将 A 的兀素插入新表 1 ,else 一pc=pb;q=pb-next;pb-next=pre;pb=q; 将 B 的兀素插入新表pre=pc;C=A;A-next=pc; 构造新表头 /re verse_merge分析:本制去的思想是,按从小到大的顺序依
16、次把A和B的元素插入新表的头部pc处,最后处理A 或B的剩余元素.2.25void SqList_Intersect(SqList A,SqList B,SqList &C)求元素递增排列的线性表A和B的元素的交 集并存入F中j- *j- j k-0while(A.elemi&B.elemj)(if(A.elemiB.elemj) j+;if(A.elemi=B.elemj)C.elem+k=A.elemi; 当发现了一个在A,B中都存在的元素,i+;j+; 就添力口至IC中/while/SqList_Intersect2.26void LinkList_Intersect(LinkList
17、A,LinkList B,LinkList &C)在链表结构上重做上题(p=A-next;q=B-next;pc=(LNode*)malloc(sizeof(LNode);C=pc;while(p&q)(if(p-datadata) p=p-next;else if(p-dataq-data) q=q-next;else(s=(LNode*)malloc(sizeof(LNode);s-data=p-data;pc-next=s;pc=s;p=p-next;q=q-next;) J/while /Li nkList_Intersect2.27void SqList_Intersect_True
18、(SqList &A,SqList B)求元素递增排列的线性表A和B的元素的交集 并存回A市i=l;j=l;k=O;while(A.elemfi&B.elemjl)(if(A.elemiB.elemj) j+;else if(A.elemi !=A.elemk) A.elem+k=A.elemi; 当发现了一个在A,B中都存在的兀素i+;j+; 且C中没有,就添加到C中else i+;j+;/whilewhile(A.elemfk) A.elemk+=0;/SqList_Intersect_True2.28void LinkList_Intersect_True(LinkList &A,Lin
19、kList B)在链表结构上重做上题(p=A-next;q=B-next;pc=A;while(p&q)if(p-datadata) p=p-next;else if(p-dataq-data) q=q-next;else if(p-data !=pc-data) (pc=pc-next;pc-data=p-data;p=p-next;q=q-next;/while /LinkLi st_Intersect_T rue2.29void SqList_Intersect_Delete(SqList &A,SqList B,SqList C) 1. i=0;j=0;k=0;m=0; /i指示A中兀
20、素原来的位置,m为移动后的位置while(iA.length&jB.length& kC.length) .一 一if(B.elemjC.elemk) k+;else , same=B.elemj;找到了相同兀素 samewhile(B.elernfj=same) j+;while(C.elemk=same) k+; /j,k 后移到新的元素whiIe(iA.length&A.e!emisame)A.elemm+=A.elemi+;需保留的元素移动至损位置while(ivA.length&A.elemi=same) i+; 跳过相同的元素) /whilewhile(inext;q=C-next
21、;r=A-next;while(p&q&r) (if(p-datadata) p=p-next;else if(p-dataq-data) q=q-next;else (u=p-data; 确定待删除元素uwhile(rnextdatavu) r=r-next; 确定最后一个小于u的元素指针r if(r-next-data=u)s=r-next;while(s-data=u)( ,t=s;s=s-next;free(t); 确定第一个大于u的兀素指针s/whiler-next=s; 删除i和s之间的元素/ifwhile(p-data=u) p=p-next;while(q-data=u) q=
22、q-next;/else/while/LinkLi st_Intersect_Delete2.31Status Delete_Pre(CiLNode *s)删除单循环链表中结点s的直接前驱 (p=s;while(p-next-next!=s) p=pnext; 找至s 的前驱的前驱 pp-next=s;return OK;/Delete_Pre2.32Status Du LN ode_Pre( Du Li nkLi st &L) 完成双向循环链表结点的pre域 |for(p=L;!p-next-pre;p=p-next) p-next-pre=p;return OK;/DuLNode_Pre2
23、.33Status LinkList_Divide(LinkList &L,CiList &A,CiList &B,CiList &C)把单链表 L 的元素按类型分 为三个循环链表.CiList为带头结点的单循环链表类型.(s=L-next;A=(CiList*)malloc(sizeof(CiLNode);p=A;B=(CiList*)malloc(sizeof(CiLNode);q=B;C=(CiList*)malloc(sizeof(CiLNode)m C; 建立头结点while(s)(if(isalphabet(s-data)p-next=s;p=s;else if(isdigit(s
24、-data) q-next=s;q=s; else(r-next=s;r=s;)/whilep-next=A;q-next=B;r-next=C; 完成循环链表 /LinkList_Divide2.34void Print_XorLinkedList(XorLinkedList L)从左向右输出异或链表的元素值 (p=L.left;pre=NULL;while(p)(printf(%dn,p-data);q=XorP(p-LRPtr,pre);pre=p;p=q; 任何一个结点的LRPtr域值与其左结点指针进行异或运算即得到其右结点指针 /Pr i n t_XorLi n kedLi s t2
25、.35Status Insert_XorLinkedList(XorLinkedList &L,int x,int i)在异或链表 L 的第 i 个元素前插入元素 x (p=L.left;pre=NULL;r=(XorNode*)malloc(sizeof(XorNode);r _ a tif(i=l) 当插入点在最左边的情况(p-LRPtr=XorP(p.LRPtr,r);r-LRPtr=p;L.left=r;return OK;j=l;q=p-LRPtr; 当插入点在中间的情况while(+jLRPtr,pre);pre=p;p=q;/while 在p,q两结点之间插入if(!q) ret
26、urn INFEASIBLE; /i 不可以超过表长p-LRPtr=XorP(XorP(p-LRPtr,q),r);q-LRPtr=XorP(XorP(q-LRPtr,p),r);r-LRPtr=XorP(p,q); /修改指针return OK;/Insert_XorLinkedList2.36Status Delete_XorLinkedList(XorlinkedList &L,int i)删除异或链表 L 的第 i 个元素 p=L.left;pre=NULL;if(i=l) 删除最左结点的情况q=p-LRPtr;q-LRPtr=XorP(q-LRPtr,p);L.left=q;free
27、(p);return OK;j=l;q=p-LRPtr;while(+jLRPtr,pre);pre=p;p=q;/while 找到待删结点qif(!q) return INFEASIBLE; /i 不可以超过表长if(L.right=q) /q为最右结点的情况.(p-LRPtr=XorP(p-LRPtr,q);L.right=p;free(q);return OK;1r=XorP(q-LRPtr,p); /q为中间结点的情况,此时p,r分别为其左右结点 p-LRPtr=XorP(XorP(p-LRPtr,q),r);r-LRPtr=XorP(XorP(r-LRPtr,q),p); 修改指针f
28、ree(q);return OK; /Delete_XorLi nkedList2.37void OEReform(DuLinkedList &L)按1,3,5,.4,2的顺序重排双向循环链表L中的所有结点p=L.next;while(p-next !=L&p-next-next !=L)(p-next=p-next-next;p=p-next; 此时p指向最后一个奇数结点if(p-next=L) p-next=L-pre-pre;else p-next=l-pre;p=p-next; 此向p指向最后一个偶数结点while(p-pre-pre !=L)(p-next=p-pre-pre;p=p
29、-next;p-next=L; 按题目要求调整了 next链的结构,此时pre链仍为原状for(p=L;p-next!=L;p=p-next) p-next-pre=p;L-pre=p; /调整pre链的结构,同2.32方法/OEReform分析:next链和pre链的调整只能分开进行.如同时进行调整的话,必须使用堆栈保存偶数结点的 指针,否则将会破坏链表结构,造成结点丢失.2.38DuLNode * Locate_DuList(DuLinkedList &L,int x)带 freq 域的双向循环链表上的查找 p=L.next;while(p.data!=x&p!=L) p=p-next;i
30、f(p=L) return NULL; 没找至p-freq+;q=p-pre;while(q-freqfreq&p!=L) q=q-pre; 杳找插入位置if(q!=p-pre)(p-pre-next=p-next;p-next-pre=p-pre;q-next-pre=p;p-next=q-next;qnext=p;ppre=q; 调整位置)return p;/Locate_DuList2.39float GetValue_SqPoly(SqPoly P,int x0)求升幕顺序存储的稀疏多项式的值(Poly Term *q;xp=l;q=P.data;sum=0;ex=0;while(q-
31、coeD(while(exexp) xp*=xO;sum+=q-coef*xp;q+;)return sum;/GetValue_SqPoly2.40void Subtract_SqPoly(SqPoly Pl,SqPoly P2,SqPoly &P3)求稀疏多项式 Pl 减 P2 的差式 P3 PolyTerm *p,*q,*r;Create_SqPoly(P3); 建立空多项式 P3p=Pl .data;q=P2.data;r=P3.data;while(p-coef&q-coef)1if(p-expexp)(r-coef=p-coef;r-exp=p-exp;p+;r+;)else if
32、(p-expexp)(r-coef=-q-coef;r-exp=q-exp;q+;r+;elseif(p-coef.qcoef)!=0)只有同次项相减不为零时才需要存入P3中 r-coef=p-coef-q-coef;r-exp=p-exp;r4-+;/ifp+;q+;/else/whilewhile(p-coef) 处理Pl或P2的剩余项(r-coef=p-coef;r-exp=p-exp;p+;r+;while(q-coef)(r-coef=-q-coef;r-exp=q-exp;q+;r+;/Subtract_SqPoly2.41void QiuDao_LinkedPoly(Linked
33、Poly &L)对有头结点循环链表结构存储的稀疏多项式L求导(p=L-next;if(!p-data.exp)( 、L-next二p-next;p=pnext; 助K过常数项)while(p!=L)(p-data.coef*=p-data.exp一项求导p=p-next;/QiuDao_LinkedPoly2.42void Divide_LinkedPoly(LinkedPoly &L,&A,&B)把循环链表存储的稀疏多项式L拆成只含奇次 项的A和只含偶次项的B(p=L-next;A=(PolyNode*)malloc(sizeof(PolyNode);B=(PolyNode*)malloc(
34、sizeof(PolyNode);pa=A;pb=B;while(p!=L)(if(p-data.exp!=2*(p-data.exp/2)pa-next=p;pa=p;else(pb-next=p;pb=p;)p=p-next;/whilepa-next=A;pb-next=B;/Divide_LinkedPoly第三章栈与队列3.15typedef struct Elemtype *base2;Elemtype *top2;BDStacktype; 双向栈类型Status Init_Stack(BDStacktype &tws,int m)初始化一个大小为 m 的双向栈 tws (tws.
35、base0=(Elemtype*)malloc(sizeof(Elemtype);tws.basef 1 =tws.baseO+m;tws.top0=tws.base(01;tws.top 1 =tws.base 1 ;return OK;/Init_StackStatus push(BDStacktype &tws,int i,Elemtype x)/x 入栈,i=0 表示低端栈,i=l 表示高端栈 if(tws.top0tws.top(l) return OVERFLOW; 注意此时的栈满条件if(i=0) *tws.top0+=x;else if(i=l) *tws.topl=x;els
36、e return ERROR;return OK;/pushStatus pop(BDStacktype &tws,int i,Elemtype &x)/x 出栈,i=0 表示低端栈,i=l 表示高端栈 if(i=0)if(tws.top0=tws.base0) return OVERFLOW;x=*tws.topfO;else if(i=l)(if(tws.top 1 =tws.base 1 ) return OVERFLOW;x=*+tws.topl;)else return ERROR;return OK;/pop3.16void Train_arrange(char *train)这里
37、用字符串train表示火车,H表示硬席,S表示软席 p=train;q=train;InitStack(s);while(*p)1if(*p=H) push(s,*p); 把H存入栈中else *(q+)=*p; 把S调到前部P+;while(!StackEmpty(s)(pop(s,c);*(q+)=c; 把H接在后部1 /T rain_arrange3.17int IsReverseO判断输入的字符串中&前和&后部分是否为逆串,是则返回1,否则返回0 InitStack(s);while(e=getchar()!=&) 一if(e=,)return 0;不允许在,&之前出现,,push(s
38、,e);while( (e=getchar()!=)if(StackEmpty(s) return 0;pop(s,c);if(e!=c) return 0;if(!StackEmpty(s) return 0;return 1;/Is Re verse3.18Status Bracket_Test(char *str)判别表达式中小括号是否匹配(count=0;for(p=str;*p;p+)if(*p=(*) count+;else if(*p=)*) count;if (count0) return ERROR;if(count) return ERROR; 注意括号不匹配的两种情况re
39、turn OK;/Bracket_Test3.19Status AllBrackets_Test(char *str)判别表达式中三种括号是否匹配(InitStack(s);for(p=str;*p;p+)(if(*p=CII*p=TII*P=) push(s,*p);else if(*p=)|*p=TII*p=T)if(StackEmpty(s) return ERROR;pop(s,c);if(*p=)&c !=() return ERROR;if(*p=T&c !=) return ERROR;if(*p=&c;=) return ERROR; /必须与当前栈顶括号匹配 )/forif(!StackEmpty(s) return ERROR;return OK;/AllBrackets_Test3.20typedef struct .int x;int y; coordinate;void Repaint_Color(int gmn,int i,int j,int color)把点(i,j)相邻区域的颜色置换为 color (
限制150内