数据结构作业本.docx
《数据结构作业本.docx》由会员分享,可在线阅读,更多相关《数据结构作业本.docx(22页珍藏版)》请在冰豆网上搜索。
![数据结构作业本.docx](https://file1.bdocx.com/fileroot1/2022-12/16/fd576c8e-a66f-41d1-b826-b43aef0a2a26/fd576c8e-a66f-41d1-b826-b43aef0a2a261.gif)
数据结构作业本
《数据结构》
学习中心:
专业:
学号:
姓名:
作业练习一
(第二章)
一、选择题
1、以下关于线性表的说法不正确的是()。
A)线性表中的数据元素可以是数字、字符、记录等不同类型。
B)线性表中包含的数据元素个数不是任意的。
C)线性表中的每个结点都有且只有一个直接前趋和直接后继。
D)存在这样的线性表:
表中各结点都没有直接前趋和直接后继。
2、线性表的顺序存储结构是一种()的存储结构。
A)随机存取 B)顺序存取 C)索引存取 D)散列存取
3、在顺序表中,只要知道(),就可在相同时间内求出任一结点的存储地址。
A)基地址 B)结点大小 C)线性表大小 D)基地址和结点大小
4、下面关于线性表的叙述中,错误的是哪一个?
()
A)线性表采用顺序存储,必须占用一片连续的存储单元。
B)线性表采用顺序存储,便于进行插入和删除操作。
C)线性表采用链接存储,不必占用一片连续的存储单元。
D)线性表采用链接存储,便于插入和删除操作。
5、线性表采用链表存储时其存储地址要求( )。
A)必须是连续的; B)部分地址必须是连续的;
C)必须是不连续的; D)连续和不连续都可以。
6、一个长度为n的顺序存储线性表中,向第i个元素(1≤i≤n+1)之前插入一个新元素时,需要从后向前依次后移()个元素。
A)n-i B)n-i+1 C)n-i-1 D)i
7、()运算中,使用顺序表比链表好。
A)插入 B)删除 C)根据序号查找 D)根据元素值查找
8、个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()。
A)O
(1) B)O(n) C)O(n2) D)O(log2n)
9、在一个长度为n的顺序存储线性表中,删除第i个元素(1≤i≤n+1)时,需要从前向后依次前移()个元素。
A)n-i B)n-i+1 C)n-i-1 D)i
10、在一个长度为n的线性表中顺序查找值为x的元素时,查找时的平均查找长度(即x同元素的平均比较次数,假定查找每个元素的概率都相等)为()。
A)n B)n/2 C)(n+1)/2 D)(n-1)/2
11、在一个带头结点单链表HL中,若要向表头插入一个由指针p指向的结点,则
执行()。
A)HL=p;p->next=HL; B)p->next=HL;HL=p;
C)p->next=HL;p=HL; D)p->next=HL->next;HL->next=p;
12、在一个单链表HL中,若要在指针q所指的结点的后面插入一个由指针p所指的结点,则执行()。
A)q->next=p->next;p->next=q; B)p->next=q->next;q=p;
C)q->next=p->next;p->next=q; D)p->next=q->next;q->next=p;
13、在一个单链表HL中,若要删除由指针q所指向结点的后继结点,则执行()。
A)p=q->next;p->next=q->next; B)p=q->next;q->next=p;
C)p=q->next;q->next=p->next; D)q->next=q->next->next;q->next=q;
14、在双向链表指针p所指的结点前插入一个指针q所指的结点操作是()。
A)p->Prior=q; q->Next=p; p->Prior->Next=q; q->Prior=q;
B)p->Prior=q; p->Prior->Next=q; q->Next=p; q->Prior=p->Prior;
C)q->Next=p; q->Prior=p->Prior; p->Prior->Next=q; p->Prior=q;
D)q->Prior=p->Prior; q->Next=q; p->Prior=q; p->Prior=q;
二、填空题
1、对于一个具有n个结点的单链表,在已知的结点*p后插入一个新结点的时间复杂度为( ),在给定值为x的结点后插入一个新结点的时间复杂度为( )。
2、根据线性表的链式存储结构中每一个结点包含的指针个数,将线性链表分成( )和( )。
3、顺序存储结构是通过()表示元素之间的关系的;链式存储结构是通过()表示元素之间的关系的。
4、对于双向链表,在两个结点之间插入一个新结点需修改()个指针,单链表为
()个。
5、循环单链表的最大优点是( )。
6、在无头结点的单链表中,第1个结点的地址存放在头指针中,其他结点的存储地址存放在( )结点的next域中。
7、带头结点的双循环链表L为空表的条件是( )。
8、当线性表的元素总数基本稳定,且很少进行插入和删除操作,但要求以最快的速度存取线性表中的元素时,应采用( )存储结构。
三、问答题与算法题
1、试描述头指针、头结点、首结点的区别、并说明头指针和头结点的作用。
2、何时选用顺序表、何时选用链表作为线性表的存储结构为宜?
3、为什么在单循环链表中设置尾指针比设置头指针更好?
4、写出下图双链表中对换值为23和15的两个结点相互位置时修改指针的有关语句。
结点结构为:
(prior,data,next)
5、下述算法的功能是什么?
LinkListABC(LinkListL){//L是无头结点单链表
if(L&&L->next)
{Q=L;L=L->next;P=L;
while(P->next)P=P->next;
P->next=Q;Q->next=NULL;
}
returnL;
}
6、VoidAA(SqList&L,inti,intx)
{if(i>=1&&i<=Length(L))
{FOR(j=Length(L);j>=i;j--)
A[j+1]=A[j];
A[i]=x;
}
elseexit(ERROR);
}
假定调用该算法时线性表L的内容为(15,26,37,48,55),i为3,x为51,则调用返回后该单链表的内容变为什么?
7、设顺序表L是一个递减有序表,试写一算法,插入元素x,插入后仍保持L的有序性。
Voidsinsert(Sqlist&S,intx)
8、写出从一个带头结点的单链表中删除其值等于给定值x的结点的算法函数。
Intdelete(LinkList&L,intx){
9、已知递增有序的两个带头结点的单链表La,Lb分别存储了一个非空集合A,B。
设计算法实现求两个集合的并集的运算A=A∪B
voidmergelist(linklist&La,linklistLb)
10、设计算法将不设表头结点的不循环的单向链表就地逆转。
(第三章)
一、选择题
1、对于栈操作数据的原则是()。
A)先进先出B)后进先出C)后进后出D)不分顺序
2、一般情况下,将递归算法转换成非递归应通过设置( )实现。
A)数组; B)线性表; C)队列; D)栈。
3、栈和队列的共同点是()
A)都是先进后出 B)都是先进先出
C)只允许在端点处插入和删除元素 D)没有共同点
4、个栈的入栈序列是abcde,则栈的不可能的输出序列是( )。
A)edcbaB)decbaC)dceabD)abcde
5、在对栈的操作中,能改变栈的结构的是( )。
A)StackLength(S) B)StackEmpty(S)C)GetTop(S)D)ClearStack(S)
6、在一个栈顶指针为HS的(不带头结点)链栈中将一个S指针所指的结点入栈,执行( )。
A)HS->next=s; B)S->next=HS->next;HS->next=s;
C)S->next=HS;HS=s; D)S->next=HS;HS=HS->next;
7、若已知一个栈的入栈序列是1,2,3,…,n,其输出序列是p1,p2,p3,…,pn,若p1=n,则pi=( )。
A)I B)n-i C)n-i+1 D)不确定
8、若用一个大小为6的数组来实现循环队列,且当前尾指针rear和头指针front的值分别为0和3,当从队列中删除一个元素,再加入两个元素后,尾指针rear和头指针front的值分别是( )。
A)1和5; B)2和4; C)4和2; D)5和1。
9、输入序列为ABC,可以变为BAC时,经过的栈操作为()
A)push,pop,push,pop,push,popB)push,push,push,pop,pop,pop
C)push,push,pop,pop,push,popD)push,pop,push,push,pop,pop
10、设用一个大小m=60的顺序表A[m]表示一个循环队列,如果当前的尾指针rear=32,头指针front=15,则当前循环队列的元素个数是( )。
A)42; B)16; C)17; D)41。
11、设用顺序表a[n]表示循环队列,头、尾指针分别为front和rear,则判断队列为空的条件是( ),判断队列满的条件是( )。
(1)A)a.front+1==a.rear; B)a.front==a.rear+1;
C)a.front==0; D)a.front==a.rear。
(2)A)(a.rear-1)%n=a.front; B)(a.rear+1)%n=a.front;
C)a.rear=(a.front-1)%n; D)a.rear=(a.front+1)%n。
12、循环队列存储在数组A[0..m]中,则入队时的操作为()。
A)rear=rear+1B)rear=(rear+1)mod(m-1)
C)rear=(rear+1)modmD)rear=(rear+1)mod(m+1)
13、在解决计算机主机与打印机之间速度不匹配问题时通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则从该缓冲区中取出数据打印,该缓冲区应该是一个( )结构。
A)栈; B)队列; C)数组; D)线性表。
二、填空题
1、在栈中,可进行插入和删除操作的一端称()。
2、在作进栈运算时,应先判别栈是否( ),在作退栈运算时应先判别栈是否( )。
当栈中元素为n个,作进栈运算时发生上溢,则说明该栈的最大容量为( )。
3、栈的特点是( ),队列的特点是( )。
4、由于链栈的操作只在链表头部进行,所以没有必要设置( )结点。
5、带头结点的单链表L是空表的条件是();顺序栈S是空栈的条件是();顺序栈S满的条件是();不带头结点的链栈L是空栈的条件是();循环队列Q是空队列的条件是();循环队列Q是满队列的条件是( )
6、用数组Q(其下标在0…n-1之间,共有n个元素)表示一个循环队列,front为当前队头元素的前一个位置,rear为队尾元素的位置,假设队列中的元素个数总小于n,则求队列中元素个数的公式是( )。
7、设元素入栈的顺序是1、2、3、…、n,则所有可能的出栈序列共有( )种。
8、在具有n个单元的循环队列中,队满时共有( )个元素。
三、问答题与算法题
1、设将整数1,2,3,4依次进栈,若入、出栈次序为Push(s,1),Pop(s,x1),Push(s,2),Push(s,3),Pop(s,x2),Pop(s,x3),Push(s,4),Pop(s,x4),则出栈的数字序列为何?
2、设用不带头结点的单链表表示栈,请分别写出入栈和出栈的算法。
(1)intpush_L(Linkstack&sSelemTypee)
(2)intpop_L(Linkstack&sSelemType&e)
3、假设用带头结点的单循环链表表示队列,并设置一个指向尾结点的指针(无头指针),请分别写出队列的入队和出队算法。
(1)intEnQueue_L(Queueptr&QLQelemTypee)
(2)intDeQueue_L(Queueptr&QLQelemType&e)
4、指出下述程序段的功能是什么?
(1)voidabc1(Stack &S)
{
inti,arr[64],n=0;
while(!
StackEmpty(S)){Pop(S,e);arr[n++]=e};
for(i=0,i }
(2)Voidabc2(StackS1,Stack&S2);
{initstack(tmp);
while(!
StackEmpty(S1))
{pop(S1,x); Push(tmp,x); }
while(!
StackEmpty(tmp))
{Pop(tmp,x);Push(S1,x);Push(S2,x);
}
(3)voidabc3(Stack&S,intm)
{InitStack(T);
while(!
StackEmpty(S))
{Pop(S,e);if(e!
=m)Push(T,e);}
while(!
StackEmpty(T))
{Pop(T,e);Push(S,e);}
}
(4)voidabc4(Queue&Q)
{ InitStack(S);
while(!
QueueEmpty(Q))
{DeQueue(Q,x);Push(S,x);}
while(!
StackEmpty(S))
{Pop(S,x);EnQueue(Q,x);}
}
(5)voidinvert1(LinkList&L)。
{p=L;
initstack(S);
while(p)//链表中的元素全部进栈
{push(S,p->data);
p=p->next;
}
p=L;//利用原来的链表只修改数据域的值(反序)
while(!
stackempt(S))
{pop(S,e);
p->data=e;
p=p->next;
}
returnOK;
}
5、回文是指正读反读均相同的字符序列,如"abba"和"abdba"均是回文,但"good"不是回文。
试写一个算法判定给定的用带头结点的单链表表示的字符串是否为回文。
Inthw1(linklistL)
6、写一个将不带头结点的链栈S中所有结点均删去的算法
voidClearStack(LinkStack&S)。
7、写一个返回不带头结点的链栈S中结点个数的算法intStackSize(LinkStackS).
intStacksize(LinkStackS)。
作业练习二
(第七章)
一、选择题
1、设高度为h的二叉树只有度为0和2的结点,则此类二叉树的结点数至少有()个,至多有()个。
A)2h;B)2h-1;C)2h+1;D)2h-1;E)2h-1;F)2h+1。
2、高度为h的完全二叉树至少有()个结点,至多有()个结点。
A)2h;B)2h-1;C)2h+1;D)2h–1。
3、具有n个结点的满二叉树有()个叶结点。
A)n/2;B)(n+1)/2;C)(n-1)/2;D)n/2+1。
4、一棵具有n个叶结点的哈夫曼树,共有()个结点。
A)2nB)2n-1C)2n+1D)2n-1;
5、一棵具有25个叶结点的完全二叉树最多有()个结点。
A)48;B)49;C)50;D)51。
6、已知二叉树的前序和中序遍历序列分别是abdgcefh,dgbaecfh,则后序遍历序列是()。
A)bdgcefha;B)gdbecfha;C)bdgaechf;D)gdbehfca。
7、已知二叉树的中序遍历序列是debac,后序遍历序列是dabec,则前序遍历序列是()。
A)acbed;B)decab;C)deabc;D)cedba。
8、在线索化二叉树中,t所指结点没有左子树的充要条件是()。
A)t->lefu=nullB)t->ltag=1C)t->ltag=1且t->left=nullD)以上都不对
9、如图所示的4棵二叉树中,()不是完全二叉树。
ABCD
二、填空题
1、含有100个结点的树有()条边。
2、一棵二叉树有67个结点,这些结点的度要么是0,要么是2。
这棵二叉树中度为2的结点有()个。
3、含A、B、C三个结点的不同形态的树有( )棵,不同形态的二叉树有( )棵。
4、一棵含有n个结点的2叉树,可能达到的最大深度是()和最小深度是()。
5、一棵哈夫曼树有19个结点,则其叶子结点的个数是()。
6、设二叉树的中序遍历序列是:
ABCDEFG,后序遍历序列是:
BDCAFGE。
则该二叉树的前序遍历序列是:
( ),该二叉树的对应的森林包含( )棵树。
7、将一棵有50个结点的完全二叉树从根结点开始,由根向下,每一层从左至右,顺序地存储在一个一维数组bt[1..50]中,这棵二叉树最下面一层上最左边一个结点存储在数组元素()中。
8、已知一棵树T的边集为{(I,M),(I,N),(E,I),(B,E),(B,D),(C,B),(G,J),(G,K),(A,G),(A,F),(H,L),(A,H),(C,A)}。
则该树的根结点是( )、叶结点是:
( )、树的深度是:
( )。
三、问答题与算法题
1、voidABC(BiTreeBT)
{if(BT==NULL)return;
ABC(BT->lchild);
Printf(“%c”,BT->data);
ABC(BT->rchild);
}
该算法的功能是______________________________________
请模仿写出另外两个类似此算法的算法,并标明这两个算法的功能。
2、写出下列算法的功能.
VoidLevelOrderTraverse(BiTreeT,Status(*vist)(TelemTypee))
{InitQueue(Q);EnQueue(Q,T);
While(!
QueueEmpty(Q))
{DeQueue(Q,p);if(Visit(p->data))returnERROR;
if(p->lchild)EnQueue(Q,p->lchild);
if(p->rchild)EnQueue(Q,p->rchild);
}
returnOK;
}
3、写出下列算法的功能.
StatusPreOrderTraverse(BiTreeT,Status(*Visit)(TelemType(e)))
{InitStack(S);Push(S,T);
While(!
StackEmpty(Q))
{Pop(S,p);if(Visit(p->data))returnERROR;
if(p->rchild)Push(S,p->rchild);
if(p->lchild)Push(S,p->lchild);
}
returnOK;
}
4、写出下列算法的功能.
voidABC(BiTreeBT,int&c1,int&c2)
{
if(BT!
=NULL)
{
ABC(BT->lchild,c1,c2);
c1++;
if(BT->lchild==NULL&&BT->rchild==NULL)c2++;
ABC(BT->rchild,c1,c2);
}
}
5、已知二叉树T的数据域均为正数,写一个算法求数据域的最大值。
Intmaxdata(BitreeT)
6、用递归方法写一个算法求二叉树的叶子数intLeafnum(BiTreeT),先写出基本项和归纳项,然后写算法
7、写一个算法交换二叉树所有结点的左右子树
StatusChangchild(BiTreeT)
8、试分别画出具有3个结点的有序树和3个结点的二叉树的所有不同形态。
9、一棵有11个结点的二叉树的静态链表存储结构如下表。
6
7
8
5
2
m
f
a
k
b
l
c
r
d
s
e
9
10
4
11
1
Lift[i]
Data[i]
Right[i]
画出该二叉树,将此二叉树转化为树或森林。
10、已知二叉树的前序遍历序列是AEFBGCDHIKJ,中序遍历序列是EFAGBCHKIJD,画出此二叉树,并画出它的后序线索二叉树。
11、对于n个结点的完全二叉树,用1~n的连续整数顺序编号,试回答下列问题:
(1)它共有多少层?
各层的结点数分别是多少?
(2)各层最左边的结点的编号分别是多少?
各层最右边的结点的编号分别是多少?
(3)对于编号为
的结点,它的层是多少?
它的双亲(若存在)的编号是多少?
它的左孩(若存在)和右孩(若存在)的编号分别是多少?
12、欲传输一段电文如下:
CATEATDATACAECATSAEAAE
请你设计出这段电文中的每个字符的哈夫曼二进制编码。
并计算整段电文的编码长度.
(第八章)
一、选择题
1、一个具有n个顶点的无向连通图最多有()边,最少有()边。
A)n2;B)n(n-1);C)n(n-1)/2;D)n;E)n-1;F)n+1。
2、一个具有n个顶点的有向强连通图最多有()边,最少有()边。
A)n2;B)n(n-1);C)n(n-1)/2