选择题
[2019年第2题]. 在双向链表存储结构中,删除 p 所指的结点时须修改指针( )。
A.p->next->prior=p->prior; p->prior->next=p->next;
B.p->next=p->next->next; p->next->prior=p;
C.p->prior->next=p; p->prior=p->prior->prior;
D.p->prior=p->next->next; p->next=p->prior->prior;
[2020年第2题]. 在 n 个结点的顺序表中,算法的时间复杂度是 O(1)的操作是________。
A.访问第 i 个结点(1<=i<=n)和求第 i 个结点的直接前驱
B.在第 i 个结点后插入一个新结点(1<=i<=n)
C.删除第 i 个结点(1<=i<=n)
D.将 n 个结点从小到大排序
[2020年第3题]. 在双向链表中,删除结点 p 的操作是________。
A.p->prior->next=p->next; p->next->prior=p->prior;
B.p->next=p->next->next; p->next->prior=p;
C.p->priort=p->next->next; p->next=p->prior->prior;
D.p->prior-next=p; p->prior=p->prior->prior;
[2021年第1题]. 关于线性表的说法正确的是( )。
A. 线性表的特点是每个元素都有一个前驱和一个后继元素
B. 线性表是特征相同的n(n≥0)个元素构成的有限序列
C. 线性表采用顺序存储便于进行插入和删除操作
D. 线性表采用链式存储便于进行随机查找操作
[2021年第2题]. 表长为n的顺序存储的线性表,当在任何位置删除一个元素的概率相等时,删除一个元素所需移动元素的平均个数为( )。
A.(n-1)/2 B.n/2 C.(n+1)/2 D.n
[2021年第3题]. 假设单链表结点结构为(data,next),删除指针p所指结点的后继结点q的语句序列是( )。
A.p->next=q->next; free(q); B.p->next=q; free(q);
C.free(q);p->next=q->next; D.free(q);p->next=q;
[2022年第2题]. 线性表的顺序存储结构中,数据元素的逻辑位置和物理位置的关系是( )。
A.不一致的 B.一致的 C.大致相同 D.个别元素相同
[2022年第3题].在一个有n个元素的顺序表中,插入一个元素平均要移动的元素个数为( )。
A.(n-1)/2 B.n/2 C.(n+1)/2 D.n
[2023年第2题]. 某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( )存储方式最节省运算时间。
A.单链表 B.仅有头指针的单循环链表
C.双链表 D.仅有尾指针的单循环链表
算法题
[2019年第1题]. 已知顺序表的类型定义如下:
#define MaxSize <顺序表的容量>
typedef struct {
ElemType *elem; // 存储空间基址
int length; // 当前表长
} SqList;
设顺序表 L 中的数据元素非递减有序,试编写函数实现将 e 插入 L 的适当位置,以保持线性表的有序性。函数原型为: bool InsertOrderList(SqList &L, ElemType e) 请用类C语言写出函数代码,并且加上适当注释,以增加可读性。
[2019年第2题]. 已知单链表的类型定义如下:
typedef struct LNode {
ElemType data; //数据域
struct LNode *next;//指针域
}LNode, *LinkList;
有一个带头结点的单链表 L,其结点的元素值按非递减的顺序排列,试编写函数,其功能是:审查单链表 L,凡元素值相同的结点只保留其中一个,使得单链表 L 按元素值递增有序。
函数原型为:void Delete(LinkList &L) 请用类 C 语言写出函数代码,并且加上适当注释,以增加可读性。
[2019年第4题]. 已知记录的类型定义如下:
typedef struct{
int key; //关键字域
Infotype otherinfo; //其他域
} RecordType;
记录依顺序存储结构存放,其类型定义如下:
#define MAXSIZE 100 //最大记录数
typedef struct {
RecordType r[MAXSIZE + 1]; //0号单元不存记录
int length;
} SqList;
编写算法,对依上述方式存储的关键字为整型值的记录序列进行整理,以使所有关键字为负值的记录排在关键字为非负值的记录之前,要求:①至多使用一个记录的辅助存储空间;②算法的时间复杂度为 O(n),n 是表中记录的个数;③ 算法函数原型为:void Process(SqList L)。请:
(1)简述算法思路;
(2)用类 C 语言写出函数代码,并且加上适当注释,以增加可读性。
[2020年第1题]. 已知顺序表的类型定义如下:
#define MaxSize <顺序表的容量>
typedef struct {
int *elem; // 存储空间基址
int length;// 当前表长
} SqList;
设顺序表 L 中数据元素为整型,各个数据元素的值均不相同,试编写函数实现删除 L 中值最小的数据元素。
函数原型为:DeleteMin_Sq(LinkList &L) 请用类 C 语言写出函数代码,并且加上适当注释,以增加可读性。
[2020年第3题]. 已知单链表的类型定义如下:
typedef struct LNode {
ElemType data; //数据域
struct LNode *next;//指针域
}LNode, *LinkList;
设带头结点的单链表 L,其数据元素非递减有序,试编写函数实现将数据元素 e 插入 L 的适当位置, 以保持该链表的依然非递减有序。
函数原型为:bool InsertOrderList(LinkList &L, ElemType e)请用类 C 语言写出函数代码,并且加上适当注释,以增加可读性。
[2021年第1题]. 在一个非递减有序的线性表中,有数值相同的元素存在。若存储方式为单链表,设计算法去掉数值相同的元素,使链表中不再有重复元素,要求算法时间复杂度为O(N)。例如:算法输入链表为(19,26,26,32,50,62,62,62,89),则输出为(19,26,32,50,62,89)。作答时,给出必要的分析和说明,以及注释,用类C语言写出尽量完整的程序。
简答题
[2024年第2题]. 在什么情况下使用顺序表比链表好?
综合分析题
[2023年第1题]. 假设某班的班长创建如下图所示的班级通讯录,包括学号、姓名和电话号码三项内容并按学号递增顺序排列,对通讯录的日常管理包括存储、查询和编辑(增删改)。
| Number(in型) | Name(char型) | Telephone(int型) |
|---|---|---|
| 220501 | 张三 | 18511112222 |
| 220502 | 李四 | 18533334444 |
| 220503 | 王五 | 18555556666 |
| 220504 | 赵六 | 18577778888 |
| …… | …… | …… |
如果你是班长,需要编程实现对通讯录的日常管理,试回答以下问题:
(1)你认为该通讯录在内存中处理时应采用何种存储结构?请说明理由。(4分)
(2)根据你所采用的存储结构,写出记录的结构定义和通讯录的存储表示。(6分)
(3)假如有同学要转学离开班级,设计算法Delete( )实现下述功能:根据给定的姓名值查找该同学,如果找到则将该记录从通讯录中删除, 未找到则给出“该同学不在本班!”的提示信息。(10分)
(4)假如有新同学要插班进来,设计算法Insert( )实现下述功能:根据给定的学号查找是否存在对应的记录,如果未找到则将该记录插入相应位置依然保持按学号递增有序,找到则用新记录替换原记录。(10分)
温馨提示:算法首选用类C或其他语言的伪代码描述,也可用自然语言或流程图描述。