第2章线性表自测题
第2章 线性表(习题).doc

不必占用一片地址连续的(A) head= =NULL (B) head-〉线性表采用链式存第2章线性表习题一、选择题1.线性表是()。
(A)一个有限序列,可以为空;(B) 一个有限序列,不能为空;(0 一个无限序列,可以为空;(D) —个无序序列,不能为空。
2.从一个具有n个结点的单链表中查找值为x结点,在查找成功情况下,需平均比较个结点。
(A)n (B) n/2 (C) (n-l)/2 (D) (n+l)/23.线性表采用链式存储时,其各元素存储地址()。
(A)必须是连续的;(B)部分地址必须是连续的;(0 一定是不连续的;(D)连续与否均可以。
4.用链表表示线性表的优点是()。
(A)便于随机存取(B)花费的存储空间较顺序存储少(C)便于插入和删除(D)数据元素的物理顺序与逻辑顺序相同5. ________ 插入、删除速度快,但不能随机存取。
(A)链接表(B)顺序表(C)顺序有序表(D)上述三项无法比较6.若希望从链表中快速确定一个结点的前驱,则链表最好采用——方式。
(A)单链表(B)循环单链表(C)双向链表(D)任意7.下面关于线性表的叙述错误的是()=线性表采用顺序存储,必须占用一片地址连续的单元; 线性表采用顺序存储,便于进行插入和删除操作;线性表采用链式存储,不便于进行插入和删除操作;8.带头结点的单链表head为空的判定条件是—(C) head-〉next= =head (D) head!=NULL9.若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素, 则采用()存储方式最节省运算时间。
(A)单链表(B)仅有头指针的单循环链表(0双链表(D)仅有尾指针的单循环链表10.在循环双链表的p所指结点之后插入s所指结点的操作是_______________ o(A) p-〉next=s; s-〉prior=p; p-〉next-〉prior=s; s-〉next=p-〉next;(B) p-〉next=s; p-〉next-〉prior=s; s-〉prior=p; s-〉next=p-〉next;(C) s-〉prior=p; s-〉next=p-〉next; p-〉next=s; p-〉next-〉prior=s;(D) s-〉prior=p; s-〉next=p-〉next; p-〉next-〉prior=s; p->next =s;二、填空题1、对于采用顺序存储结构的线性表,当随机插入或删除一个数据元素时,平均约需移动表中_________ 元素。
数据结构第二章 线性表练习及答案

一、选择题1、用单链表方式存储的线性表,存储每个结点需要两个域,一个是数据域,另一个是()A、当前结点所在的地址域B、指针域C、空指针域D、空闲域2、不带头结点的单链表head为空的判断条件是()A、head==NULLB、head->next==NULLC、head->data==NULLD、head!=NULL3、在一个单链表中,已知q所指结点是p所指结点的前驱结点,若在p和q之间插入s结点,则执行()A、s->next=p; q->next=s;B、p->next=s->next; s->next=p;C、q->next=s->next; s->next=p;D、p->next=s; s->next=q;4、在一个具有n个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()A、O(1)B、O(n)C、O(n2)D、O(nlog2n)5、一个单链表中,若删除p所指结点的后续结点,则执行()A、p->next=p->next->next;B、p=p->next; p->next=p->next->next;C、p->next=p;D、p=p->next->next;6、已知一个顺序存储的基本线性表,设每个结点需占m个存储单元,若第一个结点的地址为d1,则第i个结点的地址为()A、d1+(i-1)*mB、d1+i*mC、d1-i*mD、d1+(i+1)*m7、在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是()A、访问第i个结点(1<=i<=n)和求第i个结点的直接前驱(2<=i<=n)B、在第i个结点后插入一个新结点(1<=i<=n)C、删除第i个结点(1<=i<=n)D、将n个结点从小到大排序8、下面给出的算法段是要把一个q所指新结点作为非空双向链表中的p所指结点的前驱结点插入到该双向链表中,能正确完成要求的算法段是()A、q->next=p; q->prior=p->prior; p->prior=q; p->prior->next=q;B、p->prior=q; q->next=p; p->prior->next=q; q->prior=p->prior;C、q->prior=p->prior; q->next=p; p->prior->next=q; p->prior=q;D、以上都不对9、在循环双链表的p所指结点之后插入s所指结点的操作是()A、p->next=s; s->prior=p; p->next->prior=s; s->next=p->next;B、p->next=s; p->next->prior=s; s->prior=p; s->next=p->next;C、s->prior=p; s->next=p->next; p->next=s; p->next->prior=s;D、s->prior=p; p->next->prior=s; s->next=p->next; p->next=s;10、从具有n个结点的单链表中查找其值等于x结点时,在查找成功的情况下,需平均比较()个结点。
第二章 线性表习题

二、判断题
1、逻辑结构相同的数据其存储结构一定相同。 (×) 2、线性表采用链表存储后,线性表长度一定等 于链表所有结点的个数。( × ) 3、双循环链表中,任一结点的前趋指针均不空。 √ ( ) 4、对链表进行插入和删除操作时,不必移动结 点。( √ )
三、填空题
1、在带头结点的单链表L中,若要删除第一个 元素,则需要执行下列三条语句 : U=L->next _______________;L→next=U→next; free(U)。
解:两表结构如下:
P L a1 P1 L1 b1 b2 b3 b4 ^ a2 a3node *L,*L1) { P=L;P1=L1; while(P!=null&&P1!=null) { if(P->data!=P1->data) return(0); P=P->next;P1=P1->next; } if(P!=P1) return(0); else return(1); }
L
×
a1
U
a2
a3
a4
^
2、在单链表L中,若要在指针P所指结点之后 插入由指针S所指的结点,则需执行下列语句: S->next=P->next;______________; P->next=S
P L a1 a2 S ×
②
a3
①
a4
^
x
3、在带有头结点的单链表L中,第一个元素结 L->next 点的指针是_____________。
3、链表不具有的特点是_______。 a 可随机访问任一元素 b 插入删除不需要移动元素 c 不必事先估计存储空间 d 所需空间与线性表长度成正比
第2章线性表习题参考答案

1.D
2.B
3.B
4.B
5.B
6.B
7.D
8.B
9.C
10.B
11.C
12.C
13.B
14.D
15.A
16.B
17.B
18.C
19.A
20.C
21.D
22.A
23.A
24.A
二、填空题
1.首元素其直接前驱结点的链域的值
2.HL→next =NULL;HL=HL→next
3.有限、一对一
4.O(1)随机存取
若用头指针来表示该链表,则查找终端结点的时间为O(n)。
五、编程题
1.解答:由于在单链表中只给出一个头指针,所以只能用遍历的方法来数单链表中的结点个数了。算法如下:
int ListLength ( LinkList L )
{
int len=0 ;
ListNode *p;
p=L; //设该表有头结点
while ( p->next )
int i;
for (i=0;i<=L->length/2;i++)//L->length/2为整除运算
{temp = L->data[i]; //交换数据
L -> data[ i ] = L -> data[ L -> length-1-i];
L -> data[ L -> length - 1 - i ] = temp;
p=p->next;
}
return min;
}
3.int searchmax(linklist l)
{int max;
第二章线性表

第二章线性表第二章线性表一、选择题1.线性表是具有n个__C___的有限序列(n>0)。
A.表元素B.字符C.数据元素D.数据项2.一个顺序表所占用的存储空间大小与___B___无关。
A.表的长度C.元素的类型B.元素的存放顺序D.元素中各字段的类型3.线性表的顺序存储结构是一种__A___。
A.随机存取的存储方式C.索引存取的存储方式B.顺序存取的存储方式D.Hash存取的存储方式4. 若线性表采用顺序存储结构,每个元素占用4 个存储单元,第一个元素的存储地址为100,则第12 个元素的存储地址是__B____。
A.112 B.144 C.148 D.4125. 线性表是__A____。
A.一个有限序列,可以为空B.一个有限序列,不能为空C.一个无限序列,可以为空D.一个无限序列,不能为空6.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为__C____。
A.O(n)O(n)B.O(n)O(1)C.O(1)O(n)D.O(1)O(1) 7.若长度为n的非空线性表采用顺序存储结构,删除表的第i个数据元素,首先需要移动表中___A____中数据元素。
A.n-i B.n+i C.n-i+1 D.n-i-1 8.对顺序存储的线性表,设其长度为n,在任何位置插入或删除操作都是等概率的。
删除一个元素时平均要移动表中的____C____个元素。
A.n/2 B.(n+1)/2 C.(n-1)/2 D.n 9.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为__C____。
(1≤i≤n+1)A.O(0)B.O(1)C.O(n)D.O(n2)10.线性表中各链接点之间的地址___C____。
A.必须连续B.部分地址必须连续C.不一定连续D.连续与否无所谓11.在n个结点的线性表的数组表示中,算法的时间复杂度是O(1)的操作是_A______。
A.访问第i个结点后插入一个新结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)B.在第i个结点后插入一个新结点(1≤i≤n)C.删除第i 个结点(1≤i≤n)D.以上都不对12.单链表中,增加一个头结点的目的是为了____C_____。
第2章 线性表习题及参考答案

第二章线性表习题一判断题1.线性表的逻辑顺序与存储顺序总是一致的。
2.顺序存储的线性表可以按序号随机存取。
3.顺序表的插入和删除操作不需要付出很大的时间代价,因为每次操作平均只有近一半的元素需要移动。
4.线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。
5.在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上并不一定紧邻。
6.在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。
7.线性表的链式存储结构优于顺序存储结构。
8.在线性表的顺序存储结构中,插入和删除时,移动元素的个数与该元素的位置有关。
9.线性表的链式存储结构是用一组任意的存储单元来存储线性表中数据元素的。
10.在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。
二单选题 (请从下列A,B,C,D选项中选择一项)1.线性表是( ) 。
(A) 一个有限序列,可以为空;(B) 一个有限序列,不能为空;(C) 一个无限序列,可以为空;(D) 一个无序序列,不能为空。
2.对顺序存储的线性表,设其长度为n,在任何位置上插入或删除操作都是等概率的。
插入一个元素时平均要移动表中的()个元素。
(A) n/2 (B) n+1/2 (C) n -1/2 (D) n3.线性表采用链式存储时,其地址( ) 。
(A) 必须是连续的;(B) 部分地址必须是连续的;(C) 一定是不连续的;(D) 连续与否均可以。
4.用链表表示线性表的优点是()。
(A)便于随机存取 (B)花费的存储空间较顺序存储少(C)便于插入和删除 (D)数据元素的物理顺序与逻辑顺序相同5.某链表中最常用的操作是在最后一个元素之后插入一个元素和删除最后一个元素,则采用( )存储方式最节省运算时间。
(A)单链表 (B)双链表 (C)单循环链表 (D)带头结点的双循环链表6.循环链表的主要优点是( )。
线性表练习题(答案)

线性表练习题(答案)第2章线性表一选择题下列程序段的时间复杂度为( C )。
for( int i=1;i<=n;i++)for( int j=1;j<= m; j++)A[i][j] = i*j ;A. O(m2)B. O(n2)C. O(m*n)D. (m+n)下面关于线性表的叙述中,错误的是哪一个?( B )A.线性表采用顺序存储,必须占用一片连续的存储单元。
B.线性表采用顺序存储,便于进行插入和删除操作。
C.线性表采用链接存储,不必占用一片连续的存储单元。
D.线性表采用链接存储,便于插入和删除操作。
线性表是具有n个( C )的有限序列(n>0)。
A.表元素 B.字符 C.数据元素D.数据项若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用( A )存储方式最节省时间。
A.顺序表 B.双链表 C.带头结点的双循环链表 D.单循环链表某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( D )存储方式最节省运算时间。
A.单链表 B.仅有头指针的单循环链表 C.双链表 D.仅有尾指针的单循环链表设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( D )最节省时间。
A. 单链表B.单循环链表C. 带尾指针的单循环链表D.带头结点的双循环链表若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。
则采用( D )存储方式最节省运算时间。
A.单链表 B.双链表 C.单循环链表D.带头结点的双循环链表链表不具有的特点是( B )A.插入、删除不需要移动元素 B.可随机访问任一元素A.O(i) B.O(1) C.O(n) D.O (i-1)循环链表H的尾结点P的特点是( A )。
A.P->next=H B.P->next= H->next C.P=H D.P=H->next完成在双循环链表结点p之后插入s的操作是( D );A.p->next=s ; s->priou=p; p->next->priou=s ; s->next=p->next;B. p->next->priou=s; p->next=s; s->priou=p; s->next=p->next;C. s->priou=p; s->next=p->next; p->next=s; p->next->priou=s ;D.s->priou=p; s->next=p->next; p->next->priou=s ; p->next=s;设指针q指向单链表中结点A,指针p指向单链表中结点A的后继结点B,指针s指向被插入的结点X,则在结点A和结点B插入结点X的操作序列为( B )。
第2章线性表练习题答案

第2章线性表练习题答案一、填空1. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时,需向后移动n-i+1 个元素。
2. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时,需向前移动n-i 个元素。
3. 在顺序表中访问任意一结点的时间复杂度均为O(1),因此,顺序表也称为随机存取的数据结构。
4. 在单链表中,除了首元结点外,任一结点的存储位置由其直接前驱结点的链域的值指示。
5.在n个结点的单链表中要删除已知结点*p,需找到它的前驱结点的地址,其时间复杂度为O(n)。
二、判断正误(×)1. 链表的每个结点中都恰好包含一个指针。
答:错误。
链表中的结点可含多个指针域,分别存放多个指针。
例如,双向链表中的结点可以含有两个指针域,分别存放指向其直接前趋和直接后继结点的指针。
(×)2. 链表的物理存储结构具有同链表一样的顺序。
错,链表的存储结构特点是无序,而链表的示意图有序。
(×)3. 链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。
错,链表的结点不会移动,只是指针内容改变。
(×)4. 线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。
错,混淆了逻辑结构与物理结构,链表也是线性表!且即使是顺序表,也能存放记录型数据。
(×)5. 顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。
错,正好说反了。
顺序表才适合随机存取,链表恰恰适于“顺藤摸瓜”(×)6. 顺序存储方式的优点是存储密度大,且插入、删除运算效率高。
错,前一半正确,但后一半说法错误,那是链式存储的优点。
顺序存储方式插入、删除运算效率较低,在表长为n的顺序表中,插入和删除一个数据元素,平均需移动表长一半个数的数据元素。
(×)7. 线性表在物理存储空间中也一定是连续的。
错,线性表有两种存储方式,顺序存储和链式存储。
第二章线性表(答案)

第二章线性表(答案)第二章线性表一、选择题1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )(A)110 (B)108(C)100 (D)1202. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。
(A)64(B)63 (C)63.5 (D)73.线性表采用链式存储结构时,其地址()。
(A) 必须是连续的(B) 部分地址必须是连续的(C) 一定是不连续的(D) 连续与否均可以4. 在一个单链表中,若p所指结点不是最后结点,在p之后插入s所指结点,则执行()(A)s->next=p;p->next=s; (B)s->next=p->next;p->next=s;(C)s->next=p->next;p=s; (D)p->next=s;s->next=p;5.在一个单链表中,若删除p所指结点的后续结点,则执行()(A)p->next=p->next->next; (B)p=p->next; p->next=p->next->next; (C)p->next=p->next; (D)p =p->next->next;6.下列有关线性表的叙述中,正确的是()(A)线性表中的元素之间隔是线性关系(B)线性表中至少有一个元素(C)线性表中任何一个元素有且仅有一个直接前趋(D)线性表中任何一个元素有且仅有一个直接后继7.线性表是具有n个()的有限序列(n≠0)(A)表元素(B)字符(C)数据元素(D)数据项二、判断题1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。
(F )2.如果没有提供指针类型的语言,就无法构造链式结构。
(T )3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。
线性代数习题╱第二章自测题

第二章自测题一、填空1. 设n 阶可逆矩阵A 满足2|A|=|kA|, (k>0), 则k=2. 设⎪⎪⎪⎭⎫ ⎝⎛=101020101A ,而2≥n 为正整数,则12--n n A A =3. 设⎪⎪⎪⎭⎫ ⎝⎛--=11334221t A ,B 为三阶非零矩阵,且0=AB ,则t =4. 设1)1,0,1(--=α,矩阵TααA =, n 为正整数,则||n A bE -= 5. 设A 为3阶方阵,将A 按列分块则),,(321A A A A =,已知,3||=A 则|,,2|2331A A A A +=6. 设A 为奇数阶可逆矩阵,且T A A=-1,|A|=1,则|I -A|=7. 设(1,0,1)T α=-,矩阵TααA =, n 为正整数,则||n A bE -= 二、计算 1. 设⎪⎪⎭⎫⎝⎛-=1201A ,⎪⎪⎭⎫⎝⎛=2103B ,计算2A-3B 2. 设⎪⎪⎪⎭⎫ ⎝⎛=321212113A ,⎪⎪⎪⎭⎫ ⎝⎛-=101012111B ,求AB-BA3. 计算nθθθθ⎪⎪⎭⎫ ⎝⎛-cos sin sin cos 和n⎪⎪⎭⎫⎝⎛-01104. 求逆矩阵(1)⎪⎪⎭⎫ ⎝⎛-θθθθcos sin sin cos (2)⎪⎪⎪⎭⎫⎝⎛--221021132 (3)⎪⎪⎪⎪⎪⎭⎫ ⎝⎛10001100011000115. 设矩阵A ,B 满足E BA BA A 82*-=,其中⎪⎪⎪⎭⎫ ⎝⎛--=100420221A ,*A 是A 的伴随矩阵,求B6. 用分块矩阵的方法求下列矩阵的逆矩阵(1)⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-00000000000121nn a a a a (2)⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛100000100001003102020102 解:(1)⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-01000001000011000121n n a a a a ,(2)⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----100000100000100232102101021021三、证明1. 设方阵A 满足方程0422=+-I A A ,证明:A+I 和A -3I 都可逆,并求它们的逆矩阵。
《c语言数据结构》第2章__自测卷答案

所有的胜利,与征服自己的胜利比起来,都是微不足道。
第2章自测卷答案姓名班级题号一二三四五六七总分题分1310101071040100得分一、填空(每空1分共13分)1. 【严题集2.2①】在顺序表中插入或删除一个元素需要平均移动表中一半元素具体移动的元素个数与表长和该元素在表中的位置有关2. 线性表中结点的集合是有限的结点间的关系是一对一的3. 向一个长度为n的向量的第i个元素(1≤i≤n+1)之前插入一个元素时需向后移动 n-i+1 个元素4. 向一个长度为n的向量中删除第i个元素(1≤i≤n)时需向前移动 n-i 个元素5. 在顺序表中访问任意一结点的时间复杂度均为 O(1)因此顺序表也称为随机存取的数据结构6. 【严题集2.2①】顺序表中逻辑上相邻的元素的物理位置必定相邻单链表中逻辑上相邻的元素的物理位置不一定相邻7. 【严题集2.2①】在单链表中除了首元结点外任一结点的存储位置由其直接前驱结点的链域的值指示8.在n个结点的单链表中要删除已知结点*p需找到它的前驱结点的地址其时间复杂度为O(n)二、判断正误(在正确的说法后面打勾反之打叉)(每小题1分共10分)(×)1. 链表的每个结点中都恰好包含一个指针答:错误链表中的结点可含多个指针域分别存放多个指针例如双向链表中的结点可以含有两个指针域分别存放指向其直接前趋和直接后继结点的指针(×)2. 链表的物理存储结构具有同链表一样的顺序错链表的存储结构特点是无序而链表的示意图有序(×)3. 链表的删除算法很简单因为当删除链中某个结点后计算机会自动地将后续的各个单元向前移动错链表的结点不会移动只是指针内容改变(×)4. 线性表的每个结点只能是一个简单类型而链表的每个结点可以是一个复杂类型错混淆了逻辑结构与物理结构链表也是线性表!且即使是顺序表也能存放记录型数据(×)5. 顺序表结构适宜于进行顺序存取而链表适宜于进行随机存取错正好说反了顺序表才适合随机存取链表恰恰适于"顺藤摸瓜"(×)6. 顺序存储方式的优点是存储密度大且插入、删除运算效率高错前一半正确但后一半说法错误那是链式存储的优点顺序存储方式插入、删除运算效率较低在表长为n的顺序表中插入和删除一个数据元素平均需移动表长一半个数的数据元素(×)7. 线性表在物理存储空间中也一定是连续的错线性表有两种存储方式顺序存储和链式存储后者不要求连续存放(×)8. 线性表在顺序存储时逻辑上相邻的元素未必在存储的物理位置次序上相邻错误线性表有两种存储方式在顺序存储时逻辑上相邻的元素在存储的物理位置次序上也相邻(×)9. 顺序存储方式只能用于存储线性结构错误顺序存储方式不仅能用于存储线性结构还可以用来存放非线性结构例如完全二叉树是属于非线性结构但其最佳存储方式是顺序存储方式(后一节介绍)(×)10. 线性表的逻辑顺序与存储顺序总是一致的错理由同7链式存储就无需一致三、单项选择题(每小题1分共10分)( C )1.数据在计算机存储器内表示时物理地址与逻辑地址相同并且是连续的称之为:(A)存储结构(B)逻辑结构(C)顺序存储结构(D)链式存储结构( B )2.一个向量第一个元素的存储地址是100每个元素的长度为2则第5个元素的地址是(A)110 (B)108 (C)100 (D)120( A )3. 在n个结点的顺序表中算法的时间复杂度是O(1)的操作是:(A)访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)(B)在第i个结点后插入一个新结点(1≤i≤n)(C)删除第i个结点(1≤i≤n)(D)将n个结点从小到大排序( B )4. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变平均要移动个元素(A)8 (B)63.5 (C)63 (D)7( A )5. 链接存储的存储结构所占存储空间:(A)分两部分一部分存放结点值另一部分存放表示结点间关系的指针(B)只有一部分存放结点值(C)只有一部分存储表示结点间关系的指针(D)分两部分一部分存放结点值另一部分存放结点所占单元数( B )6. 链表是一种采用存储结构存储的线性表;(A)顺序(B)链式(C)星式(D)网状( D )7. 线性表若采用链式存储结构时要求内存中可用存储单元的地址:(A)必须是连续的(B)部分地址必须是连续的(C)一定是不连续的(D)连续或不连续都可以( B )8.线性表L在情况下适用于使用链式结构实现(A)需经常修改L中的结点值(B)需不断对L进行删除插入(C)L中含有大量的结点(D)L中结点结构复杂( C )9.单链表的存储密度(A)大于1;(B)等于1;(C)小于1;(D)不能确定( B )10.设a1、a2、a3为3个结点整数P034代表地址则如下的链式存储结构称为P034P0-->3-->a24-->A3(A)循环链表(B)单链表(C)双向循环链表(D)双向链表四、简答题(每小题5分共10分)1. 【严题集2.3②】试比较顺序存储结构和链式存储结构的优缺点在什么情况下用顺序表比链表好?答:①顺序存储时相邻数据元素的存放地址也相邻(逻辑与物理统一);要求内存中可用存储单元的地址必须是连续的优点:存储密度大(=1?)存储空间利用率高缺点:插入或删除元素时不方便②链式存储时相邻数据元素可随意存放但所占存储空间分两部分一部分存放结点值另一部分存放表示结点间关系的指针优点:插入或删除元素时很方便使用灵活缺点:存储密度小(<1)存储空间利用率低顺序表适宜于做查找这样的静态操作;链表宜于做插入、删除这样的动态操作若线性表的长度变化不大且其主要操作是查找则采用顺序表;若线性表的长度变化较大且其主要操作是插入、删除操作则采用链表2 .【严题集2.1①】描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结在单链表中设置头结点的作用是什么?答:首元结点是指链表中存储线性表中第一个数据元素a1的结点为了操作方便通常在链表的首元结点之前附设一个结点称为头结点该结点的数据域中不存储线性表的数据元素其作用是为了对链表进行操作时可以对空表、非空表的情况以及对首元结点进行统一处理头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针若链表中附设头结点则不管线性表是否为空表头指针均不为空否则表示空表的链表的头指针为空这三个概念对单链表、双向链表和循环链表均适用是否设置头结点是不同的存储结构表示同一逻辑结构的问题头结点head-->datalink头指针首元结点简而言之头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针;头结点是在链表的首元结点之前附设的一个结点;数据域内只放空表标志和表长等信息(内放头指针?那还得另配一个头指针!!!)首元素结点是指链表中存储线性表中第一个数据元素a1的结点五、【软考题】线性表具有两种存储方式即顺序方式和链接方式现有一个具有五个元素的线性表L={2317470531}若它以链接方式存储在下列100~119号地址空间中每个结点由数据(占2个字节)和指针(占2个字节)组成如下所示:0517X23V31Y47Z^^100120其中指针XYZ的值分别为多少?该线性表的首结点起始地址为多少?末结点的起始地址为多少?(10分)答:X= 116 Y= 0 Z= 100 首址= 108 末址= 112六、阅读分析题(10分)【严题集2.10②】指出以下算法中的错误和低效(即费时)之处并将它改写为一个既正确又高效的算法答:错误有两处:①参数不合法的判别条件不完整例如表长为10若从第一位置(i=1)删除10个元素(k=10)要求合理但会被判为非法合法的入口参数条件为(0<i≤a.length)^ (0≤k≤a.length-i)应将if ( i<1 || k<0 || i+k> a.length ) return INFEASIBLE改为:if (!((0<i≤a.length)^ (o≤k≤a.length-i))) return INFEASIBLE 第二个FOR语句中元素前移的次序错误应将for ( j = a.length; j>=i+1; j--) a.elem[j-1] = a.elem[j];改为for (j>=i+1; j = a.length; j++) a.elem[j-1] = a.elem[j];七、编程题(每题10分共40分)1. 【徐士良题集2002年1月省统考题】写出在顺序存储结构下将线性表逆转的算法要求使用最少的附加空间解:输入:长度为n的线性表数组A(1:n)输出:逆转后的长度为n的线性表数组A(1:n)C语言描述如下(其中ET为数据元素的类型):2. 【严题集2.6②】已知L是无表头结点的单链表且P结点既不是首元结点也不是尾元结点请写出在P结点后插入S结点的核心语句序列答:此题答案不唯一但若从已给定序列中挑选则限制颇多(7) Q=P;(11) P=L;(8) while(P->next!=Q)P=P->next;(10) P=Q;(4) S->next=P->next;P->next=S;3. 编写程序将若干整数从键盘输入以单链表形式存储起来然后计算单链表中结点的个数(其中指针P指向该链表的第一个结点)注:统计结点个数是【省统考样题】的要求也是教材P60 4-6计算链表长度的要求编程又简单很容易作为考题解:编写C程序如下(已上机通过):全局变量及函数提前说明:---------------------------------#include<stdio.h>#include<stdlib.h>typedef struct liuyu{int data;struct liuyu*link;}test; liuyu *p*q*r*head;int m=sizeof(test);void main () /*第一步从键盘输入整数不断添加到链表*/{int i;head=(test*)malloc(m); /*m=sizeof(test);*/p=head; i=0;while (i!=-9999){ printf("/ninput an integer [stop by '-9999']:");scanf("%d"&i);p->data=i; /* input data is saved */p->link=(test*)malloc(m); /*m=sizeof(test));*/q=p;p=p->link;}q->link=NULL; /*原先用p->link=NULL似乎太晚!*/p=head; i=0; /*统计链表结点的个数并打印出来*/ while (p->link!=NULL){printf("%d"p->data);p=p->link;i++;}printf("\n node number=%d\n"i-1); /*结点的个数不包括-9999*/}0301陈建武:3.程序中统计结点数应是i个而不是i-1.假设链表表长为ni从0开始则在统计某一结点后 i 加一此时p已指向下一个结点第一结点统计结束i为1p指向第二结点即当p指向尾结点(第n个结点)时i的值为n-1while循环条件不符(指针域为null)退出循环即得统计的结点数为n-1.所以 i 的值就是结点数不必再减一4. 请编写26个字母按特定字母值插入或删除的完整程序可自行选用顺序存储或链表结构答:#include<stdio.h> /*全局变量及函数提前说明:*/#include<stdlib.h>typedef struct liuyu{char data;struct liuyu*link;}test;liuyu *p*q*r*head;int L; /*元素的个数*/int m=sizeof(test);void build(); /* 主函数中会被调用的函数应当预先说明 */ void display();int insert_char(charchar); /*插入一个字母在第字母Y之前若无字母则加到末尾*/int delet_char(char); /* 删除元素X注意保存X的前趋元素指针! *//*---------------------------------------------------------*/void build() /*字母链表的生成*/{int i;head=(test*)malloc(m); /*m=sizeof(test);*/p=head;for(i=1;i<L;i++){ p->data=i+'a'-1; /* 'a'也可用其ASCII码97来表示 */ p->link=(test*)malloc(m); /*m=sizeof(test));*/p=p->link; }p->data=i+'a'-1;p->link=NULL;}/*---------------------------------------------------------*/void display() /*字母链表的输出*/{p=head;while (p->link!=NULL){ printf("%c"p->data);p=p->link; }printf("%c\n"p->data);}/*---------------------------------------------------------*/ int insert_char(char Xchar Y) /*插入一个字母X在某个字母Y之前若找不到Y字母则加到末尾*/{p=head;r=(test*)malloc(m);r->data=X;if(head->data==Y){ head=r;r->link=p; }else{ while((p->data!=Y)&&(p->link!=NULL)) {q=p; p=p->link;} if(p->data==Y) { q->link=r; r->link=p; }else{p->link=r;r->link=NULL;}}L++;return(0);}/*---------------------------------------------------------*/ int delet_char(char X) /* 删除元素X注意保存X的前趋元素指针! */{ p=head;if(head->data==X){head=head->link;free(p);}else{ while((p->data!=X)&&(p->link!=NULL)){q=p;p=p->link;}if(p->data==X){ q->link=p->link;free(p); }else return(-1);}L--;return(0);}/*---------------------------------------------------------*/ void main(void) /*字母线性表的生成和输出*/{ L=26;build();display();printf("insert return value=%d\n"insert_char('L''W'));display();printf("delete return value=%d\n"delet_char('z'));display();}附:屏幕上显示的执行结果是:a b c d e f g h i j k l m n o p q r s t u v w x y z insert return value=0a b c d 9 e f g h i j k l m n o p q r s t u v w x y z L delete return value=0a b c d e f g h i j k l m n o p q r s t u v w x y L0301陈建武修改意见:一. display()函数代码可优化为四行void display() /*字母链表的输出*/{p=head;while (p->link!=NULL)//改为while(p)因为当p指向尾结点时p不为null条件成立循环//printf()然后p被赋值为null此时循环条件不符退出正好.{ printf("%c"p->data);p=p->link; }printf("%c\n"p->data); //用while(p)此行可删}二.对int insert_char(char Xchar Y)若用带头结点的链表代码可减为10行我的程序如下(若参数没有slist p代码要多一行让q指向头指针)void InsertFind(slist pchar insertcharchar insertpos)//字母insertpos前插入字母insertchar{slist ppriornewnode; //newnode新结点pprior为插入位置结点的直接前驱newnode = new liuyu; //为新结点分配内存newnode->data = insertchar; //对结点数据域初始化while(p) //当p指向尾结点时最后一次循环{pprior = p; //pprior从头指针开始指向p的直接前驱p = p->next; //p从首元结点开始不断前移直至最后p为nullif(p&&(p->data == insertpos)) //当p为null或者结点p的数据域为所要插入的字母break; //则退出循环}newnode->next = pprior->next; //在找到的位置前插入pprior->next = newnode;}对删除结点的操作若有头结点同样可以减少代码由此可见创建一个头结点对简化程序有很大的帮助.上面的观点仅供参考不对之处请指教!。
第2章 线性表习题及参考答案

