《数据结构复习资料.doc》由会员分享,可在线阅读,更多相关《数据结构复习资料.doc(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 数据结构 复习题 第1章 绪论习题选择题(1)在数据结构中,从逻辑上可以把数据结构分成( C )。A动态结构和静态结构 B紧凑结构和非紧凑结构C线性结构和非线性结构 D内部结构和外部结构(2)与数据元素本身的形式、内容、相对位置、个数无关的是数据的(C )。A存储结构 B存储实现C逻辑结构 D运算实现(3)通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着( B )。 A数据具有同一特点B不仅数据元素所包含的数据项的个数要相同,而且对应数据项的类型要一致C每个数据元素都一样D数据元素所包含的数据项的个数要相等(4)以下说法正确的是( D )。A数据元素是数据的最小单位B数据项是数据
2、的基本单位C数据结构是带有结构的各数据项的集合D一些表面上很不相同的数据可以有相同的逻辑结构(5)以下与数据的存储结构无关的术语是( C )。A顺序队列 B. 链表 C. 有序表 D. 链栈(6)以下数据结构中,( A )是非线性数据结构A树 B字符串 C队 D栈第2章 线性表1选择题(1)一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( B )。A110 B108 C100 D120(2)在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是( A )。A访问第i个结点(1in)和求第i个结点的直接前驱(2in) B在第i个结点后插入一个新结点(1in)C删
3、除第i个结点(1in)D将n个结点从小到大排序(3) 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动 的元素个数为( B )。A8 B63.5 C63 D7(4)链接存储的存储结构所占存储空间( A )。A分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针B只有一部分,存放结点值C只有一部分,存储表示结点间关系的指针D分两部分,一部分存放结点值,另一部分存放结点所占单元数(5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址( D )。A必须是连续的 B部分地址必须是连续的C一定是不连续的 D连续或不连续都可以(6)线性表在( B )情况下适用于使
4、用链式结构实现。A需经常修改中的结点值 需不断对进行删除插入 C中含有大量的结点 中结点结构复杂(7)单链表的存储密度( C )。A大于1 B等于1 C小于1 D不能确定(8)将两个各有n个元素的有序表归并成一个有序表,其最少的比较次数是( A )。An B2n-1 C2n Dn-1(9)在一个长度为n的顺序表中,在第i个元素(1in+1)之前插入一个新元素时须向后移动( B )个元素。An-i Bn-i+1 Cn-i-1 Di(10) 线性表L=(a1,a2,an),下列说法正确的是( D )。A每个元素都有一个直接前驱和一个直接后继B线性表中至少有一个元素C表中诸元素的排列必须是由小到大或
5、由大到小D除第一个和最后一个元素外,其余每个元素都有一个且仅有一个直接前驱和直接后继。(11) 若指定有n个元素的向量,则建立一个有序单链表的时间复杂性的量级是( C )。AO(1) BO(n) CO(n2) DO(nlog2n)(12) 以下说法错误的是( D )。A求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低B顺序存储的线性表可以随机存取C由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活D线性表的链式存储结构优于顺序存储结构(13) 在单链表中,要将s所指结点插入到p所指结点之后,其语句应为( D )。As-next=p+1; p-next
6、=s;B(*p).next=s; (*s).next=(*p).next;Cs-next=p-next; p-next=s-next;Ds-next=p-next; p-next=s; (14) 在双向链表存储结构中,删除p所指的结点时须修改指针( A )。Ap-next-prior=p-prior; p-prior-next=p-next;Bp-next=p-next-next; p-next-prior=p;Cp-prior-next=p; p-prior=p-prior-prior;Dp-prior=p-next-next; p-next=p-prior-prior;(15) 在双向循环
7、链表中,在p指针所指的结点后插入q所指向的新结点,其修改指针的操作是( C )。Ap-next=q; q-prior=p; p-next-prior=q; q-next=q;Bp-next=q; p-next-prior=q; q-prior=p; q-next=p-next;Cq-prior=p; q-next=p-next; p-next-prior=q; p-next=q;Dq-prior=p; q-next=p-next; p-next=q; p-next-prior=q;2算法设计题(1)将两个递增的有序链表合并为一个递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外
8、占用其它的存储空间。表中不允许有重复的数据。void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc) pa=La-next; pb=Lb-next; Lc=pc=La; /用La的头结点作为Lc的头结点 while(pa & pb) if(pa-datadata) pc-next=pa;pc=pa;pa=pa-next; else if(pa-datapb-data) pc-next=pb; pc=pb; pb=pb-next; else / 相等时取La的元素,删除Lb的元素 pc-next=pa;pc=pa;pa=pa-next; q
9、=pb-next;delete pb ;pb =q; pc-next=pa?pa:pb; /插入剩余段 delete Lb; /释放Lb的头结点 (2)将两个非递减的有序链表合并为一个非递增的有序链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。void union(LinkList& La, LinkList& Lb, LinkList& Lc, ) pa = La-next; pb = Lb-next; / 初始化 Lc=pc=La; /用La的头结点作为Lc的头结点 Lc-next = NULL; while ( pa | pb ) if
10、( !pa ) q = pb; pb = pb-next; else if ( !pb ) q = pa; pa = pa-next; else if (pa-data data ) q = pa; pa = pa-next; else q = pb; pb = pb-next; q-next = Lc-next; Lc-next = q; / 插入 delete Lb; /释放Lb的头结点 (3)已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出A与B的交集,并存放于A链表中。void Mix(LinkList& La, LinkList& Lb, LinkList& Lc,
11、 ) pa=la-next;pb=lb-next;设工作指针pa和pb;Lc=pc=La; /用La的头结点作为Lc的头结点while(pa&pb) if(pa-data=pb-data)交集并入结果表中。 pc-next=pa;pc=pa;pa=pa-next; u=pb;pb=pb-next; delete u; else if(pa-datadata) u=pa;pa=pa-next; delete u;else u=pb; pb=pb-next; delete u;while(pa) u=pa; pa=pa-next; delete u; 释放结点空间while(pb) u=pb; p
12、b=pb-next; delete u;释放结点空间pc-next=null;置链表尾标记。delete Lb; 注: 本算法中也可对B表不作释放空间的处理(4)已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B 的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。void Difference(LinkedList A,B,*n)A和B均是带头结点的递增有序的单链表,分别存储了一个集合,本算法求两集合的差集,存储于单链表A中,*n是结果集合中元素个数,调用时为0p=A-next; p和q分别是链表A和B的工作
13、指针。 q=B-next; pre=A; pre为A中p所指结点的前驱结点的指针。 while(p!=null & q!=null)if(p-datadata)pre=p;p=p-next;*n+; A链表中当前结点指针后移。else if(p-dataq-data)q=q-next; B链表中当前结点指针后移。else pre-next=p-next; 处理A,B中元素值相同的结点,应删除。 u=p; p=p-next; delete u; 删除结点(5)设计算法将一个带头结点的单链表A分解为两个具有相同结构的链表B、C,其中B表的结点为A表中值小于零的结点,而C表的结点为A表中值大于零的结
14、点(链表A的元素类型为整型,要求B、C表利用A表的结点)。(6)设计一个算法,通过一趟遍历在单链表中确定值最大的结点。ElemType Max (LinkList L )+if(L-next=NULL) return NULL;pmax=L-next; /假定第一个结点中数据具有最大值p=L-next-next;while(p != NULL )/如果下一个结点存在if(p-data pmax-data) pmax=p;p=p-next;return pmax-data;(7)设计一个算法,通过遍历一趟,将链表中所有结点的链接方向逆转,仍利用原表的存储空间。void inverse(LinkL
15、ist &L) / 逆置带头结点的单链表 L p=L-next; L-next=NULL; while ( p) q=p-next; / q指向*p的后继 p-next=L-next; L-next=p; / *p插入在头结点之后 p = q; (8)设计一个算法,删除递增有序链表中值大于mink且小于maxk的所有元素(mink和maxk是给定的两个参数,其值可以和表中的元素相同,也可以不同 )。void delete(LinkList &L, int mink, int maxk) p=L-next; /首元结点 while (p & p-datanext; /查找第一个值mink的结点
16、if (p) while (p & p-datanext; / 查找第一个值 maxk 的结点 q=pre-next; pre-next=p; / 修改指针 while (q!=p) s=q-next; delete q; q=s; / 释放结点空间 /if(9)已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。知道双向循环链表中的一个结点,与前驱交换涉及到四个结点(p结点,前驱结点,前驱的前驱结点,后继结点)六条链。void Exchange(LinkedList p)p是双向循环链表中的
17、一个结点,本算法将p所指结点与其前驱结点交换。q=p-llink; q-llink-rlink=p; p的前驱的前驱之后继为p p-llink=q-llink; p的前驱指向其前驱的前驱。 q-rlink=p-rlink; p的前驱的后继为p的后继。 q-llink=p; p与其前驱交换 p-rlink-llink=q; p的后继的前驱指向原p的前驱 p-rlink=q; p的后继指向其原来的前驱算法exchange结束。(10)已知长度为n的线性表A采用顺序存储结构,请写一时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为item的数据元素。题目分析 在顺序存储的线
18、性表上删除元素,通常要涉及到一系列元素的移动(删第i个元素,第i+1至第n个元素要依次前移)。本题要求删除线性表中所有值为item的数据元素,并未要求元素间的相对位置不变。因此可以考虑设头尾两个指针(i=1,j=n),从两端向中间移动,凡遇到值item的数据元素时,直接将右端元素左移至值为item的数据元素位置。void Delete(ElemType A ,int n)A是有n个元素的一维数组,本算法删除A中所有值为item的元素。i=1;j=n;设置数组低、高端指针(下标)。 while(ij) while(ij & Ai!=item)i+; 若值不为item,左移指针。 if(ij)wh
19、ile(ij & Aj=item)j-;若右端元素值为item,指针左移 if(idata;top=top-link; Btop=top-link;x=top-link; Cx=top;top=top-link; Dx=top-link;(5)设有一个递归算法如下 int fact(int n) /n大于等于0 if(n=0) return 1; else return n*fact(n-1); 则计算fact(n)需要调用该函数的次数为( A )。An+1 Bn-1 C n D n+2(6)栈在(D )中有所应用。A递归调用 B函数调用 C表达式求值 D前三个选项都有(7)为解决计算机主机与
20、打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是( A )。A队列 B栈 C 线性表 D有序表(8)设栈S和队列Q的初始状态为空,元素e1、e2、e3、e4、e5和e6依次进入栈S,一个元素出栈后即进入Q,若6个元素出队的序列是e2、e4、e3、e6、e5和e1,则栈S的容量至少应该是(B)。A2 B3 C4 D 6(9)在一个具有n个单元的顺序栈中,假设以地址高端作为栈底,以top作为栈顶指针,则当作进栈处理时,top的变化为(C)。 Atop不变 Btop=0 Ctop- Dtop+(10)设
21、计一个判别表达式中左,右括号是否配对出现的算法,采用(D)数据结构最佳。A线性表的顺序存储结构 B队列 C. 线性表的链式存储结构 D. 栈(11)用链接方式存储的队列,在进行删除运算时(D)。A. 仅修改头指针 B. 仅修改尾指针C. 头、尾指针都要修改 D. 头、尾指针可能都要修改(12)循环队列存储在数组A0.m中,则入队时的操作为(D)。A. rear=rear+1 B. rear=(rear+1)%(m-1) C. rear=(rear+1)%m D. rear=(rear+1)%(m+1) (13)最大容量为n的循环队列,队尾指针是rear,队头是front,则队空的条件是(B)。
22、 A. (rear+1)%n=front B. rear=front Crear+1=front D. (rear-l)%n=front(14)栈和队列的共同点是(C)。A. 都是先进先出 B. 都是先进后出 C. 只允许在端点处插入和删除元素 D. 没有共同点(15)一个递归算法必须包括(B)。A. 递归部分 B. 终止条件和递归部分C. 迭代部分 D. 终止条件和迭代部分第4章 串、数组和广义表习题1选择题(1)串是一种特殊的线性表,其特殊性体现在( B )。 A可以顺序存储 B数据元素是一个字符 C可以链式存储 D数据元素可以是多个字符若 (2)串下面关于串的的叙述中,( B )是不正确
23、的? A串是字符的有限序列 B空串是由空格构成的串C模式匹配是串的一种重要运算 D串既可以采用顺序存储,也可以采用链式存储(3)串“ababaaababaa”的next数组为( C )。A012345678999 B012121111212 C011234223456 D0123012322345(4)串“ababaabab”的nextval为( A )。A010104101 B010102101 C010100011 D010101011 (5)串的长度是指(B )。A串中所含不同字母的个数 B串中所含字符的个数C串中所含不同字符的个数 D串中所含非空格字符的个数(6)假设以行序为主序存储二
24、维数组A=array1.100,1.100,设每个数据元素占2个存储单元,基地址为10,则LOC5,5=( B )。A808 B818 C1010 D1020(7)设有数组Ai,j,数组的每个元素长度为3字节,i的值为1到8,j的值为1到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A5,8的存储首地址为( B )。ABA+141 BBA+180 CBA+222 DBA+225(8)设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为(B )。A13 B33 C18 D40(9)若对n阶对称矩
25、阵A以行序为主序方式将其下三角形的元素(包括主对角线上所有元素)依次存放于一维数组B1.(n(n+1)/2中,则在B中确定aij(ij)的位置k的关系为( B )。Ai*(i-1)/2+j Bj*(j-1)/2+i Ci*(i+1)/2+j Dj*(j+1)/2+i(10)AN,N是对称矩阵,将下面三角(包括对角线)以行序存储到一维数组TN(N+1)/2中,则对任一上三角元素aij对应Tk的下标k是(B )。Ai(i-1)/2+j Bj(j-1)/2+i Ci(j-i)/2+1 Dj(i-1)/2+1(11)设二维数组A1. m,1. n(即m行n列)按行存储在数组B1. m*n中,则二维数组
26、元素Ai,j在一维数组B中的下标为(A )。A(i-1)*n+j B(i-1)*n+j-1 Ci*(j-1) Dj*m+i-1(12)数组A0.4,-1.-3,5.7中含有元素的个数(B )。A55 B45 C36 D16(13)广义表A=(a,b,(c,d),(e,(f,g),则Head(Tail(Head(Tail(Tail(A)的值为( D )。A(g) B(d) Cc Dd(14)广义表(a,b,c,d)的表头是( ),表尾是( C )。Aa B( ) C(a,b,c,d) D(b,c,d)(15)设广义表L=(a,b,c),则L的长度和深度分别为( C )。A1和1 B1和3 C1和
27、2 D2和3 (1)已知模式串t=abcaabbabcab写出用KMP法求得的每个字符对应的next和nextval函数值。模式串t的next和nextval值如下:j1 2 3 4 5 6 7 8 9 10 11 12 t串a b c a a b b a b c a bnextj0 1 1 1 2 2 3 1 2 3 4 5nextvalj0 1 1 0 2 1 3 0 1 1 0 5(2)设目标为t=“abcaabbabcabaacbacba”,模式为p=“abcabaa” 计算模式p的naxtval函数值; 不写出算法,只画出利用KMP算法进行模式匹配时每一趟的匹配过程。 p的nextv
28、al函数值为0110132。(p的next函数值为0111232)。 利用KMP(改进的nextval)算法,每趟匹配过程如下: 第一趟匹配: abcaabbabcabaacbacba abcab(i=5,j=5) 第二趟匹配: abcaabbabcabaacbacba abc(i=7,j=3) 第三趟匹配: abcaabbabcabaacbacba a(i=7,j=1) 第四趟匹配: abcaabbabcabaac bacba (成功) abcabaa(i=15,j=8)(3)数组A中,每个元素Ai,j的长度均为32个二进位,行下标从-1到9,列下标从1到11,从首地址S开始连续存放主存储器
29、中,主存储器字长为16位。求: 存放该数组所需多少单元? 存放数组第4列所有元素至少需多少单元? 数组按行存放时,元素A7,4的起始地址是多少? 数组按列存放时,元素A4,7的起始地址是多少?每个元素32个二进制位,主存字长16位,故每个元素占2个字长,行下标可平移至1到11。(1)242 (2)22 (3)s+182 (4)s+142(4)请将香蕉banana用工具 H( )Head( ),T( )Tail( )从L中取出。L=(apple,(orange,(strawberry,(banana),peach),pear)H(H(T(H(T(H(T(L)(5)写一个算法统计在输入字符串中各个
30、不同字符出现的频度并将结果存入文件(字符串中的合法字符为A-Z这26个字母和0-9这10个数字)。void Count()/统计输入字符串中数字字符和字母字符的个数。int i,num36;char ch;for(i0;i36;i+)numi;/ 初始化while(chgetchar()!=#) /#表示输入字符串结束。if(0=ch=9)i=ch48;numi+; / 数字字符 elseif(A=ch=Z)i=ch-65+10;numi+;/ 字母字符for(i=0;i10;i+) / 输出数字字符的个数printf(“数字d的个数dn”,i,numi);for(i10;i36;i+)/ 求
31、出字母字符的个数printf(“字母字符c的个数dn”,i55,numi);/ 算法结束。(6)写一个递归算法来实现字符串逆序存储,要求不另设串存储空间。题目分析实现字符串的逆置并不难,但本题“要求不另设串存储空间”来实现字符串逆序存储,即第一个输入的字符最后存储,最后输入的字符先存储,使用递归可容易做到。 void InvertStore(char A)/字符串逆序存储的递归算法。 char ch;static int i = 0;/需要使用静态变量scanf (%c,&ch);if (ch!= .) /规定.是字符串输入结束标志InvertStore(A); Ai+ = ch;/字符串逆序
32、存储Ai = 0; /字符串结尾标记/结束算法InvertStore。(7)编写算法,实现下面函数的功能。函数void insert(char*s,char*t,int pos)将字符串t插入到字符串s中,插入位置为pos。假设分配给字符串s的空间足够让字符串t插入。(说明:不得使用任何库函数)题目分析本题是字符串的插入问题,要求在字符串s的pos位置,插入字符串t。首先应查找字符串s的pos位置,将第pos个字符到字符串s尾的子串向后移动字符串t的长度,然后将字符串t复制到字符串s的第pos位置后。 对插入位置pos要验证其合法性,小于1或大于串s的长度均为非法,因题目假设给字符串s的空间足
33、够大,故对插入不必判溢出。void insert(char *s,char *t,int pos)/将字符串t插入字符串s的第pos个位置。int i=1,x=0; char *p=s,*q=t; /p,q分别为字符串s和t的工作指针 if(pos1) printf(“pos参数位置非法n”);exit(0);while(*p!=0&i=pos ;j-)*(p+x)=*p; p-;/串s的pos后的子串右移,空出串t的位置。 q-; /指针q回退到串t的最后一个字符 for(j=1;j=x;j+) *p-=*q-; /将t串插入到s的pos位置上 算法讨论 串s的结束标记(0)也后移了,而串t
34、的结尾标记不应插入到s中。(8)已知字符串S1中存放一段英文,写出算法format(s1,s2,s3,n),将其按给定的长度n格式化成两端对齐的字符串S2, 其多余的字符送S3。题目分析本题要求字符串s1拆分成字符串s2和字符串s3,要求字符串s2“按给定长度n格式化成两端对齐的字符串”,即长度为n且首尾字符不得为空格字符。算法从左到右扫描字符串s1,找到第一个非空格字符,计数到n,第n个拷入字符串s2的字符不得为空格,然后将余下字符复制到字符串s3中。void format (char *s1,*s2,*s3)/将字符串s1拆分成字符串s2和字符串s3,要求字符串s2是长n且两端对齐char
35、 *p=s1, *q=s2;int i=0;while(*p!= 0 & *p= ) p+;/滤掉s1左端空格if(*p= 0) printf(字符串s1为空串或空格串n);exit(0);while( *p!=0 & in)*q=*p; q+; p+; i+;/字符串s1向字符串s2中复制if(*p =0) printf(字符串s1没有%d个有效字符n,n); exit(0);if(*(-q)= ) /若最后一个字符为空格,则需向后找到第一个非空格字符 p- ; /p指针也后退 while(*p= &*p!=0) p+;/往后查找一个非空格字符作串s2的尾字符 if(*p=0) printf
36、(s1串没有%d个两端对齐的字符串n,n); exit(0); *q=*p; /字符串s2最后一个非空字符 *(+q)=0; /置s2字符串结束标记 *q=s3;p+; /将s1串其余部分送字符串s3。while (*p!= 0) *q=*p; q+; p+;*q=0; /置串s3结束标记(9)设二维数组a1.m, 1.n 含有m*n 个整数。 写一个算法判断a中所有元素是否互不相同?输出相关信息(yes/no); 试分析算法的时间复杂度。题目分析判断二维数组中元素是否互不相同,只有逐个比较,找到一对相等的元素,就可结论为不是互不相同。如何达到每个元素同其它元素比较一次且只一次?在当前行,每个元素要同本行后面的元素比