《数据结构》习题集第2章线性表(第1次更新2012-3)

《数据结构》习题集第2章线性表(第1次更新2012-3)
《数据结构》习题集第2章线性表(第1次更新2012-3)

第2章线性表

选择题

表长为N 的顺序表,当在任何位置上插入或删除一个元素的概率相等时,插入一个元素所需移动元素的平均次数为( e ),删除一个元素需要移动的元素个数为(a )。【**,★】A. (N-1)/2 B. N C. N+1 D. N-1 E. N/2 F. (N+1)/2 G. (N-2)/2

线性表是具有N 个()的有限序列。【*】

A、表元素

B、字符

C、数据元素

D、数据项

E、信息

“线性表的逻辑顺序和物理顺序总是一致的。”这个结论是()。【*】

A、正确的

B、错误的

C、不一定,与具体结构有关。

线性表采用链式存储结构时,要求内存中可用存储单元的地址()。【*,★】

A、必须是连续的

B、部分地址必须是连续的

C、一定是不连续的

D、连续或不连续都可以。

带头结点的单链表为空的判定条件是()。【*】

A、head==NULL

B、head->next==NULL

C、head->next==head

D、head!=NULL

不带头结点的单链表head 为空的判定条件是()。【*】

A、head==NULL

B、head->next==NULL

C、head->next==head

D、head!=NULL

非空的循环单链表head 的尾结点P 满足()。【*】

A、P->NEXT=NULL

B、p=NULL

C、p->next==head

D、p==head

在一个具有n 个结点的有序单链表中插入一个新结点并仍然有序的时间复杂度是()。【*,★】

A、O(1)

B、O(n)

C、O(n2)

D、O(nlog2n)

在一个单链表中,若删除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;

在一个单链表中,若在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;

在一个单链表中,已知q 是p 的前趋结点,若q 和p 之间插入结点s,则执行()。【*】A、s->next=p->next;p->next=s; B、p->next=s->next;s->next=p;

C、q->next=s;s->next=p;

D、p->next=s;s->next=q;

假设双链表结点的类型如下:【**,★】

typedef struct linknode{

int data; //数据域

struct linknode *llink; //指向前趋结点的指针域

struct linknode *rlink; //指向后继结点的指针域

}bnode;

现将一个q 所指新结点作为非空双向链表中的p 所指结点的前趋结点插入到该双链表中,能正确完成此要求的语句段是()。

A、q->rlink=p;q->llink=p->llink;p->llink=q;p->llink->rlink=q;

B、p->llink=q;q->rlink=p;p->llink->rlink=q;q->llink=p->llink

C、q->llink=p->rlink;q->rlink=p;p->llink->rlink=q;p->llink=q;

D、以上都不对

如上题结点结构,如在此非空循环双向链表的结点p 之后插入结点s 的操作序列是()。(多项选择)【**】

A、p->rlink=s;s->llink=p;p->rlink->llink=s;s->rlink=p->rlink;

B、p->rlink=s;p->rlink->llink=s;s->llink=p;s->rlink=p->rlink;

C、s->llink=p;s->rlink=p->rlink;p->rlink=s;p->rlink->llink=s;

D、s->llink=p;s->rlink=p->rlink;p->rlink->llink=s;p->rlink=s;

在一个长度为n 的单链表上,设有头和尾两个指针,执行()操作与链表的长度有关。【**,★】

A、删除单链表中的第一个元素

B、删除单链表中最后一个元素

C、在单链表第一个元素前插入一个新元素

D、在单链表最后一个元素后插入一个新元素

线性结构中的一个结点代表一个()【*】

A、数据元素

B、数据项

C、数据

D、数据结构

非空线性表L=(a1,a2,…,ai,…,an),下列说法正确的是()【*】

A、每个元素都有一个直接前驱和直接后继

B、线性表中至少要有一个元素

C、表中诸元素的排列顺序必须是由小到大或由大到小的

D、除第一个元素和最后一个元素外其余每个元素都有一个且仅有一个直接前驱和直接后继顺序表是线性表的()【**,★】

A、链式存储结构

B、顺序存储结构

C、索引存储结构

D、散列存储结构

对于顺序表,以下说法错误的是()【*,★】

A、顺序表是用一维数组实现的线性表,数组的下标可以看成是元素的绝对地址

B、顺序表的所有存储结点按相应数据元素间的逻辑关系决定的次序依次排列

C、顺序表的特点是:逻辑结构中相邻的结点在存储结构中仍相邻

D、顺序表的特点是:逻辑上相邻的元素,存储在物理位置也相邻的单元中

对顺序表上的插入、删除算法的时间复杂性分析来说,通常以()为标准操作。【*】A、插入操作B、结点移动C、算术表达式D、删除操作

对于顺序表的优缺点,以下说法错误的是()【*】

A、无需为表示结点间的逻辑关系而增加额外的存储空间

B、可以方便地随机存取表中的任一结点

C、插入和删除运算较方便

D、由于顺序表要求占用连续的空间,存储分配只能预先进行(静态分配)

若某线性表中最常用的操作是取第i 个元素和找第i 个元素的前趋元素,则采用()存储方式最节省时间。【*】

A、顺序表

B、单链表

C、双链表

D、单循环链表

循环链表主要优点是()【*】

A、不再需要头指针了

B、已知某个结点的位置后,能够容易找到它的直接前趋

C、在进行插入、删除运算时,能更好地保证链表不断开

D、从表中任一结点出发都能扫描到整个链表

在线性表的下列存储结构中,读取元素花费时间最少的是()【*,★】A、单链表B、双链表C、循环链表D、顺序表

填空题

在线性结构中,第一个结点(没有)前趋结点,其余每个结点有且只有(一个)个前趋结点。【*】

在顺序表中插入或删除一个元素,需要平均移动(表中一半的)元素,具体移动的元素个数与(表长)有关。【*】

已知L是无表头结点的单链表,试从下列提供的答案中选择合适的语句序列,分别实现:【**,★】

