第2章线性表习题解答

合集下载

数据结构习题及答案 (2)

数据结构习题及答案 (2)

第二章线性表一、选择题1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )(A)110 (B)108(C)100 (D)120参考答案:B2. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。

(A)64(B)63 (C)63.5 (D)7参考答案:C3.线性表采用链式存储结构时,其地址()。

(A) 必须是连续的 (B) 部分地址必须是连续的(C) 一定是不连续的 (D) 连续与否均可以参考答案:D4. 在一个单链表中,若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;参考答案:B5.在一个单链表中,若删除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;参考答案:A6.下列有关线性表的叙述中,正确的是()(A)线性表中的元素之间隔是线性关系(B)线性表中至少有一个元素(C)线性表中任何一个元素有且仅有一个直接前趋(D)线性表中任何一个元素有且仅有一个直接后继参考答案:A7.线性表是具有n个()的有限序列(n≠0)(A)表元素(B)字符(C)数据元素(D)数据项参考答案:C二、判断题1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。

()2.如果没有提供指针类型的语言,就无法构造链式结构。

()3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。

第二章线性表习题及答案

第二章线性表习题及答案

第二章线性表习题及答案‎一、基础知识题‎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、用单链表方式存储的线性表,存储每个结点需要两个域,一个是数据域,另一个是()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结点时,在查找成功的情况下,需平均比较()个结点。

DS02线性表习题参考解答

DS02线性表习题参考解答

第2章线性表习题参考解答一、简答题1.试描述头指针、头结点、开始结点的区别、并说明头指针和头结点的作用。

【答】头指针:是指向链表中的第一个结点的指针。

头结点:在开始结点之前附加上的一个结点。

开始结点:链表的第一个结点。

头指针是一个指向地址的变量,用于表示一个链表的开始。

引入头结点可以更加方便的进行链表是否为空的判断,同时方便了插入和删除结点。

开始结点用于存储链表的第一个数据元素。

2.何时选用顺序表、何时选用链表作为线性表的存储结构为宜?【答】顺序表中查找元素、获取表长非常容易,但是,要插入或者删除一个元素却需要移动大量的元素;相反,链表中却是方便插入或者删除元素,在查找元素的是,需要进行遍历。

因此,当所涉及的问题常常进行查找等操作,而插入、删除相对较少的是,适合采用顺序表;当常常需要插入、删除的时候,适合采用链表。

3.为什么在单循环链表中设置尾指针比设置头指针更好?【答】在单循环链表中,设置尾指针,可以更方便的判断链表是否为空。

4.在单链表、双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?【答】本题分三种情况讨论:1、单链表:当知道指针p指向某结点时,能够根据该指针找到其直接后继,但是不知道头指针,因此不能找到该结点的直接前趋,因此,无法删除该结点。

2、双链表:根据指针p可以找到该结点的直接前趋和直接后继,因此,能够删除该结点。

3、单循环链表:和双链表类似,根据指针p也可以找到该结点的直接前趋和直接后继,因此,也可以删除该结点。

5.下述算法的功能是什么?LinkList Demo(LinkList *L) /* L是无头结点单链表*/{LNode *Q,*P;if(L&&L->next){Q=L;L=L->next;P=L;while (P->next) P=P->next;P->next=Q; Q->next=NULL;}return L;} /* Demo */【答】将原来的第一个结点变成末尾结点,原来的第二个结点变成链表的第一个结点。

《数据结构》吕云翔编著第2章线性表习题解答

《数据结构》吕云翔编著第2章线性表习题解答

数据结构第二章习题解答一、单选题1.在一个长度为n的顺序存储线性表中,向第i个元素(1≤i≤n+1)之前插入一个新元素时,需要从后向前依次后移(B)个元素。

A、n-iB、n-i+1C、n-i-1D、i2.在一个长度为n的顺序存储线性表中,删除第i个元素(1≤i≤n+1)时,需要从前向后依次前移(A)个元素。

A、n-iB、n-i+1C、n-i-1D、i3. 在一个长度为n的线性表中顺序查找值为x的元素时,在等概率情况下,查找成功时的平均查找长度(即需要比较的元素个数)为( C )。

