我的实验报告
集美大学课程实验报告-实验2:线性表
项目名称 | 内容 |
---|---|
课程名称 | 数据结构 |
班级 | 网安2411 |
指导教师 | 郑如滨 |
学生姓名 | 李斌财 |
学号 | 202421336021 |
实验项目名称 | 线性表 |
上机实践日期 | |
上机实践时间 | 2学时 |
一、目的(本次实验所涉及并要求掌握的知识点)
以下内容请根据实际情况编写
知识点:
- 线性表相关操作:插入、删除、查找等操作。
- 链表相关操作:头插法、尾插法等操作。
3.链表区间删除操作。
4.链表逆置操作。
二、实验内容与设计思想
以下请根据实际情况编写
题目1:区间删除
函数代码
//创建顺序表
void CreateList(SqList &L, int n) {
L = new List;
for (int i = 0; i < n; i++) {
cin >> L->data[i];
}
L->length = n;
}
时间复杂度:O(n)
循环运行 n 次,每次执行输入操作,时间复杂度为线性。
空间复杂度:O(n)
创建了一个大小为 n 的顺序表,空间复杂度为线性。
void DelNode(SqList &L, int min, int max) {
int k = 0;
for (int i = 0; i < L->length; i++) {
if (L->data[i] < min || L->data[i] > max) {
L->data[k++] = L->data[i];
}
}
L->length = k;
}
时间复杂度:O(n)
遍历整个顺序表一次,时间复杂度为线性。
空间复杂度:O(1)
仅使用了常量级的额外空间(变量 k 等),空间复杂度为常数。
题目2:头插法创建链表
函数代码
//头插法创建链表
void CreateListF(LinkList &L, int n) {
L = new LNode;
L->next = nullptr;
for (int i = 0; i < n; i++) {
LinkList newNode = new LNode;
cin >> newNode->data;
newNode->next = L->next;
L->next = newNode;
}
}
时间复杂度:O(n)
循环运行 n 次,每次创建一个新节点并插入链表,时间复杂度为线性。
空间复杂度:O(n)
创建了 n 个新节点,空间复杂度为线性。
void DispList(LinkList L)
{
if (L->next == nullptr){
cout << "空链表!" << endl;
return;
}
LinkList p = L->next;
while (p) {
cout << p->data;
if (p->next)cout << " ";
p = p->next;
}
cout << endl;
}
Avatar
以下是为每个函数标注时间复杂度和空间复杂度的分析:
题目1:顺序表操作
1.1 CreateList 函数
cpp
复制
void CreateList(SqList &L, int n) {
L = new List;
for (int i = 0; i < n; i++) {
cin >> L->data[i];
}
L->length = n;
}
时间复杂度:O(n)
循环运行 n 次,每次执行输入操作,时间复杂度为线性。
空间复杂度:O(n)
创建了一个大小为 n 的顺序表,空间复杂度为线性。
1.2 DelNode 函数
cpp
复制
void DelNode(SqList &L, int min, int max) {
int k = 0;
for (int i = 0; i < L->length; i++) {
if (L->data[i] < min || L->data[i] > max) {
L->data[k++] = L->data[i];
}
}
L->length = k;
}
时间复杂度:O(n)
遍历整个顺序表一次,时间复杂度为线性。
空间复杂度:O(1)
仅使用了常量级的额外空间(变量 k 等),空间复杂度为常数。
题目2:头插法创建链表
2.1 CreateListF 函数
cpp
复制
void CreateListF(LinkList &L, int n) {
L = new LNode;
L->next = nullptr;
for (int i = 0; i < n; i++) {
LinkList newNode = new LNode;
cin >> newNode->data;
newNode->next = L->next;
L->next = newNode;
}
}
时间复杂度:O(n)
循环运行 n 次,每次创建一个新节点并插入链表,时间复杂度为线性。
空间复杂度:O(n)
创建了 n 个新节点,空间复杂度为线性。
2.2 DispList 函数
cpp
复制
void DispList(LinkList L) {
if (L->next == nullptr){
cout << "空链表!" << endl;
return;
}
LinkList p = L->next;
while (p) {
cout << p->data;
if (p->next)cout << " ";
p = p->next;
}
cout << endl;
}
时间复杂度:O(n)
遍历整个链表一次,时间复杂度为线性。
空间复杂度:O(1)
仅使用了常量级的额外空间(指针 p),空间复杂度为常数。
题目3:链表逆置
void ReverseList(LinkList &L) {
if (L->next == nullptr || L->next->next == nullptr){
return;
}
LinkList prev = nullptr;
LinkList curr = L->next;
LinkList next = nullptr;
while (curr != nullptr) {
next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
L->next = prev;
}
时间复杂度:O(n)
遍历整个链表一次,时间复杂度为线性。
空间复杂度:O(1)
仅使用了常量级的额外空间(指针 prev、curr 和 next),空间复杂度为常数。
三、实验使用环境(本次实验所使用的平台和相关软件)
以下请根据实际情况编写
- 操作系统:Windows 11
- 编程语言:C++
- 开发工具:PTA
- 编译器:g++
四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)
题目1:区间删除
PTA提交截图
五、实验小结(实验中遇到的问题及解决过程、实验体会和收获)
遇到的问题及解决方法:
- 问题:markdown的图片问题
- 解决方法:用网址链接
- 问题:代码符号不规范。
- 解决方法:!和!
实验体会和收获:
学会了线性表的插入、删除、查找等操作,链表的头插法、尾插法等操作,链表区间删除操作,链表逆置操作。