(1)表首插入S结点的语句序列是(FC)。

(2)表尾插入S结点的语句序列是( B.I.A.G)。

A、P->next=S;

B、P=L;

C、L=S;

D、P->next=S->next;

E、S->next=P->next;

F、S->next=L;

G、S->next=NULL;

H、while(P->next!=Q)p=p->next;

I、while(P->next!=NULL)P=P->next;

已知L 是带表头结点的非空单链表,试从下列提供的答案中选择合适的语句序列。【**,★】

(1)删除首元结点的语句序列是(H,G,B,I ),

(2)删除尾元结点的语句序列是(H,F,D,B,J)

A、P=P->next;

B、P->next=P->next->next;

C、while(P!=NULL) P=P->next;

D、while(Q->next!=NULL){P=Q;Q=Q->next;}

E、while(P->next!=Q) P=P->next;

F、Q=P;

G、Q=P->next;

H、P=L;

I、L=L->next;

J、free(Q);

已知L 是带表头结点的非空单链表,且P 结点既不是首元结点,也不是尾元结点,试从下列提供的答案中选择合适的语句序列。【**】

(1)删除P 结点的直接后继结点的语句序列是(F,A,I ),

(2)删除P 结点的直接前趋结点的语句序列是(E,G,D,F,A,I )

A、P->next=P->next->next;

B、P=P->Pnext->next;

C、while(P->next!=Q)P=P->next;

D、while(P->next->next!=Q)P=P->next;

E、Q=P;

F、Q=P->next;

G、P=L;

H、L=L->next;

I、free(Q);

已知结点编号,在各结点查找概率相等的情况下,从n 个结点的单链表中查找一个结点,平均要访问(N/2 )个结点,从n 个结点的双链表中查找一个结点,平均要访问(N/4 )个结点。【**,?】

对于一个具有n 个结点的单链表,在已知p 所指结点后插入一个新结点的时间复杂度是(O(1) );在值域为给定值的结点后插入一个新结点的时间复杂度是(O(n) )。【*,★】

单链表是(线性表)的链接存储表示。【*】

单链表中设置头结点的作用是(插入和删除元素时不必进行特殊处理)。【**】

在单链表中,除首元结点外,任一结点的存储位置由(其前驱结点的链域)指示。【*】

在非空双向循环链表中,在结点q 的前面插入结点p 的过程如下:【*】

p->prior=q->prior;

q->prior->next=p;

p->next=q;

(q->prior=p; );

在双向链表中,每个结点有两个指针域,一个指向(前驱结点),另一个指向(后继结点)。【*】

顺序表中逻辑上相邻的元素的物理位置(必定)相邻。单链表中逻辑上相邻的元素的物理位置(不一定)相邻。【*】