A. nB. n/2C. (n+1)/2D. (n-1)/24.在一个长度为n的线性表中,删除值为x的元素时需要比较元素和移动元素的总次数为(C )。

A. (n+1)/2B. n/2C. nD. n+15. 在一个顺序表的表尾插入一个元素的时间复杂度为(B )。

A. O(n)B. O(1)C. O(n*n)D. O(log2n)6.若一个结点的引用为p,它的前驱结点的引用为q,则删除p的后继结点的操作为(B )。

A. p=p.next.nextB. p.next=p.next.nextC. q.next=p.nextD. q.next=q.next.next8. 假定一个多项式中x的最高次幂为n,则在保存所有系数项的线性表表示中,其线性表长度为(A )。

A. n+1B. nC. n-1D. n+2二、填空题1.对于当前长度为n的线性表,共包含有________多个插入元素的位置,共包含有________多个删除元素的位置。

(答案n+1 n)2.若经常需要对线性表进行表尾插入和删除运算,则最好采用________存储结构,若经常需要对线性表进行表头插入和删除运算,则最好采用________存储结构。

(答案:顺序链式)3.由n个元素生成一个顺序表,若每次都调用插入算法把一个元素插入到表头,则整个算法的时间复杂度为________,若每次都调用插入算法把一个元素插入到表尾,则整个算法的时间复杂度为________。

第二章课后作业答案

第二章课后作业答案

第二章线性表习题(答案)1.描述以下三个概念的区别:头指针,头结点,首元素结点。

首元结点是指链表中存储线性表中第一个数据元素a1的结点。

为了操作方便,通常在链表的首元结点之前附设一个结点,称为头结点,该结点的数据域中不存储线性表的数据元素,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理。

头指针是指向链表中第一个结点(或为头结点或为首元结点)的指针。

若链表中附设头结点,则不管线性表是否为空表,头指针均不为空。

否则表示空表的链表的头指针为空。

2.填空:(1)在顺序表中插入或删除一个元素,需要平均移动一半元素,具体移动的元素个数与插入或删除的位置有关。

(2)在顺序表中,逻辑上相邻的元素,其物理位置也相邻。

在单链表中,逻辑上相邻的元素,其物理位置不一定相邻。

(3)在带头结点的非空单链表中,头结点的存储位置由头指针指示,首元素结点的存储位置由头结点的next域指示,除首元素结点外,其它任一元素结点的存储位置由其直接前趋的next域指示。

3.已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。

按要求从下列语句中选择合适的语句序列。

a. 在P结点后插入S结点的语句序列是:(4)、(1)。

b. 在P结点前插入S结点的语句序列是:(7)、(11)、(8)、(4)、(1)。

c. 在表首插入S结点的语句序列是:(5)、(12)。

d. 在表尾插入S结点的语句序列是:(11)、(9)、(1)、(6)。

供选择的语句有:(1)P->next=S; (2)P->next= P->next->next; (3)P->next= S->next;(4)S->next= P->next; (5)S->next= L; (6)S->next= NULL;(7)Q= P; (8)while(P->next!=Q) P=P->next;(9)while(P->next!=NULL) P=P->next; (10)P= Q;(11)P= L; (12)L= S; (13)L= P;4.设线性表存于a[n]中且递增有序。

第2章线性表习题参考答案

第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;

数据结构习题及答案 (2)

数据结构习题及答案 (2)

第二章线性表一、选择题1.一个线性表第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是( )(A)110 (B)108(C)100 (D)120参考答案:B2. 向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动()个元素。

(A)64(B)63 (C)63.5 (D)7参考答案:C3.线性表采用链式存储结构时,其地址()。

(A) 必须是连续的 (B) 部分地址必须是连续的(C) 一定是不连续的 (D) 连续与否均可以参考答案:D4. 在一个单链表中,若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;参考答案:B5.在一个单链表中,若删除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;参考答案:A6.下列有关线性表的叙述中,正确的是()(A)线性表中的元素之间隔是线性关系(B)线性表中至少有一个元素(C)线性表中任何一个元素有且仅有一个直接前趋(D)线性表中任何一个元素有且仅有一个直接后继参考答案:A7.线性表是具有n个()的有限序列(n≠0)(A)表元素(B)字符(C)数据元素(D)数据项参考答案:C二、判断题1.线性表的链接存储,表中元素的逻辑顺序与物理顺序一定相同。