for(j=elenum-1; j>=i; j--)
A[j+1] = A[j]; //将数据元素后移
A[i] = x;
elenum++;
return OK;}时间复杂度:
O(elenum)
2、void ReElemDelete(SqList &A){if (
1.Josephu问题
Josephu问题为:
设编号为1,2,…n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
提示:
用一个不带头结点的循环链表来处理Josephu问题:
(D)从表中的任意结点出发都能扫描到整个链表
7.下面关于线性表的叙述错误的是()。
(A)线性表采用顺序存储,必须占用一片地址连续的单元;
1(B)线性表采用顺序存储,便于进行插入和删除操作;
(C)线性表采用链式存储,不必占用一片地址连续的单元;
(D)线性表采用链式存储,不便于进行插入和删除操作;
8.单链表中,增加一个头结点的目的是为了()。
先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。
2.一元多项式的相加
提示:
(1)一元多项式的表示问题:
对于任意一元多项式:
Pn(x)= P
0+ P
第2章线性表习题练习答案

第2章线性表习题练习答案2.1 试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。
答:开始结点是指链表中的第一个结点,也就是没有直接前趋的那个结点。
链表的头指针是一指向链表开始结点的指针(没有头结点时),单链表由头指针唯一确定,因此单链表可以用头指针的名字来命名。
头结点是在链表的开始结点之前附加的一个结点。
有了头结点之后,头指针指向头结点,不论链表否为空,头指针总是非空。
而且头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致(都是在某一结点之后)。
2.2 何时选用顺序表、何时选用链表作为线性表的存储结构为宜?答:在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有以下几方面的考虑:1.基于空间的考虑。
当要求存储的线性表长度变化不大,易于事先确定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度变化大,难以估计其存储规模时,采用动态链表作为存储结构为好。
2.基于时间的考虑。
若线性表的操作主要是进行查找,很少做插入和删除操作时,采用顺序表做存储结构为宜;反之,若需要对线性表进行频繁地插入或删除等的操作时,宜采用链表做存储结构。
并且,若链表的插入和删除主要发生在表的首尾两端,则采用尾指针表示的单循环链表为宜。
2.3 在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素?答:在等概率情况下,顺序表中插入一个结点需平均移动n/2个结点。
删除一个结点需平均移动(n-1)/2个结点。
具体的移动次数取决于顺序表的长度n以及需插入或删除的位置i。
i越接近n则所需移动的结点数越少。
2.4 为什么在单循环链表中设置尾指针比设置头指针更好?答:尾指针是指向终端结点的指针,用它来表示单循环链表可以使得查找链表的开始结点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为rear,则开始结点和终端结点的位置分别是rear->next->next 和 rear, 查找时间都是O(1)。
数据结构 第二章:线性表

第二章线性表:习题习题一、选择题1.L是线性表,已知Length(L)的值是5,经运算?Delete(L,2)后,length(L)的值是( c)。
A.5B.0C.4D.62.线性表中,只有一个直接前驱和一个直接后继的是( )。
A.首元素 B.尾元素C.中间的元素 D.所有的元素+3.带头结点的单链表为空的判定条件是( )。
A. head= =NULLB. head->next= =NULLC. head->next=headD. head!=NULL4.不带头结点的单链表head为空的判定条件是( )。
A. head=NULLB. head->next =NULLC.head->next=headD. head!=NULL5.非空的循环单链表head的尾结点P满足()。
A. p->next = =NULLB. p=NULLC. p->next==headD. p= =head6.线性表中各元素之间的关系是( c)关系。
A.层次B.网状C.有序 D.集合7.在循环链表的一个结点中有()个指针。
A.1B.2 C. 0 D. 38.在单链表的一个结点中有()个指针。
A.1B.2 C. 0 D. 39.在双链表的一个结点中有()个指针。
A.1B.2 C. 0 D. 310.在一个单链表中,若删除p所指结点的后继结点,则执行()。
A.p->next= p->next ->next;B. p=p->next; p->next=p->next->next;C. p->next= p->next;D. p=p->next->next;11.指针P指向循环链表L的首元素的条件是()。
A.P= =L B. P->next= =L C. L->next=P D. P-> next= =NU LL12. 在一个单链表中,若在p所指结点之后插入s所指结点,则执行()。
PTA 第二章 线性表作业及答案 数据结构平时作业

A. 38 B. 43 C. 26 D. 29
2、完成下列填空题(每空3分,共9分)。
1.在顺序表L中第i个位置上插入一个新的元素e:
Status ListInsert_Sq(SqList &L , int i , ET e){
}
for( j=L.length ; j>=i ; --j )
___L.elem[j]=L.elem[j-1]____;
L.elem[j]=e ;
++L.length_______;
return OK;
}
2.删除双向(DuLinkList L, DuLinkList p) {
}
for (k=0,i=0;i<A.length;i++)
{
if(A.data[i]==’#’) k++;
else A.data[i-k]= A.data[i];
}
A.length= A.length-k;
}
2.(15分)已知带头结点的单循环链表L,编写算法实现删除其中所有值为e的数据元素结点。
(要求:类型定义、算法描述和算法时间复杂度分析)
return;
p = L;
while (p->next != L)
{
if (p->next->data != e)
P = p->next;
else
{ q = p->next;p->next = q->next; free(q);}
}
}
时间复杂度为O(n)。(2分)
第二章线性表习题及答案

