线性表练习题(答案)
- 格式:docx
- 大小:2.00 MB
- 文档页数:12
线性表练习题(答案)
第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 )。
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 )
对任何数据结构链式存储结构一定优于顺序存储结构。( 0 )
顺序存储方式只能用于存储线性结构。( 0 )
集合与线性表的区别在于是否按关键字排序。( 0 )
线性表的特点是每个元素都有一个前驱和一个后继。( 0 )
取线性表的第i个元素的时间同i的大小有关.
( 1 )
线性表只能用顺序存储结构实现。( 0 )
顺序存储方式的优点是存储密度大,且插入、删除运算效率高。( 0 )
链表是采用链式存储结构的线性表,进行插入、删除操作时,在链表中比在顺序存储结构中效率高。 ( 1 )
三、填空
线性表L=(a1,a2,…,an)用数组表示,假定删除表中任一元素的概率相同,则删除一个元素平均需要移动元素的个数是___(n-1)/2_____。
在一个长度为n的顺序表中第i个元素(1<=i<=n)之前插入一个元素时,需向后移动____n+1-i____个元素。
在双向链表结构中,若要求在p 指针所指的结点之前插入指针为s 所指的结点,则需执行下列语句:
s->next=p;
s->prior= __p->prior______;
p->prior=s;
___s->prior->next_____=s;
链接存储的特点是利用___指针_____来表示数据元素之间的逻辑关系。
已知指针p指向单链表L中的某结点,则删除其后继结点的语句是:__p->next=p->next->next______
四、算法设计题
若链表类的定义如下所示,请完成以下成员方法的实现。(另附页提交答案)
void Delete(const DataType& x); //删除值为
x的结点
void Convert();//单链表就地逆转
void operator+= (const LinkList &other);//将两个已排序的单链表合并成一个链表(值可重复)
#include
#include
#include
#define DataType int
template class LinkList;
template
class Node {
friend class LinkList;
public:
Node() { next = NULL; }
Node(const DataType& x) {
data = x;
next = NULL;
}
DataType data;
Node* next;
};
template
class LinkList {
public:
LinkList();
int Size();
void Insert(int i,const DataType& x);//在第i位插入值为x的结点
void Insert(DataType *p,const DataType&
x);在指针p的后面插入结点x
void Delete(int i);//删除第i个结点
Node* Find(const DataType&
x);
DataType GetData(int i);
void Print();
void Delete(const DataType& x); //删除值为x的结点
void Convert();//单链表就地逆转
void operator+= (const LinkList
&other);//将两个已排序的单链表合并成一个链表(值可重复)
private:
DataType * Index(i);//返回第i个结点的
地址
Node* head;
int size;
};
void Delete(const DataType& x) //删除值为x的结点
{
Node* p=head, *q;
for( int i=1;i<= Size();i++)
{
if(p->next->data==x)
{
q=p->next;
p->next=q->next;
delete q;
}
}
}
template
void LinkList:: Convert()//单链表就地逆转
{
Node * 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;
}
}
//将两个已排序的单链表合并成一个链表(值可重复)
template
LinkList LinkList::operator +=(const
LinkList& other)
{
int i;
i=other.size;
Node
*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=new Node(q->data);
temp->next=p->next;
p->next=temp;
p=temp;
q=q->next;
}
}
while(q!=NULL)
{
temp=new Node(q->data);
temp->next=NULL;
p->next=temp;
p=temp;
q=q->next;
}
return *this;