()2.如果没有提供指针类型的语言,就无法构造链式结构。

()3.线性结构的特点是只有一个结点没有前驱,只有一个结点没有后继,其余的结点只有一个前驱和后继。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第2章习题 (1)第2章习题2.1若将顺序表中记录其长度的分量listlen改为指向最后一个元素的位置last,在实现各基本运算时需要做那些修改?【解】//用线性表最后一个元素的下标last代替listLen实现顺序表#define MAXLEN 100typedef int elementType;typedef struct sllLast{elementType data[MAXLEN];int last;}seqList;//初始化void initialList(seqList &S){st=-1;}//求表长度int listLength(seqList S){return st+1;}//按序号取元素bool getElement(seqList S,int i,elementType &x){if(i<1 || i>st+1) //i为元素编号,有效范围在st+1之间return false;else{x=S.data[i-1];return true;}}//查找元素x,成功:返回元素编号;失败:返回0int listLocate(seqList S,elementType x){int i;for(i=0;i<=st;i++){if(S.data[i]==x)return i+1; //找到,转换为元素编号输出}return 0;}//插入元素int listInsert(seqList &S,elementType x, int i){int k;if(st>MAXLEN-1)return 0; //表满,返回0else if(i<1 || i>st+2)return 1; //插入位置查处范围,返回1 else{for(k=st;k>=i-1;k--)S.data[k+1]=S.data[k];S.data[i-1]=x;st++;return 2;}}//删除元素int listDelete(seqList &S,int i){int k;if(st==-1)return 0; //空表,返回0else if(i<1 || i>st+1)return 1; //删除元素编号超出范围,返回1 else{for(k=i;k<=st;k++)S.data[k-1]=S.data[k];st--;return 2;}}//7. 打印表中所有元素void printList(seqList L){int i;for(i=0;i<=st;i++)cout<<L.data[i]<<"\t"; //元素之间以制表符分割cout<<endl;}//8. 交互输入数据元素--特殊输入结束void listInputC(seqList &L){if(st>=0){cout<<"顺序表已经存在,请先初始化,再输入元素。

"<<endl;return;}elementType x;cout<<"请输入数据元素(整数,-9999退出):"<<endl;cout<<"x=";cin>>x;while(x!=-9999){st++;L.data[st]=x;cout<<"x=";cin>>x;}}//随机数创建顺序表void rndCList(seqList &L){int i;int n,m;st=-1;cout<<"请输入要产生的随机数个数,n=";cin>>n;if(n>MAXLEN-1){cout<<"您要求产生的随机数个数超出了查找表长度"<<MAXLEN-1<<",创建顺序表失败。

"<<endl;return;}cout<<"请输入控制随机数大小参数,比如100以内数,请输入100,m=";cin>>m;srand((unsigned)time(NULL)); //产生随机数种子//srand((unsigned)GetTickCount()); //产生随机数种子for(i=0;i<n;i++) //随机数写入排序表A[]L.data[i]=rand()%m;st=n-1; //表长度为ncout<<endl;}2.2试用顺序表表示较多位数的大整数,以便于这类数据的存储。

请选择合适的存放次序,并分别写出这类大数的比较、加、减、乘、除等运算,并分析算法的时间性能。

【解】顺序表0单元存放操作数的符号,区分操作数是正数还是负数;为方便处理运算时进位和借位,数据的低位存放数组低位,高位存放数组高位。

【时间性能】加减法:O(max(m,n))乘除法:O(m n)2.3试用顺序表表示集合,并确定合适的约定,在此基础上编写算法以实现集合的交、并、差等运算,并分析各算法的时间性能。

【解】//求C=A∩B依次读取A的元素,检查次元素是否在B中,若在B中,则为交集元素,插入C中。