为了便于讨论,有时将含n(n≥0)个结点的线性结构表示成(a1,a2,…,an),其中每个ai 代表一个___结点___。a1 称为_第一个____结点,an 称为__最后____结点,i 称为ai 在线性表中的_____位置___。对任意一对相邻结点ai、ai┼1(1≤i

线性结构的基本特征是:若至少含有一个结点,则除起始结点没有直接__前驱____外,其他结点有且仅有一个直接___前驱___;除终端结点没有直接___后继___外,其它结点有且仅有一个直接__后继____.【*】

所有结点按1对1的邻接关系构成的整体就是___线性___结构。【*】

线性表的逻辑结构是__线性____结构。其所含结点的个数称为线性表的____长度______。【*】在单链表中,指针p 所指结点为最后一个结点的条件是_____p->next=NULL;______。【*】

判断题

1. 顺序存储的线性表可以随机存取。【*】对

2. 顺序存储的线性表的插入和删除操作不需要付出很大的代价,因为平均每次操作只有近一半的元素需要移动。【*】错

3. 线性表中的元素可以是各种各样的,但同一线性表中的数据元素具有相同的特性,因此是属于同一数据对象。【*】对

4. 在线性表的顺序存储结构中,逻辑上相邻的两个元素在物理位置上不一定相邻。【*】错

5. 在线性表的链式存储结构中,逻辑上相邻的元素在物理位置上不一定相邻。【*】对

6. 在单链表中,可以从头结点进行查找任何一个元素。【*】对

7. 线性表的链式存储结构优于顺序存储结构。【*】错

8. 在线性表的顺序存储结构中,插入和删除元素时,移动元素的个数与该元素的位置有关。【*】对

9. 在单链表中,要取得某个元素,只要知道该元素的指针即可,因此,单链表是随机存取的存储结构。【*】错

10. 顺序存储方式只能用于存储线性结构。【**, ★】错

简答题

若较频繁地对一个线性表进行插入和删除操作,该线性表宜采用哪种存储结构?为什么?【*】采用链式存储结构,因为其复杂度为O(1);

描述概念:头指针、头结点、首元结点的区别?【**,★】

设 A 是一个线性表(a1a2…an),采用顺序存储结构,则在等概率的前提下,平均每插入一个元素需要移动的元素个数为多少?若元素插在ai 与ai+1 之间(0<=I<=n-1)的概率为2(n-i)/(n(n+1)),则平均每插入一个元素所要移动的元素个数又是多少?【**,★】

为什么在单循环链表中设置尾指针比设置头指针更好?【***,★】

双链表和单循环链表中,若仅知道指针p 指向某个结点,不知道头指针,能否将结点*p 从相应的链表中删除?若可以,其时间复杂度各为多少?【**】

下列算法的功能是什么?【**,★】

LinkedList test1(LinkedList L)

{

//L 是无头结点的单链表

ListNode *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;

}

如果有n 个线性表同时共存,并且在处理过程中各表的长度会发生动态变化,线性表的总长度也会自动地改变。在此情况下,应选择哪一种存储结构。为什么?【**】

若线性表的总数基本稳定,且很少进行插入删除操作,但要求以最快的方式存取线性表的元素,应该用哪种存储结构。为什么?【*】

设有多项式a(x)=9+8x+9x4+5x10

b(x)=-2x+22x7-5x10

(1)用单链表给出a(x)、b(x)的存储表示;

(2)设c (x)=a(x)+b(x),求得c(x)并用单链表给出其存储表示。【*,★】

设计题

编写一个函数将一个顺序表A(有多个元素且任何元素不为0)分拆成两个顺序表,使A 中大于0的元素存放在B 中,小于0 的元素存放在C 中。【**】

设顺序表L 中的数据元素递增有序。试写一算法,将e插入到顺序表的适当位置,插入后保持该表的有序性。【**】

A、B 为元素递增有序排列的单链表(同一表中可能有相同元素),编写算法另建一单链表C,保存两个表的公共元素,要求C 的元素值各不相同且递增有序。【**】

4、设有一个由正整数组成的无序单链表,编写算法实现下列功能:【**】

(1)找出最小值结点,且显示该数值。

(2)若该数值为奇数,则将其与直接后继结点的数值交换。

(3)若为偶数,则将其直接后继结点删除。

编程附加题

试分别用顺序表和单链表作为存储结构,实现将线性表(a0,a1,a2,….an-1)就地逆置的操作,所谓“就地”指辅助空间为O(1)。【***,★】

设单链表L 是一个非递减有序表,试写一个算法将x 插入其中后仍保持L 的有序性。【**】

设A、B 是两个线性表,其表中元素递增有序,长度分别为m 和n。试写一算法分别以顺序存储和链式存储将A 和B 归并成一个仍按元素值递增有序的线性表C,请分析算法的时间复杂度。【***,★】

单链表L 是一个递减有序表,试写一高效算法,删除表中值大于mink 且小于maxk 的结点(若表中有这样的结点),同时释放被删结点空间,这里mink 和maxk 是两个给定的参数, 它们可以和表中元素相同,也可以不同。【**】

假设以两个元素依值递增有序排列的线性表A,B 分别表示两个集合,先要求另辟空间构造一个线性表C,其元素为两集合的交集,且表C 中的元素也依值递增有序排列。是对顺序表编写求C 的算法。【**】

假设在长度大于1 的单循环链表中,既无头结点也无头指针。S 为指向链表中某个结点的指针,试编写算法删除结点*s 的直接前驱结点。【**】

计算带头结点的单循环链表的结点个数。【*】

《数据结构》第二章习题参考答案 殷人昆版

《数据结构》第二章习题参考答案 一、判断题(在正确说法的题后括号中打“√”,错误说法的题后括号中打“×”) 1、顺序存储方式插入和删除时效率太低,因此它不如链式存储方式好。( × ) 2、链表中的头结点仅起到标识的作用。( × ) 3、所谓静态链表就是一直不发生变化的链表。( × ) 4、线性表的特点是每个元素都有一个前驱和一个后继。( × ) 5、在顺序表中,逻辑上相邻的元素在物理位置上不一定相邻。(×) 6、线性表就是顺序存储的表。(×) 7、课本P84 2.4题 (1)√(2)×(3)×(4)×(5)√(6)×(7)×(8)√ (9)×(10)×(11)√(12)√ 二、单项选择题 1、下面关于线性表的叙述中,错误的是哪一个?( B ) A.线性表采用顺序存储,必须占用一片连续的存储单元。 B.线性表采用顺序存储,便于进行插入和删除操作。 C.线性表采用链接存储,不必占用一片连续的存储单元。 D.线性表采用链接存储,便于插入和删除操作。 2、链表不具有的特点是( B ) A.插入、删除不需要移动元素B.可随机访问任一元素 C.不必事先估计存储空间D.所需空间与线性长度成正比 3、(1) 静态链表既有顺序存储的优点,又有动态链表的优点。所以,它存取表中第i个元素的时间与i无关。 (2) 静态链表中能容纳的元素个数的最大数在表定义时就确定了,以后不能增加。 (3) 静态链表与动态链表在元素的插入、删除上类似,不需做元素的移动。 以上错误的是( B ) A.(1),(2)B.(1)C.(1),(2),(3) D.(2) 4、在单链表指针为p的结点之后插入指针为s的结点,正确的操作是(B)A.p->link =s; s-> link =p-> link; B.s-> link =p-> link; p-> link =s; C.p-> link =s; p-> link =s-> link; D.p-> link =s-> link; p-> link =s; 5、若某线性表最常用的操作是取任一指定序号的元素及其前驱,则利用(C)存储方式最节省时间。 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、在一个以 h 为头的单循环链中,p 指针指向链尾的条件是( A ) A. p->next=h B. p->next=NULL C. p->next->next=h D. p->data=-1 三、填空题

数据结构线性表实验报告

序号 数据结构实验报告 班级姓名同组者/ 成绩 日期 3.9指导教师 实验名称实验一线性表及其应用 一、实验目的 1、深刻理解线性表的逻辑特性及其顺序、链式存储方式的特点。 2、熟练掌握线性表的常用操作(建立、插入、删除、遍历等)在顺序、链式存储上的实现。 3、加深对C/C++等编程语言的相关知识点的理解(如结构体、指针、函数、引用参数等)。 二、实验内容 1、根据给定的整型数组,以尾插法建立一个单链表,并实现以下操作: ①查找:输入一个欲查找的整数,找到则显示第一个相匹配的整数在单链表中所处的位置,若不存在,则显示提示信息。 ②删除:输入一个欲删除的整数e ,若存在则在单链表中删除第一个值为 e 的元素。 ③插入:输入一个欲插入位置i 和欲插入元素e,将e 插入到第i 个整数之前(注意i 的合法性)。 A、算法思想 ①创建 head 为头结点指针,初始时head->next 为NULL ;tail 始终指向当前链表的最后一个元素,其初始时指向头结点;p 始终指向每次申请的新结点,修改p->data 为当前读入的整数;修改tail->next 为p ,修改tail 为p ;最后修改tail->next 为NULL ,。 ②插入 找到插入点的前驱(即第i-1 个结点)的指针p ;s 指向新申请的结点;修改s->data 为参数e,修改s->next 为p->next ,修改p->next 为s 。 ③查找 ……利用p进行遍历,直到节点的数据和所给的数据相同,输出节点的位置 ④删除 ……利用p进行遍历,并总是将p的前一节点的指针赋给pre,一旦找到,则删除节点并

退出循环,没有到话,反馈相关信息 B、算法源码 /* *线性表及其应用 */ #include using namespace std; typedef struct _LinkList { int elem; struct _LinkList* next; }LinkList; void InitList(LinkList *&link );//构造一个含有头结点的链表 bool InsertList(LinkList *&link,int i,int e);//在第i个位置之前插入包含元素e的新节点void GetTailPointer(LinkList *link,LinkList *&tail);//获得单链表尾结点指针 void AddList(LinkList *&link,int e);//根据将e以尾插法插入链表 void DisplayList(LinkList *link);//打印静态链表中的所有数据 void LocatedList(LinkList *link,int e);//查找e的位置 void DeleteList(LinkList *&link,int e);//删除所在节点 void MergeList(LinkList *linka,LinkList *linkb,LinkList *&linkc);//归并 void InitList(LinkList *&link )//构造一个含有头结点的链表 { LinkList *L,*head; head = (LinkList *)malloc(sizeof(LinkList)); head -> next = NULL; L = head; link = L; } void AddList(LinkList *&link,int e)//根据将e以尾插法插入链表 { LinkList *p =NULL; p =(LinkList *)malloc(sizeof(LinkList)); p -> elem = e; p->next = NULL; LinkList *tail = link;

数据结构第二章课后习题题解

2.4已知顺序表L递增有序,试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。 解: int InsList(SeqList *L,int X) { int i=0,k; if(L->last>=MAXSIZE-1) { printf("表已满无法插入!"); return(ERROR); } while(i<=L->last&&L->elem[i]last;k>=I;k--) L->elem[k+1]=L->elem[k]; L->elem[i]=X; L->last++; return(OK); } 2.5写一算法,从顺序表中删除自第i个元素开始的k个元素。 解: int LDel(Seqlist *L,int i,int k) { if(i=1||(i+k>L->last+1)) { printf("输入的i,k值不合法"); return(ERROR); } else if(i+k==L->last+2) { L->last=i-2; return OK; } else { j=i+k-1; while(j<=L->last) { elem[j-k]=elem[j]; j++; } L->last=L->last-k+1; return OK;

} } 2.6已知线性表中的元素(整数)以递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个变量,他们的值为任意的整数)。 解: int Delete(Linklist,int mink,int maxk) { Node *p,*q; p=L; while(p->next!=NULL) p=p->next; if(mink>=maxk||L->next->data>=maxk||mink+1=maxk) { printf("参数不合法!"); return ERROR; } else { while(p->next->data<=mink) p=p->next; q=p->next; while(q->datanext=q->next; free(q); q=p->next; } return OK; } } 2.7试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的储存空间将线性表(a1,a1,…,an)逆置为(an,an-1,…,a1)。 (1)以顺序表作存储结构。 解: int ReversePosition(SpList L) { int k,temp,len; int j=0; k=L->last; len=L->last+1; for(j;j

数据结构_实验1_线性表的基本操作

实验1 线性表的基本操作 一、需求分析 目的: 掌握线性表运算与存储概念,并对线性表进行基本操作。 1.初始化线性表; 2.向链表中特定位置插入数据; 3.删除链表中特定的数据; 4.查找链表中的容; 5.销毁单链表释放空间; 二、概要设计 ●基础题 主要函数: 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 实验步骤: 1,初始化顺序表 2,调用插入函数 3,在顺序表中查找指定的元素 4,在顺序表中删除指定的元素 5,在顺序表中删除指定位置的元素 6,遍历并输出顺序表 ●提高题

要求以较高的效率实现删除线性表中元素值在x到y(x和y自定义)之间的所有元素 方法: 按顺序取出元素并与x、y比较,若小于x且大于y,则存进新表中。 编程实现将两个有序的线性表进行合并,要求同样的数据元素只出现一次。 方法: 分别按顺序取出L1,L2的元素并进行比较,若相等则将L1元素放进L中,否则将L 1,L2元素按顺序放进L。 本程序主要包含7个函数 主函数main() 初始化线性表InitList(List* L,int ms) 向顺序表指定位置插入元素InsertList(List* L,int item,int rc)删除指定元素值的顺序表记录DeleteList1(List* L,int item) 删除指定位置的顺序表记录 DeleteList2(List* L,int rc) 查找顺序表中的元素 FindList(List L,int item) 输出顺序表元素OutputList(List L) 提高题的程序 void Combine(List* L1,List* L2,List* L) void DeleteList3(List* L,int x,int y) 二、详细设计 初始化线性表InitList(List* L,int ms) void InitList(List* L,int ms) { L->list=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); L->size=0; L->MAXSIZE=LIST_INIT_SIZE;

(完整版)数据结构课后习题及解析第二章

第二章习题 1.描述以下三个概念的区别:头指针,头结点,首元素结点。 2.填空: (1)在顺序表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与有关。 (2)在顺序表中,逻辑上相邻的元素,其物理位置相邻。在单链表中,逻辑上相邻的元素,其物理位置相邻。 (3)在带头结点的非空单链表中,头结点的存储位置由指示,首元素结点的存储位置由指示,除首元素结点外,其它任一元素结点的存储位置由指示。3.已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。按要求从下列语句中选择合适的语句序列。 a. 在P结点后插入S结点的语句序列是:。 b. 在P结点前插入S结点的语句序列是:。 c. 在表首插入S结点的语句序列是:。 d. 在表尾插入S结点的语句序列是:。 供选择的语句有: (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(1:arrsize)的前elenum个分量中且递增有序。试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。 5.写一算法,从顺序表中删除自第i个元素开始的k个元素。 6.已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。 7.试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2..., an)逆置为(an, an-1,..., a1)。 (1)以一维数组作存储结构,设线性表存于a(1:arrsize)的前elenum个分量中。 (2)以单链表作存储结构。 8.假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表(即A 表和B表的)结点空间存放表C。

数据结构实验一题目一线性表实验报告

北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 2.1 存储结构 带头结点的单链表

2.2 关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中b、代码实现: Linklist::Linklist(int a[],int n)//头插法 {front=new Node; front->next=NULL; for(int i=n-1;i>=0;i--) {Node*s=new Node; s->data=a[i]; s->next=front->next; front->next=s; } } 2、尾插法

a、伪代码实现:a.在堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)//尾插法 {front=new Node; Node*r=front; for(int i=0;idata=a[i]; r->next=s; r=s; } r->next=NULL; } 时间复杂度:O(n) 3、按位查找 a、伪代码实现: 初始化工作指针p和计数器j,p指向第一个结点,j=1 循环以下操作,直到p为空或者j等于1 b1:p指向下一个结点 b2:j加1 若p为空,说明第i个元素不存在,抛出异常 否则,说明p指向的元素就是所查找的元素,返回元素地址 b、代码实现 Node* Linklist::Get(int i)//得到指向第i个数的指针 {Node*p=front->next; int j=1; while(p&&j!=i)//p非空且j不等于i,指针后移 {p=p->next; j++;

《数据结构》实验一 线性表及其应用

实验一线性表及其应用 一、实验目的 1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。 2.掌握线性表的顺序存储结构的定义及C语言实现。 3.掌握线性表的链式存储结构——单链表的定义及C语言实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、实现提示 1.由于C语言的数组类型也有随机存取的特点,一维数组的机内表示就是顺序结构。因此,可用C语言的一维数组实现线性表的顺序存储。 在此,我们利用C语言的结构体类型定义顺序表: #define MAXSIZE 1024 typedef int elemtype; /* 线性表中存放整型元素*/ typedef struct { elemtype vec[MAXSIZE]; int len; /* 顺序表的长度*/ }sequenlist; 将此结构定义放在一个头文件sqlist.h里,可避免在后面的参考程序中代码重复书写,另外在该头文件里给出顺序表的建立及常量的定义。 2. 注意如何取到第i个元素,在插入过程中注意溢出情况以及数组的下标与位序(顺序表中元素的次序)的区别。 3.单链表的结点结构除数据域外,还含有一个指针域。用C语言描述结点结构如下: typedef int elemtype; typedef struct node

(完整版)数据结构第二章线性表1答案

(A )需经常修改L 中的结点值 (E )需不断对L 进行删除插入 第二部分线性表 、选择题 1 ?关于顺序存储的叙述中,哪一条是不正确的 (B ) A. 存储密度大 B. 逻辑上相邻的结点物理上不必邻接 C. 可以通过计算直接确定第 i 个结点的位置 D. 插入、删除操作不方便 2.长度为n 的单链表连接在长度为 m 的单链表后的算法的时间复杂度为 (C ) A 0( n ) B 0(1) C 0(m ) D 0(m+n ) 3 .在n 个结点的顺序表中,算法的时间复杂度是 0(1)的操作是:(A ) A 访问第i 个结点(1<=i<=n )和求第i 个结点的直接前趋(2<=i<=n ) B 在第i 个结点(1<=i<=n )后插入一个新结点 C 删除第i 个结点(1<=i<=n ) D 将n 个结点从小到大排序 4.一个向量第一个兀素的存储地址是 100 ,每个兀素的长度为 2 ,则第5 个兀素的地址是 (B ) ( A ) 110 ( B ) 108 (C ) 100 ( D ) 120 5 .已知一个顺序存储的线性表, 设每个结点需要占 m 个存储单元,若第一个结点的地址为 da , 则第i 个结点的地址为:(A ) 7 .链表是一种采用( B )存储结构存储的线性表。 (A )顺序 (B )链式 (C )星式 (D )网状 8 .线性表若采用链式存储结构时,要求内存中可用存储单兀的地址: (D ) (A )必须是连续的 (B )部分地址必须是连续的 (C )一定是不连续的 (D )连续或不连续都可以 9 .线性表L 在_ ( B )情况下适用于使用链式结构实现。 A ) da+(i-1)*m B ) da+i*m 6.在具有n 个结点的单链表中,实现( A )遍历链表和求链表的第 i 个结点 C )删除开始结点 C ) da-i*m D ) da+(i+1)*m A )的操作,其算法的时间复杂度为 0(n )。 B )在地址为p 的结点之后插入一个结点 D ) 删除地址为p 的结点的后继结点

