数据结构

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

第二章线性表

一、选择题

(1)两个有序线性表分别具有 n 个元素与 m 个元素且n≤m,现将其归并成一个有序表,其最少的比较次数是(A)。

A.n B.m C.n−1 D.m+n

(2)非空的循环单链表 head 的尾结点(由 p 所指向)满足(C )。

A.p->next==NULL B.p==NULL C.p->next==head D.p==head

(3)在带头结点的单链表中查找 x 应选择的程序体是(ABC )。注:C最优

A.node *p=head->next; while (p && p->info!=x) p=p->next;

if (p->info==x)

return p else return NULL;

B.node *p=head; while (p&& p->info!=x) p=p->next; return p;

C.node *p=head->next;

while (p&&p->info!=x) p=p->next; return p;

D.node *p=head; while (p->info!=x) p=p->next ; return p;

(4)线性表若采用链式存储结构时,要求内存中可用存储单元的地址(D )。

A.必须是连续的 B.部分地址必须是连续的

C.一定是不连续的 D.连续不连续都可以

(5)在一个具有 n 个结点的有序单链表中插入一个新结点并保持单链表仍然有序的时间复杂度是(B )。

A.O(1) B.O(n) C.O(n2) D.O(nlog2n)

(6)在一个长度为 n 的顺序表中删除第 i 个元素(1<=i<=n)时,需向前移动(A )个元素。

A.n−i B.n−i+1 C.n−i−1 D.i

(7)若长度为 n 的线性表采用顺序存储结构存储,在第 i 个位置上插入一个新元素的时间复杂度为(A)。

A.O(n) B.O(1) C.O(n2) D.O(n3)

(8)若从键盘输入 n 个元素,则建立一个有序单向链表的时间复杂度为(B)。

A.O(n) B.O(n2) C.O(n3) D.O(n×log2n)

(9)下面哪个术语与数据的存储结构无关(D)。

A.顺序表 B.链表 C.散列表 D.队列

(10)在一个单链表中,若删除 p 所指结点的后续结点,则执行(A)。

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 所指结点不是最后结点,在 p 之后插入 s 所指结点,则执行(B )。

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;

二、设计一个算法,利用单链表原来的结点空间将一个单链表就地转置。

答案:void invent(Lnode *head)

{Lnode *p,*q;

if(!head->next) return ERROR;

p=head->next; q=p->next; p->next =NULL;

while(q)

{p=q; q=q->next; p->next=head->next; head->next=p;}

}

三、设计一个算法,求一个带头结点单链表中的结点个数。

答案:int L(head){

node * head;

int n=0;

node *p;

p=head;

while(p!=NULL)

{ p=p->next;

n++;

}

return(n);

}

四、已知一个顺序表中的各结点值是从小到大有序的,设计一个算法,插入一个值为 x 的结点,使顺序表中的结点仍然是从小到大有序。

答案:

void Insert_sq(Sqlist va[], ElemType x)

{int i, j, n;

n=length(va[]);

if(x>=va[n-1])

va[n]=x;

else

{i=0;

while(x>va[i]) i++;

for(j=n-1;j>=i;j--)

va[j+1]=va[j];

va[i]=x; }

n++;

}

Status Insert_SqList(SqList &va,int x){

if(va.length+1>va.listsize) return ERROR;

va.length++;

for(i=va.length-1;va.elem[i]>x&&i>=0;i--) (6分)

va.elem[i+1]=va.elem[i]; (2分)

va.elem[i+1]=x;(2分)

return OK;

}//Insert_SqList

五、假设递增有序链表A、B分别表示一个集合,设计算法以求解C= A∩B,并分析算法的时间复杂度。

LinkList union(LinkList A,LinkList B)

{ LinkList C, p,q,s,r;

p=A->next;q=B->next;

C=A; r=C;

while (p&&q)

{ if (p->data==q->data)

{ r->next=p; r=p;

p=p->next; q=q->next;

}

else if (p->datadata)

p=p->next;

else q=q->next;

}

r->next= NULL

free(B);

return C;

}

六、假设顺序表L中的元素按从小到大的次序排列,设计算法以删除表中重复的元素, 并要求时间尽可能少。要求:

(1)对顺序表(1,1,2,2,2,3,4,5,5,5,6,6,7,7,8,8,8,9)模拟执行本算法,并统计移动元素的次数。

(2)分析算法的时间性能。

将元素分成两个部分:已经处理元素和待处理元素。已经处理部分返回L中,用下标i指示最后一个元素,初始化i=0。待处理部分用下标j指示第一个元素,初始化j=1.

左边下标小于i的元素已经处理好重复,等于i是当前正在处理的元素,将data[i]与data[j]进行比较,会出现下列情况:

① data[i]==data[j],说明j指示的是i的重复元素,继续处理j的下一个元素,即执行j++。

② data[i]

循环执行上述操作,直到表尾。

修改L的长度为i+1。

void DeleteRepeatData(seqList & L)

{

int i,j; //分别指向已处理部分最后元素和未处理部分第一个元素,皆为数组下标

if(L.listLen<2)

return; //少于2个元素,直接退出

i=0; //初始化i指向第一个元素

相关文档
最新文档