【数据结构】线性表部分习题2(顺序表与链表)

数据结构(线性表部分2)

数据结构习题持续更新中!!!

目录

    • 一、单选题
    • 二、简答题
      • [1. 顺序表就地逆置](#1. 顺序表就地逆置)
      • [2. 循环单项链表的就地逆置](#2. 循环单项链表的就地逆置)

作业习题笔记:

  1. 该部分是线性表部分习题的补充、更多习题见: 数据结构(线性表习题1)
  2. 详细一元多项式的操作方法 见文章:【数据结构】一元多项式的表示与相加(无序输入 有序输出)
  3. 知识点:【数据结构】线性表部分笔记1以及静态链表、循环单链表、双向链表、双向循环链表(线性表笔记2)

一、单选题

  1. 下面关于线性表的叙述中,错误的是哪一个?( )

A 线性表采用顺序存储,必须占用一片连续的存储单元。

B 线性表采用顺序存储,便于进行插入和删除操作。

C 线性表采用链接存储,不必占用一片连续的存储单元。

D 线性表采用链接存储,便于插入和删除操作。

选B

A、C、D是正确的,是顺序存储结构和链式存储结构的特点.
顺序存储的根据数组指针直接定位,在顺序表的任何位置上插入一个数据元素,平均需要移动n/2个数据元素,算法效率为O(n)

  1. 线性表是具有 n 个( )的有限序列(n>0)。

A 表元素

B 字符

C 数据元素

D 数据项

E 信息项

选 C
数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。
一个数据元素可由若干个数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成

引用牛客网中的解析: 线性表:0个或者多个数据元素的有限序列。

数据项:一个数据元素可以由多个数据项组成(例如人由头身体双手双脚颈部组成。)

  1. 若某线性表最常用的操作是存取任一指定序号的元素 和在最后进行插入和删除运算,则利用( )存储方式最节省时间。

A 顺序表

B 双链表

C 带头结点的双循环链表

D 单循环链表

选A
对于B、C、D,链表不能随意存取指定序号的元素。因此应使用顺序表来存取任一指定序号的元素,该操作的复杂度为O(n)。同时顺序表在最后进行插入和删除一个元素的复杂度只是是O(1)

  1. 若某线性表中最常用的操作是在最后一个元素之后插入 一个元素和删除第一个元素,则采用( )存储方式最节省运算时间。

A 单链表

B 仅有头指针的单循环链表

C 双链表

D 仅有尾指针的单循环链表

选D
对于A、B、C要想在尾端插入结点,需要遍历整个链表,复杂度为O(n)。
对于D,要插入结点,只要改变一下指针即可,要删除头结点,只要将指针移动到头结点即可。

  1. 链表不具有的特点是( )

A 插入、删除不需要移动元素

B 可随机访问任一元素

C 不必事先估计存储空间

D 所需空间与线性长度成正比

选B
链表不能随机访问任一元素,因为其存储空间不连续,需要通过链表指针去"寻找"

  1. 下面的叙述不正确的是( )

A 线性表在链式存储时,查找第 i 个元素的时间同 i 的值成正比

B 线性表在链式存储时,查找第 i 个元素的时间同 i 的值相关

C 线性表在顺序存储时,查找第 i 个元素的时间同 i 的值成正比

D 线性表在顺序存储时,查找第 i 个元素的时间同 i 的值无关

选C
线性表在顺序存储时,查找第 i 个元素的时间同 i 的值无关

  1. 若长度为 n 的线性表采用顺序存储结构,在其第 i 个位置插入一个新元素的算法的时间复杂度为( )(1<=i<=n+1)。

A O(0)

B O(1)

C O(n)

D O(n^2)

选C
顺序存储的根据数组指针直接定位,在顺序表的任何位置上插入一个数据元素,平均需要移动n/2个数据元素,算法效率为O(n)

  1. 对于一个头指针为 head 的带头结点的单链表,判定该表为空表的条件是( )

A head==NULL;

B head->next==NULL;

C head->next==head;

D head!=NULL;

选B
由于单链表是带头结点的单链表,头指针为 head,第一个结点为head ->next。 则判断该单链表表为空的条件是head ->next==NULL,选项ACD都错误。 所以正确答案为B。

  1. 双向链表中有两个指针域,llink 和 rlink 分别指向前趋及后继,设 p 指向链表中的一个结点,现要求删去 p 所指结点,则正确的删除是( )

A p->llink->rlink = p->llink; p->llink->rlink =p->rlink; free(p);

B free(p); p->llink->rlink =p->llink; p->llink->rlink =p->rlink;

C p->llink->rlink =p->llink; free(p); p->llink->rlink = p->rlink;

D 以上 A,B,C 都不对。

选D

  1. 双向链表中有两个指针域,llink 和 rlink,分别指回前驱及后继,设 p 指向链表中的一个结点,q 指向一待插入结点,现要求在 p 前插入 q,则正确的插入为( )。

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

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

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

D p->llink->rlink = q; q->rlink = p;q->llink = p->llink; p->llink =q;

选D

二、简答题

1. 顺序表就地逆置

  1. 用类C语言设计算法实现顺序表就地逆置
cpp 复制代码
//实现顺序表就地逆置
//就地逆置顺序表
//写法一:
void Reverse(SqList &L){
    int temp;
    for(int i=0;i<L.length/2;i++){
        temp = *(L.elem+i);
        *(L.elem+i)=*(L.elem+L.length-1-i);
        *(L.elem+L.length-1-i)=temp;
        // temp = L.elem[i];
        // L.elem[i] = L.elem[L.length - 1 - i];
        // L.elem[L.length - 1 - i] = temp;
    }

}

//写法二:
//顺序表就地逆置
void Reverse2(SqList &L) {
    int *start_arry = L.elem;//指向首地址
    int *end_arry = L.elem+L.length-1;//指向存放数据尾部位置
	while (start_arry < end_arry) {
		int temp = *start_arry;
		*start_arry = *end_arry;
		*end_arry = temp;
		start_arry++;
		end_arry--;
	}
}

2. 循环单项链表的就地逆置

  1. 用类C语言设计算法实现循环单项链表的就地逆置
cpp 复制代码
//实现循环单项链表的就地逆置
//方法一:
//循环单链表就地逆置()
void Reverse(LinkList& L) {
	LinkList pre, curr, next;
	pre = L;
	curr = L->next;
	while (curr!=L) {
		next = curr->next;
		curr->next = pre;
		pre = curr;
		curr = next;
	}
	
	L->next = pre; // 之后将头节点 指向 原本的尾结点
}

//方法二:
//循环链表的就地倒置
void Reverse_Circular(LinkList &Link_Circular){
    if ( Link_Circular->next == Link_Circular) {
        return; // 链表为空或只有一个节点,无需逆置
    }
    LinkList p,q;    
    int num=1;
    p = Link_Circular->next;             /*p为原链表的当前处理节点*/
        
    while(p != Link_Circular ){        /*当原链表未处理完*/
        q = p->next;         /*q指针保留原链表当前处理节点的下一个节点*/
        if(num){
            p->next = Link_Circular;   /*将当前处理节点p插入到逆置L的表头*/
            num--;  //对第一个结点特殊处理
        }
        else
            p->next = Link_Circular->next;   
        Link_Circular->next = p;
        p = q;               /*p指向下一个待插入的节点*/
    }

    
}

作业习题笔记:

  1. 该部分是线性表部分习题的补充、更多习题见: 数据结构(线性表习题1)
  2. 详细一元多项式的操作方法 见文章:【数据结构】一元多项式的表示与相加(无序输入 有序输出)
  3. 知识点:【数据结构】线性表部分笔记1以及静态链表、循环单链表、双向链表、双向循环链表(线性表笔记2)
相关推荐
single5948 分钟前
【c++笔试强训】(第四十五篇)
java·开发语言·数据结构·c++·算法
红色的山茶花20 分钟前
YOLOv9-0.1部分代码阅读笔记-loss_tal_dual.py
笔记·深度学习·yolo
一棵开花的树,枝芽无限靠近你39 分钟前
【PPTist】表格功能
前端·笔记·学习·编辑器·ppt·pptist
yuwinter2 小时前
鸿蒙HarmonyOS学习笔记(8)
笔记·学习
王老师青少年编程3 小时前
gesp(二级)(16)洛谷:B4037:[GESP202409 二级] 小杨的 N 字矩阵
数据结构·c++·算法·gesp·csp·信奥赛
1101 11013 小时前
STM32-笔记12-实现SysTick模拟多线程流水灯
笔记·stm32·嵌入式硬件
美式小田3 小时前
Cadence学习笔记 12 PCB初始化设置
笔记·嵌入式硬件·学习·cadence
kiritio10245133 小时前
kipotix4靶机实战
笔记·安全
No0d1es3 小时前
2024年12月青少年软件编程(C语言/C++)等级考试试卷(三级)
c语言·开发语言·青少年编程·电子学会·三级
席万里3 小时前
【MySQL学习笔记】关于索引
笔记·学习·mysql