文章目录
前言
失踪人口回归啦~ 我作为一名普通的大学生,坐牢数天,只为期末。两天速成的大物取得了7*分的好(不挂)成绩.jpg 上午刚考完的高数大概也不会挂,前两天考了通英和英语六级。就是说坐牢结束了,但没完全结束。==【数据结构与算法】==还得考,挑重点的来,那就浅浅复习一下吧~
PS:鉴于时间原因,主要是通过例题来复习。
顺序表与单链表
1.选择题
(1)对于顺序表,以下说法错误的是( A)
A.顺序表是用一维数组实现的线性表,数组的下标可以看成是元素的绝对地址
B.顺序表的所有存储结点按相应数据元素间的逻辑关系决定的次序依次排列
C.顺序表的特点是:逻辑结构中相邻的结点在存储结构中仍相邻
D.顺序表的特点是:逻辑上相邻的元素,存储在物理位置也相邻的单元中
在C语言中,数组的下标是从0开始的,但位置序号是从1开始的,所以要注意区分元素的位置序号和该元素在数组中的下标位置的对应关系。另外,对于线性表,假设每个元素占用l个存储单元,并以所占的第一个单元的存储地址作为数据元素的起始位置,则线性表中第i个数据元素ai的存储位置为:LOC(ai) = LOC (a1)+(i-1)*l
—————————————————————————————————
(2)以下说法错误的是 ( C)。
A.对于线性表来说,定位运算LocateElem在顺序表和单链表上的时间复杂度均为O(n)
B.插入、删除操作在顺序表上的实现,平均时间复杂度为O(n)
C.在链表上实现读表元运算的平均时间复杂度为O(1)
D.插入、删除操作在链表上的实现可在O(1)时间内完成
对于A,定位运算需要遍历对比元素,故对;对于B,顺序表的插入和删除操作需要将按位移动元素,也对;对于C,链表中读元操作需要遍历元素,平均时间复杂度不是O(1),而在顺序表中,因为可以通过下标直接访问元素,所以时间复杂度为常数时间;对于D选项,在链表的头部插入和尾部删除的实现操作是常数时间,故正确。
————————————————————————————————
(3)顺序存储表示中数据元素之间的逻辑关系是由( C)表示的。
A.指针
B.逻辑顺序
C.存储位置
D.问题上下文
顺序存储的存储位置与逻辑结构中的逻辑前后顺序是对应的。
————————————————————————————————
(4)设一个链表最常用的操作是在末尾插入结点和删除尾结点,则选用( D)最节省时间。
A.单链表
B.单循环链表
C.带尾指针的单循环链表
D.带头结点的双循环链表
因为在末尾插入或者结点需要找到尾结点以及尾结点的前一个结点,因此采用单链表操作的时间复杂度为O(n),用带尾指针的单循环链表删除尾结点是常数时间,但插入节点仍然是O(n)。用带头结点的双循环链表最节省时间。
2.函数&&编程题
(1)顺序表的插入函数
int ListInsert(SqList &L,int i,ElemType e){
//插入位置不合法
if(i<=0||(i>L.length+1)){
return 0;
}
//表满
if(L.length>=MAXSIZE){
return 0;
}
int j;
//插入位置后的元素后移一位
for(j=L.length-1;j>=i-1;j--){
L.elem[j+1]=L.elem[j];
}
L.elem[i-1]=e;
//表长加一
L.length ++;
return 1;
}
—————————————————————————————————
(2)顺序表的删除函数
int ListDelete(SqList &L,int i){
//删除位置不合法
if((i<1)||(i>L.length)){
return 0;
}
//元素前移
for(int j=i;j<=L.length-1;j++){
L.elem[j-1]=L.elem[j];
}
//表长减1
L.length --;
return 1;
}
————————————————————————————————
(3)单链表的查询插入删除
int Get_LinkList(LinkList H, ElemType key){
int i = 0;
while(H->data!=key){
H=H->next