数据结构实验一题目一线性表实验报告

数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 存储结构 带头结点的单链表

关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中 b、代码实现: Linklist::Linklist(int a[],int n)

堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)取链表长度函数 a、伪代码实现:判断该链表是否为空链表,如果是,输出长度0 如果不是空链表,新建立一个temp指针,初始化整形数n为0 将temp指针指向头结点 判断temp指针指向的结点的next域是否为空,如果不是,n加一,否 则return n 使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next 域为0,返回n b 、代码实现 void Linklist::Getlength()Linklist(); cout<

数据结构线性表的应用实验报告

实验报告 课程名称____数据结构上机实验__________ 实验项目______线性表的应用____________实验仪器________PC机___________________ 系别_____电子信息与通信学院___ 专业________ ___ 班级/学号______ __ 学生姓名______ ___________ 实验日期_______________________ 成绩_______________________ 指导教师_______________________

实验一.线性表的应用 1.实验目的:掌握线性链表的存储、运算及应用。利用链 表实现一元多项式计算。 2.实验内容: 1)编写函数,实现用链表结构建立多项式; 2)编写函数,实现多项式的加法运算; 3)编写函数,实现多项式的显示; 4)测试:编写主函数,它定义并建立两个多项式,显示 两个多项式,然后将它们相加并显示结果。变换测试用的多项式,检查程序的执行结果。 选做内容:修改程序,选择实现以下功能: 5)多项式求值:编写一个函数,根据给定的x值计算并 返回多项式f(x)的值。测试该函数(从终端输入一个x的值,调用该函数并显示返回结果)。 6)多项式相减:编写一个函数,求两个多项式相减的多 项式。 7)多项式相乘:编写一个函数,求两个多项式的乘积多 项式。 3.算法说明: 1)多项式的建立、显示和相加算法见讲义。可修改显示 函数,使输出的多项式更符合表达规范。