void interSet(seqList A, seqList B, seqList &C){int i;for(i=0;i<A.listLen;i++){if(listLocate(B,A.data[i])!=0) //A.data[i]在B中出现,是交集元素,插入C中listInsert(&C,A.data[i],C.listLen+1);}}//求C=A∪B现将A中元素全部插入C中。

依次读取B中元素,检查是否出现在A中,若不在A中,则为并集元素,插入C中。

void mergeSet(seqList A, seqList B, seqList &C){int i;for(i=0;i<A.listLen;i++) //A中元素全部插入C中{listInsert(&C,A.data[i],C.listLen+1);}for(i=0;i<B.listLen;i++){if(listLocate(A,B.data[i])==0) //B.data[i]不在A中,插入ClistInsert(&C,B.data[i],C.listLen+1);}}//求C=A-B依次读取A中元素,检查是否在B中出现,若不在B中,则为差集元素,插入C中。

void differenceSet(seqList A,seqList B,seqList &C){int i;for(i=0;i<A.listLen;i++){if(listLocate(B,A.data[i])==0)listInsert(&C,A.data[i],C.listLen+1); //A.data[i]不在B中,插入C }}【算法分析】时间复杂度:O( |A| |B| )2.4假设顺序表L中的元素递增有序,设计算法在顺序表中插入元素x,要求插入后仍保持其递增有序特性,并要求时间尽可能少。

【解】如果表空间满,插入失败,返回-1;否则,从L最后一个元素开始,与x比较,若大于x,元素后移,直到L中元素小于或等于x,这个元素的后面的单元即为x的插入位置,插入成功返回插入位置。

//空间满:返回值-1;正确插入:返回表中的插入位置int incInsert(seqList &L,elementType x){int i=L.listLen-1;if(L.listLen==MAXLEN)return -1; //表空间已满,不能插入新的元素else{while(i>=0 && L.data[i]>x){L.data[i+1]=L.data[i];i--;}}L.data[i+1]=x; //插入xL.listLen++; //修改表长度return i+2; //成功插入,返回x在顺序表中的插入位置(元素编号)}【算法分析】时间复杂度:O(n)2.5假设顺序表L中的元素递增有序,设计算法在顺序表中插入元素x,并要求在插入后也没有相同的元素,即若表中存在相同的元素,则不执行插入操作。

【解】与上题相似,只是在移动插入元素之前,检查L中是否已经存在值x,若存在,插入失败,返回-2。

//空间满:返回值-1;x已经存在返回-2;正确插入:返回表中的插入位置int incInsert(seqList &L,elementType x){int i;if(L.listLen==MAXLEN)return -1; //表空间已满,不能插入新的元素else{for(i=0;i<L.listLen;i++)if(L.data[i]==x)return -2; //元素x已经存在,插入失败,返回-2i=L.listLen-1;while(i>=0 && L.data[i]>x) //后移元素{L.data[i+1]=L.data[i];i--;}}L.data[i+1]=x; //插入xL.listLen++; //修改表长度return i+2; //成功插入,返回x在顺序表中的插入位置(元素编号)}2.6设计算法以删除顺序表中重复的元素,并分析算法的时间性能。

【解】【分析】三重循环实现。

第一层循环,从左往右依次取出L元素,用i指示;第二层循环,对i 元素在L中循环查重,用下标j指示;第三重循环,删除重复元素。

查重和删除从j=L.listLen-1开始,效率稍微好一点,因为这样重复元素本身不需重复移动。

如果从i+1开始查重、删除,则j+1以后的重复元素会被移动。

【算法描述】void DeleteRepeatData(seqList & L){int i,j;if(L.listLen==0){cout<<"当前顺序表空!"<<endl;return;}if(L.listLen==1){cout<<"当前顺序表只有一个元素!"<<endl;return;}i=0;while(i<L.listLen-1){for(j=L.listLen-1; j>i; j--) //从后往前删除,效率较高{if(L.data[i]==L.data[j]) //元素重复,调用删除{listDelete(&L,j+1); //调用删除函数,下标差1,所以+1//以下部分代码是直接删除,没有调用删除函数//int k;//for(k=j; k<L.listLen-1; k++)// L.data[k]=L.data[k+1];//L.listLen--;}}i++;}}【算法分析】时间性能:O(n3)2.7假设顺序表L中的元素按从小到大的次序排列,设计算法以删除表中重复的元素, 并要求时间尽可能少。

相关文档
最新文档