第2章线性表一选择题1.下列程序段的时间复杂度为(C)。for(inti=1;i=n;i++)for(intj=1;j=m;j++)A[i][j]=i*j;A.O(m2)B.O(n2)C.O(m*n)D.(m+n)2.下面关于线性表的叙述中,错误的是哪一个?(B)A.线性表采用顺序存储,必须占用一片连续的存储单元。B.线性表采用顺序存储,便于进行插入和删除操作。C.线性表采用链接存储,不必占用一片连续的存储单元。D.线性表采用链接存储,便于插入和删除操作。3.线性表是具有n个(C)的有限序列(n0)。A.表元素B.字符C.数据元素D.数据项4.若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用(A)存储方式最节省时间。A.顺序表B.双链表C.带头结点的双循环链表D.单循环链表5.某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用(D)存储方式最节省运算时间。A.单链表B.仅有头指针的单循环链表C.双链表D.仅有尾指针的单循环链表6.设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用(D)最节省时间。A.单链表B.单循环链表C.带尾指针的单循环链表D.带头结点的双循环链表7.若某表最常用的操作是在最后一个结点之后插入一个结点或删除最后一个结点。则采用(D)存储方式最节省运算时间。A.单链表B.双链表C.单循环链表D.带头结点的双循环链表8.链表不具有的特点是(B)A.插入、删除不需要移动元素B.可随机访问任一元素C.不必事先估计存储空间D.所需空间与线性长度成正比9.下面的叙述不正确的是(B,C)A.线性表在链式存储时,查找第i个元素的时间同i的值成正比B.线性表在链式存储时,查找第i个元素的时间同i的值无关C.线性表在顺序存储时,查找第i个元素的时间同i的值成正比D.线性表在顺序存储时,查找第i个元素的时间同i的值无关10.若长度为n的线性表采用顺序存储结构,在其第i个位置插入一个新元素的算法的时间复杂度为(C)(1=i=n+1)。A.O(0)B.O(1)C.O(n)D.O(n2)11.对于顺序存储的线性表,访问结点和增加、删除结点的时间复杂度为(C)。A.O(n)O(n)B.O(n)O(1)C.O(1)O(n)D.O(1)O(1)12.线性表(a1,a2,…,an)以链接方式存储时,访问第i位置元素的时间复杂性为(C)A.O(i)B.O(1)C.O(n)D.O(i-1)13.循环链表H的尾结点P的特点是(A)。A.P-next=HB.P-next=H-nextC.P=HD.P=H-next14.完成在双循环链表结点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;15.设指针q指向单链表中结点A,指针p指向单链表中结点A的后继结点B,指针s指向被插入的结点X,则在结点A和结点B插入结点X的操作序列为(B)。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;二、判断1.顺序存储结构的主要缺点是不利于插入或删除操作。(1)2.线性表采用链表存储时,结点和结点内部的存储空间可以是不连续的。(1)3.对任何数据结构链式存储结构一定优于顺序存储结构。(0)4.顺序存储方式只能用于存储线性结构。(0)5.集合与线性表的区别在于是否按关键字排序。(0)6.线性表的特点是每个元素都有一个前驱和一个后继。(0)7.取线性表的第i个元素的时间同i的大小有关.(1)8.线性表只能用顺序存储结构实现。(0)9.顺序存储方式的优点是存储密度大,且插入、删除运算效率高。(0)10.链表是采用链式存储结构的线性表,进行插入、删除操作时,在链表中比在顺序存储结构中效率高。(1)三、填空1.线性表L=(a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是___(n-1)/2_____。2.在一个长度为n的顺序表中第i个元素(1=i=n)之前插入一个元素时,需向后移动____n+1-i____个元素。3.在双向链表结构中,若要求在p指针所指的结点之前插入指针为s所指的结点,则需执行下列语句:s-next=p;s-prior=__p-prior______;p-prior=s;___s-prior-next_____=s;4.链接存储的特点是利用___指针_____来表示数据元素之间的逻辑关系。5.已知指针p指向单链表L中的某结点,则删除其后继结点的语句是:__p-next=p-next-next______四、算法设计题若链表类的定义如下所示,请完成以下成员方法的实现。(另附页提交答案)1.voidDelete(constDataType&x);//删除值为x的结点2.voidConvert();//单链表就地逆转3.voidoperator+=(constLinkList&other);//将两个已排序的单链表合并成一个链表(值可重复)#includeiostream.h#includeconio.h#includestdlib.h#defineDataTypeinttemplateclassDataTypeclassLinkList;templateclassDataTypeclassNode{friendclassLinkListDataType;public:Node(){next=NULL;}Node(constDataType&x){data=x;next=NULL;}DataTypedata;Node*next;};templateclassDataTypeclassLinkList{public:LinkList();intSize();voidInsert(inti,constDataType&x);//在第i位插入值为x的结点voidInsert(DataType*p,constDataType&x);在指针p的后面插入结点xvoidDelete(inti);//删除第i个结点NodeDataType*Find(constDataType&x);DataTypeGetData(inti);voidPrint();voidDelete(constDataType&x);//删除值为x的结点voidConvert();//单链表就地逆转voidoperator+=(constLinkList&other);//将两个已排序的单链表合并成一个链表(值可重复)private:DataType*Index(i);//返回第i个结点的地址NodeDataType*head;intsize;};voidDelete(constDataType&x)//删除值为x的结点{NodeDataType*p=head,*q;for(inti=1;i=Size();i++){if(p-next-data==x){q=p-next;p-next=q-next;deleteq;}}}templateclassTvoidLinkListT::Convert()//单链表就地逆转{NodeT*p=NULL,*q1=head-next,*q2;if(Size()1){while(q1!=NULL){q2=q1-next;q1-next=p;p=q1;q1=q2;}head-next=p;}}//将两个已排序的单链表合并成一个链表(值可重复)templateclassTLinkListTLinkListT::operator+=(constLinkListT&other){inti;i=other.size;NodeT*p=this-head,*q=other.head-next,*temp;while(p-next!=NULL&&q!=NULL){if(p-next-data=q-data)p=p-next;else{temp=newNodeT(q-data);temp-next=p-next;p-next=temp;p=temp;q=q-next;}}while(q!=NULL){temp=newNodeT(q-data);temp-next=NULL;p-next=temp;p=temp;q=q-next;}return*this;}