2)多项式减法:同次项的系数相减(缺项的系数是0)。 例如a(x)=-5x2+2x+3,b(x)= -4x3+3x,则a(x)-b(x) =4x3-5x2-x+3。提示:a(x)-b(x) = a(x)+(-b(x))。 3)多项式乘法:两个多项式的相乘是“系数相乘,指数 相加”。算法思想是用一个多项式中的各项分别与另 一个多项式相乘,形成多个多项式,再将它们累加在 一起。例如,a(x)=-5x2+2x+3,b(x)=-4x3+3x,则 a(x)*b(x) = (-4x3)*(-5x2+2x+3)+(3x)*(-5x2+2x+3) = (20x5-8x4-12x3) + (-15x3+6x2+9x) = 20x5-8x4-27x3+6x2+9x。 4.实验步骤: 根据实验报告的要求,我对文件夹里的C文件进行了丰 富和修改,步骤如下: 链表结构建立多项式: typedef struct polynode { float coef; //系数 int exp; //指数 struct polynode *next; //下一结点指针 } PNode; 编写函数,实现多项式的加法运算; PNode * PolyAdd (PNode *f1, PNode *f2) //实现加法功能。

数据结构实验线性表基本操作

学 《数据结构》课程 实验报告 实验名称:线性表基本操作的实现实验室(中心): 学生信息: 专业班级: 指导教师: 实验完成时间: 2016

实验一线性表基本操作的实现 一、实验目的 1.熟悉C语言的上机环境,进一步掌握C语言的结构特点。 2.掌握线性表的顺序存储结构的定义及C语言实现。 3.掌握线性表的链式存储结构——单链表的定义及C语言实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容及要求 1.顺序线性表的建立、插入、删除及合并。 2.链式线性表的建立、插入、删除及连接。 三、实验设备及软件 计算机、Microsoft Visual C++ 6.0软件 四、设计方案(算法设计) ㈠采用的数据结构 本程序顺序表的数据逻辑结构为线性结构,存储结构为顺序存储;链表的数据逻辑结构依然为线性结构,存储结构为链式结构。 ㈡设计的主要思路 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度,顺序表的长度和元素由用户输入; 2.利用前面建立的顺序表,对顺序表进行插入、删除及合并操作; 3.建立一个带头结点的单链表,结点的值域为整型数据,链表的元素由用户输入;

4.对前面建立的链表进行插入、删除及连个链表的连接操作; ㈢算法描述 1、顺序表 void Init(sqlist &);//初始化顺序表 BOOL Inse(sqlist &,int,char); //在线性表中插入元素 BOOL del(sqlist&,int,char &); //在线性表中删除元素 int Loc(sqlist,char); //在线性表中定位元素 void print(sqlist); //输出顺序表 void combine( sqlist & , sqlist & , sqlist &);//两个线性表的合并 2、链表 void CreaL(LinkList &,int); //生成一个单链表 BOOL LInsert(LinkList &,int,char); //在单链表中插入一个元素 BOOL LDele(LinkList &,int,char &); //在单链表中删除一个元素 BOOL LFind_key(LinkList,char,int &); //按关键字查找一个元素 BOOL LFind_order(LinkList,char &,int); //按序号查找一个元素 void LPrint(LinkList); //显示单链表所有元素 void LUnion(LinkList &,LinkList &,LinkList &,int); //两个链表的连接 五、程序代码 1、顺序表 #include #include

数据结构 线性表 课后答案

第2章线性表 1.选择题 (1)顺序表中第一个元素的存储地址是100,每个元素的长度为2,则第5个元素的地址是()。 A.110 B.108 C.100 D.120 答案:B 解释:顺序表中的数据连续存储,所以第5个元素的地址为:100+2*4=108。 (2)在n个结点的顺序表中,算法的时间复杂度是O(1)的操作是()。 A.访问第i个结点(1≤i≤n)和求第i个结点的直接前驱(2≤i≤n) B.在第i个结点后插入一个新结点(1≤i≤n) C.删除第i个结点(1≤i≤n) D.将n个结点从小到大排序 答案:A 解释:在顺序表中插入一个结点的时间复杂度都是O(n2),排序的时间复杂度为O(n2)或O(nlog2n)。顺序表是一种随机存取结构,访问第i个结点和求第i个结点的直接前驱都可以直接通过数组的下标直接定位,时间复杂度是O(1)。 (3)向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为()。 A.8 B.63.5 C.63 D.7 答案:B 解释:平均要移动的元素个数为:n/2。 (4)链接存储的存储结构所占存储空间()。 A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针 B.只有一部分,存放结点值 C.只有一部分,存储表示结点间关系的指针 D.分两部分,一部分存放结点值,另一部分存放结点所占单元数 答案:A (5)线性表若采用链式存储结构时,要求内存中可用存储单元的地址()。 A.必须是连续的B.部分地址必须是连续的 C.一定是不连续的D.连续或不连续都可以 答案:D (6)线性表L在()情况下适用于使用链式结构实现。 A.需经常修改L中的结点值B.需不断对L进行删除插入 C.L中含有大量的结点D.L中结点结构复杂 答案:B

数据结构线性表实验报告

实验报告 实验一线性表 实验目的: 1.理解线性表的逻辑结构特性; 2.熟练掌握线性表的顺序存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用; 3.熟练掌握线性表的链表存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用; 4.掌握双向链表和循环链表的的描述方法,以及在该存储结构下的基本操作。 实验原理: 线性表顺序存储结构下的基本算法; 线性表链式存储结构下的基本算法; 实验内容: 2-21设计单循环链表,要求: (1)单循环链表抽象数据类型包括初始化操作、求数据元素个数操作、插入操作、删除操作、取消数据元素操作和判非空操作。 (2)设计一个测试主函数,实际运行验证所设计单循环链表的正确性。 2-22 .设计一个有序顺序表,要求: (1)有序顺序表的操作集合有如下操作:初始化、求数据元素个数、插入、删除和取数据元素。有序顺序表与顺序表的主要区别是:有序顺序表中的数据元素按数据元素值非递减有序。 (2)设计一个测试主函数,实际运行验证所设计有序顺序表的正确性。 (3)设计合并函数ListMerge(L1,L2,L3),功能是把有序顺序表L1和L2中的数据元素合并到L3,要求L3中的数据元素依然保持有序。并设计一个主函数,验证该合并函数的正确性。 程序代码: 2-21(1)头文件LinList.h如下: typedef struct node { DataType data; struct node *next; }SLNode; /*(1)初始化ListInitiate(SLNode * * head)*/ void ListInitiate(SLNode * * head) { /*如果有内存空间,申请头结点空间并使头指针head指向头结点*/ if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL)exit(1);

最新《数据结构》 第二章 线性表习题

《数据结构》 第二章线性表习题 一、单项选择题 1. 线性表是________。 A.一个有限序列,可以为空B.一个有限序列,不可以为空 C.一个无限序列,可以为空D.一个无限序列,不可以为空 2. 在一个长度为n的顺序表中删除第i个元素(0<=i<=n)时,需向前移动个元素。 A.n-i B.n-i+l C.n-i-1 D.i 3. 线性表采用链式存储时,其地址________。 A.必须是连续的B.一定是不连续的 C.部分地址必须是连续的D.连续与否均可以 4. 从一个具有n个结点的单链表中查找其值等于x的结点时,在查找成功的情况下,需平均比较________个元素结点。 A.n/2 B.n C.(n+1)/2 D.(n-1)/2 5. 在双向循环链表中,在p所指的结点之后插入s指针所指的结点,其操作是____。 A. p->next=s; s->prior=p; p->next->prior=s; s->next=p->next; B. s->prior=p; s->next=p->next; p->next=s; p->next->prior=s; C. p->next=s; p->next->prior=s; s->prior=p; s->next=p->next; D. s->prior=p; s->next=p->next; p->next->prior=s; p->next=s; 6. 设单链表中指针p指向结点m,若要删除m之后的结点(若存在),则需修改指针的操作为________。A.p->next=p->next->next; B.p=p->next; C.p=p->next->next; D.p->next=p; 7. 在一个长度为n的顺序表中向第i个元素(0< inext=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 9. 以下关于线性表的说法不正确的是______。 A.线性表中的数据元素可以是数字、字符、记录等不同类型。 B.线性表中包含的数据元素个数不是任意的。 C.线性表中的每个结点都有且只有一个直接前趋和直接后继。 D.存在这样的线性表:表中各结点都没有直接前趋和直接后继。

数据结构实验线性表及其应用

计算机系数据结构实验报告(1) 实验目的: 帮助学生掌握线性表的基本操作在顺序和链表这两种存储结构上的实现,尤以链表的操作和应用作为重点。 问题描述: 1、构造一个空的线性表L。 2、在线性表L的第i个元素之前插入新的元素e; 3、在线性表L中删除第i个元素,并用e返回其值。 实验要求: 1、分别利用顺序和链表存储结构实现线性表的存储,并设计出在不同的存储结构中线 性表的基本操作算法。 2、在实验过程中,对相同的操作在不同的存储结构下的时间复杂度和空间复杂度进行 分析。 算法分析: 由于两种存储结构都用来创建线性结构的数据表,可采用相同的输出模式和整体结构类似的算法,如下: 实验内容和过程: 顺序存储结构线性表程序清单: //顺序存储结构线性表的插入删除 #include #include <> using namespace std; # define LISTSIZE 100 # define CREMENTSIZE 10 typedef char ElemType; //定义数据元素类型为字符型 typedef struct { ElemType *elem; //数据元素首地址

int len; //当前元素个数 int listsize; //当前存储最大容量 }SqList; //构造一个空的线性表L int InitList(SqList &L) { =(ElemType *)malloc(LISTSIZE*sizeof(ElemType)); if (! exit(-2); //分配空间失败 =0; =LISTSIZE; } //在顺序线性表L中第i个位置之前插入新的元素e int ListInsert(SqList &L,int i,ElemType e) { if (i<1||i>+1) return -1; //i值不合法 if >= { ElemType *newelem=(ElemType *)realloc,+CREMENTSIZE)*sizeof(ElemType)); //存储空间已满,增加分配 if(!newelem) exit (-2); //分配失败 =newelem; +=CREMENTSIZE; } ElemType *q=&[i-1]) ; for (ElemType *p=&[]);p>=q;--p) *(p+1)=*p; //插入位置及其后的元素后移 *q=e; ++; return 1; } //在顺序线性表L中删除第i个元素,并用e返回其值 int ListDelete(SqList &L,int i,ElemType&e) { if (i<1||i> return -1; //i值不合法

数据结构线性表试验报告

线性表上机实习 1、实验目的 (1)熟悉将算法转换为程序代码的过程。 (2)了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C语言描述方法。 (3)熟练掌握顺序表的基本运算:查找、插入、删除等,掌握顺序表的随机存取特性。(4)了解线性表的链式存储结构,熟练掌握线性表的链式存储结构的C语言描述方法。(5)熟练掌握线性链表(单链表)的基本运算:查找、插入、删除等,能在实际应用中灵活选择适当的链表结构。 2、实验要求 (1)熟悉顺序表的插入、删除和查找。 (2)熟悉单链表的插入、删除和查找。 3、实验内容: ①顺序表 (1)抽象数据类型定义 typedef struct { TypeData data[maxsize]; //容量为maxsize的静态顺手表 int n; //顺序表中的实际元素个数 }SeqList; //静态顺序表的定义 在本次实验中,首先建立一个空的静态顺序表,然后键盘输入数据存入表中,然后进入菜单选择界面,通过不同的数字输入,实现对顺序表,删除,插入,查找,显示等操作。 (2)存储结构定义及算法思想 在顺序表结构体的定义中,typedef int TypeData 为整型,存储结构如下: for(n=0;n>L.data[n]; //顺序将数据存入顺序表 } //其他存储与此类似,都是直接赋值与数组的某一位 插入版块子函数: void insert(SeqList &L) //插入数据 { int a,b,c,k; cout<<"请输入插入的数及其插入的位置"<

数据结构第二章线性表1习题

线性表专题 一、选择题 1.关于顺序存储的叙述中,哪一条是不正确的( ) A.存储密度大 B.逻辑上相邻的结点物理上不必邻接 C.可以通过计算直接确定第i个结点的位置 D.插入、删除操作不方便 2.长度为n的单链表连接在长度为m的单链表后的算法的时间复杂度为( ) A O(n) B O(1) C O(m) D O(m+n) 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.一个向量第一个元素的存储地址是100 ,每个元素的长度为2 ,则第5 个元素的地址是:( ) (A )110 ( B )108 (C )100 (D )120 5.已知一个顺序存储的线性表,设每个结点需要占m个存储单元,若第一个结点的地址为da,则第i个结点的地址为:( ) A)da+(i-1)*m B) da+i*m C) da-i*m D) da+(i+1)*m 6.在具有n个结点的单链表中,实现()的操作,其算法的时间复杂度为O(n)。 A)遍历链表和求链表的第i个结点B)在地址为p的结点之后插入一个结点 C)删除开始结点D)删除地址为p的结点的后继结点 7.链表是一种采用()存储结构存储的线性表。 ( A )顺序(B )链式( C )星式(D )网状 8.线性表若采用链式存储结构时,要求内存中可用存储单元的地址:() ( A )必须是连续的( B )部分地址必须是连续的 ( C )一定是不连续的( D )连续或不连续都可以 9.线性表L在()情况下适用于使用链式结构实现。 (A)需经常修改L中的结点值(B)需不断对L进行删除插入 (C)L中含有大量的结点(D)L中结点结构复杂 10.在长度为n 的顺序表的第i (1≤i≤n+1) 个位置上插入一个元素,元素的移动次数为( )