第二章线性表习题及答案一、根底知识题2.1 试描述头指针、头结点、开场结点的区别、并说明头指针和头结点的作用。
答:始结点是指链表中的第一个结点,也就是没有直接前趋的那个结点。
链表的头指针是一指向链表开场结点的指针(没有头结点时),单链表由头指针唯一肯定,因此单链表可以用头指针的名字来命名。
头结点是咱们人为地在链表的开场结点之前附加的一个结点。
有了头结点以后,头指针指向头结点,无论链表否为空,头指针老是非空。
而且头指针的设置使得对链表的第一个位置上的操作与在表其他位置上的操作一致(都是在某一结点以后)。
2.2 何时选用顺序表、何时选用链表作为线性表的存储构造为宜?答:在实际应用中,应按照具体问题的要求和性质来选择顺序表或链表作为线性表的存储构造,通常有以下几方面的考虑:1.基于空间的考虑。
当要求存储的线性表长度转变不大,易于事前肯定其大小时,为了节约存储空间,宜采用顺序表;反之,当线性表长度转变大,无法计算其存储规模时,采用动态链表作为存储构造为宜。
2.基于时间的考虑。
假设线性表的操作主如果进展查找,很少做插入和删除操作时,采用顺序表做存储构造为宜;反之,假设需要对线性表进展频繁地插入或删除等的操作时,宜采用链表做存储构造。
而且,假设链表的插入和删除主要发生在表的首尾两头,那么采用尾指针表示的单循环链表为宜。
2.3 在顺序表中插入和删除一个结点需平均移动多少个结点?具体的移动次数取决于哪两个因素?答:在等概率情况下,顺序表中插入一个结点需平均移动n/2个结点。
删除一个结点需平均移动(n-1)/2个结点。
具体的移动次数取决于顺序表的长度n和需插入或删除的位置i。
i越接近n那么所需移动的结点数越少。
2.4 为何在单循环链表中设置尾指针比设置头指针更好?答:尾指针是指向终端结点的指针,用它来表示单循环链表可使得查找链表的开场结点和终端结点都很方便,设一带头结点的单循环链表,其尾指针为rear,那么开场结点和终端结点的位置别离是rear->next->next 和rear, 查找时间都是O(1)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
第2章
自测题
一、填空
1.在顺序表中插入或删除一个元素,需要平均移动 元素,具体移动的元素个数与 有关。
2. 线性表中结点的集合是 的,结点间的关系是 的。
3. 在顺序表中访问任意一结点的时间复杂度均为 ,因此,顺序表也称为 的数据结构。
4.顺序表中逻辑上相邻的元素的物理位置 相邻。单链表中逻辑上相邻的元素的物理位置 相邻。
5.在单链表中,除了首元结点外,任一结点的存储位置由 指示。
6. 在n个结点的单链表中要删除已知结点*p,需找到它的 ,其时间复杂度为 。
二、单项选择题
( )1.数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为:
(A)存储结构 (B)逻辑结构 (C)顺序存储结构 (D)链式存储结构
( )2.一个向量第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是
(A)110 (B)108 (C)100 (D)120
( )3. 在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是:
(A) 访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n)
(B) 在第i个结点后插入一个新结点(1≤i≤n)
(C) 删除第i个结点(1≤i≤n)
(D) 将n个结点从小到大排序
( )4. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动 个元素
(A)8 (B)63.5 (C)63 (D)7
( )5. 链接存储的存储结构所占存储空间:
(A) 分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
(B) 只有一部分,存放结点值
(C) 只有一部分,存储表示结点间关系的指针
(D) 分两部分,一部分存放结点值,另一部分存放结点所占单元数
( )6. 链表是一种采用 存储结构存储的线性表;
(A)顺序 (B)链式 (C)星式 (D)网状
( )7. 线性表若采用链式存储结构时,要求内存中可用存储单元的地址:
(A)必须是连续的 (B)部分地址必须是连续的
(C)一定是不连续的 (D)连续或不连续都可以
( )8. 线性表L在 情况下适用于使用链式结构实现。
(A)需经常修改L中的结点值 (B)需不断对L进行删除插入
(C)L中含有大量的结点 (D)L中结点结构复杂
( )9. 单链表的存储密度
(A)大于1; (B)等于1; (C)小于1; (D)不能确定
2
( )10. 设a1、a2、a3为3个结点,整数P0,3,4代表地址,则如下的链式存储结构称为
P0 3 4
P
0
a1 3 a2 4
a3
0
(A)循环链表 (B)单链表 (C)双向循环链表 (D)双向链表
()11. 不带头结点的单链表first为空的判定条件是( )。
A. first == NULL; B. first->next == NULL;
C. first->next == first; D. first != NULL;
( )12. 带头结点的单链表first为空的判定条件是( )。
A. first==NULL; B. first->next==NULL;
C. first->next==first; D. first!=NULL;
( ) 13. 设单链表中结点的结构为(data, next)。已知指针q所指结点是指针p所指结点的直接前
驱,若在*q与*p之间插入结点*s,则应执行的操作是( )。
A. s->next=p->next; p->next=s; B. q->next=s; s->next=p;
C. p->next=s->next; s->next=p; D. p->next=s; s->next=q;
( )14. 设单链表中结点的结构为(data, next)。已知指针p所指结点不是尾结点,若在*p之后插
入结点*s,则应执行的操作是( )。
A.s->next=p; p->next=s; B. p->next=s; s->next=p;
C.s->next=p->next; p=s; D. s->next=p->next; p->next=s;
( )15. 设单链表中结点的结构为(data, next)。若想摘除p->next所指向的结点,则应执行的操
作是( )。
A. p->next=p->next->next; B. p=p->next; p->next=p->next->next;
C. p->next=p; D. p=p->next->next;
( )16. 已知L是一个不带表头的单链表, 在表首插入结点*p的操作是( )。
A. p = L; p->next = L; B. p->next = L; p = L;
C. p->next = L; L = p; D. L = p; p->next = L;
四、简答题
1.试比较顺序存储结构和链式存储结构的优缺点。在什么情况下用顺序表比链表好?
2 .描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结点)。在单链表中设置头结点的
作用是什么?
五 算法分析与设计
1. 设顺序表SeqList存放的是int型数据,具有下列操作:
int Length( ) ; //计算表长度并返回,若表为空则返回0
int Remove( ); //删除当前表项并返回其值,置下一表项为当前表项
int First( ); //取表中第一个表项的值并返回,并置为当前表项
int Next( ); //取当前表项后继表项的值并返回,并把此后继表项置为当前表项
若顺序表中存放的数据为{29,38,47,16,95,64,73,83,51,10,0,26},表的长度为12,参数值s=10,
3
t=30,说明算法执行后顺序表的状态和长度的变化。
void unknown ( SeqList *L, int s, int t )
{ int i=0,temp;
if(!Length( ) || s>=t)
{printf(“表为空或参数值有误!”); return;}
temp= First( );
while(i
else {temp=Next( ); i++;}
}
算法执行后顺序表中的数据:
算法执行后顺序表的长度:
2.这是一个统计单链表中结点的值等于给定值x的结点数的算法,其中有两行错误,请指出错误行的
行号并改正。
int count (ListNode *Ha, DataType x) ①
{ // Ha 为不带头结点的单链表的头指针
int n = 0; ②
while (Ha!= NULL){ ③
Ha = Ha->next; ④
if (Ha->data == x) n++; ⑤
} //while
return n; ⑥
}//count
错误语句号:
修改如下:
3. 3. 阅读下列算法,并补充所缺内容。
void purge_linkst( ListNode *la ){
// 从头指针为 la 的有序链表中删除所有值相同的多余元素,并释放被删结点空间.
ListNode *p,*q;
if(la==NULL) return;
q=la; p = la->next;
while (p) {
if (p && ___(1)___) {q=p; p = p->next;}
else {
q->next= ___(2)___;
delete(p); //删除当前结点p
p=___(3)___;
}
}//while
}// purge_linkst
4.设计顺序表定位查找算法,完成的功能为:在线性表L中查找是否存在数据元素x,如果存在则返
4
回线性表中和x值相等的第1个数据元素的序号;如果不存在,则返回-1。
5.编写不带头结点的单链表删除算法,完成的功能为:删除单链表head中第i个元素,并用x返回其
值。