第二章-线性表-自测题-自测题答案

第二章-线性表-自测题-自测题答 案 一、填空(每空1分,共13分) 1. 【严题集 2.2①】在顺序表中插入或删除一个元素,需要平均移动 _表中一半元素,具体移动的元素个数与_表长和该元素在表中的位置 _有关。 2. 线性表中结点的集合是—有限—的,结点间的关系是—一对一的。 3. 向一个长度为n的向量的第i个元素(K i < n+1)之前插入一个元素时,需向后移动_n-i+1 _个兀素。 4. 向一个长度为n的向量中删除第i个元素(K i < n)时,需向前移动_n-i .个 5. 在顺序表中访问任意一结点的时间复杂度均为0(1)_,因此,顺序表也 称为—随机存取—的数据结构。 6. 【严题集2.2①】顺序表中逻辑上相邻的元素的物理位置—必定相邻。单链 表中逻辑上相邻的元素的物理位置不一定相邻。 7. 【严题集2.2①】在单链表中,除了首元结点外,任一结点的存储位置由_其直接前驱结点的链域的值—指示。 8. 在n个结点的单链表中要删除已知结点*p,需找到它的前驱结点的地址,其时间复杂度为0 (n)。

二、判断正误(在正确的说法后面打勾,反之打叉)(每小题1分,共10分) (X ) 1.链表的每个结点中都恰好包含一个指针。 答:错误。链表中的结点可含多个指针域,分别存放多个指针。 例如,双向链表中的结点可以含有两个指针域,分别存放指向其 直接前趋和直接后继结点的指针。 (X ) 2.链表的物理存储结构具有同链表一样的顺序。 错,链表的存储结构特点是无序,而链表的示意图有序。 (X ) 3.链表的删除算法很简单,因为当删除链中某个结点后,计算机会自动地将后续的各个单元向前移动。 错,链表的结点不会移动,只是指针内容改变。 X ) 4.线性表的每个结点只能是一个简单类型,而链表的每个结点可以是一个复杂类型。 错,混淆了逻辑结构与物理结构,链表也是线性表!且即使是顺序表,也能存 放记录型数据。 (X ) 5.顺序表结构适宜于进行顺序存取,而链表适宜于进行随机存取。 错,正好说反了。顺序表才适合随机存取,链表恰恰适于“顺藤摸瓜” (x ) 6.顺序存储方式的优点是存储密度大,且插入、删除运算效率高。 错,前一半正确,但后一半说法错误,那是链式存储 的优点。顺序存储方式插入、删除运算效率较低,在 表长为n的顺序表中,插入和删除一个数据元素,平 均需移动表长一半个数的数据元素。 (x ) 7.线性表在物理存储空间中也一定是连续的。错,线性表有两种存储方式,顺序存储和链式存储。后者不要求连续存放。 (x ) 8.线性表在顺序存储时,逻辑上相邻的元素未必在存储的物理位置次序上相邻。 错误。线性表有两种存储方式,在顺序存储时,逻辑 上相邻的元素在存储的物理位置次序上也相邻。 (x ) 9?顺序存储方式只能用于存储线性结构。 错误。顺序存储方式不仅能用于存储线性结构,还可 以用来存放非线性结构,例如完全二叉树是属于非线 性结构,但其最佳存储方式是顺序存储方式。(后一节 介绍) (x ) 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个结点的顺序表中,算法的时间复杂度是0(1)的操作是: (A)访问第i个结点(Ki< n)和求第i个结点的直接前驱(2 < i < n)

相关文档
最新文档