集美大学课程实验报告-实验2:线性表
集美大学课程实验报告-实验2:线性表
| 项目名称 | 内容 |
|---|---|
| 课程名称 | 数据结构 |
| 班级 | 网安2512 |
| 指导教师 | 郑如滨 |
| 学生姓名 | 吴观生 |
| 学号 | 202521336053 |
| 实验项目名称 | 线性表 |
| 上机实践日期 | 2026年3月19日 |
| 上机实践时间 | 2学时 |
一、目的(本次实验所涉及并要求掌握的知识点)
-掌握数据结构的基本概念和应用。
-学习顺序表和链表的实现与优化。
-理解数据结构在实际问题中的应用。
二、实验内容与设计思想
题目1:区间删除
函数相关伪代码
伪代码
算法函数:void DelNode(SqList &L,int min,int max)
输入:顺序表L(包含数组data[]和长度length),区间[min,max]
输出:删除区间内元素后的顺序表
1.令k=0
2.对i从0到length-1依次循环,执行L->data[i]<min||L->data[i]>max,如果成立则L->data[k++]=L->data[i]。
3.将长度length变成k。
4.结束。
```cpp
**函数代码**
```cpp
#include <iostream>
#define MaxSize 100000
using namespace std;
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize]; //存放顺序表元素
int length ; //存放顺序表的长度
} List;
typedef List *SqList;
void CreateList(SqList &L,int n);//建顺序表
void DelNode(SqList &L,int min,int max);//删除区间元素。min,max表示删除的区间
void DispList(SqList L); //输出顺序表内容
void DestroyList(SqList &L);//销毁表
int main() {
int i,n;
int min,max;
SqList L;
cin>>n; //输入线性表元素个数
CreateList(L,n);//创建线性表,输入数据保证是有序的
cin>>min>>max;//输入区间值min,max
DelNode(L,min,max);//删除区间元素
DispList( L);//输出线性表
DestroyList(L);//销毁线性表,系统设计好,不需要设计。
}
void DestroyList(SqList &L)
{
delete L;
}
void CreateList(SqList &L,int n)
{
L=new List;
L->length=n;
for(int i=0;i<n;i++)
{
cin>>L->data[i];
}
}
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;
}
void DispList(SqList L)
{
if(L->length==0)
{
cout<<"线性表为空!"<<endl;
}else
{
for(int i=0;i<L->length;i++)
{
if(i>0)
{
cout<<" ";
}
cout<<L->data[i];
}
cout<<endl;
}
}
题目2:头插法或尾插法创建链表
1.头插法
函数相关伪代码
伪代码
算法函数:void CreateListF(LinkList &L,int n);
void DispList(LinkList L);
输入:空链表的创建和n。
输出:完整的链表。
1.先创建一个头结点,使之L->next=NULL。
2.对i从0到n-1进行循环,创立一个新的指针,使它指向链表,把新的节点插入到头结点后的位置,p->data=val,p->next=L->next,L->next=p。
3.循环结束后,先判断该链表是否为空链表。
4.当为非空链表时,依次输出链表,中间空一个格子,cout<<" "。
5.结束。
函数代码
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next; //指向后继结点
} LNode,*LinkList;
void CreateListF(LinkList &L,int n);//头插法建链表
void DispList(LinkList L);//输出链表
void DestroyList(LinkList &L);//销毁链表
int main()
{
LinkList L;
int n;
cin>>n;//输入链表节点个数
CreateListF(L,n);//头插法建链表
DispList(L);//输出链表
DestroyList(L);//销毁链表
return 0;
}
void DestroyList(LinkList &L)
{
LinkList p = L;
while (L)
{
p = L;
L = L->next;
delete p;
}
}
void CreateListF(LinkList &L,int n)
{
L=new LNode;
L->next=NULL;
for(int i=0;i<n;i++)
{
int val;
cin>>val;
LinkList p=new LNode;
p->data=val;
p->next=L->next;
L->next=p;
}
}
void DispList(LinkList L)
{
if(L->next==NULL)
{
cout<<"空链表!"<<endl;
}else
{
LinkList p = L->next;
while (p)
{
cout << p->data;
if (p->next) cout << " ";
p = p->next;
}
cout << endl;
}
}
2.尾插法
函数相关伪代码
算法函数:void CreateListR(LinkList &L, int n)
输入:创建空链表和n。
输出:完成尾插法形成链表。
1.先创立一个头结点,使之L->next=NULL。
2.创立一个尾指针r。
3.对i从0到n-1进行循环,让p->data=x,p->next=NULL,让头结点指向p,再把尾指针移向p,依次链接。
4.结束。
函数代码
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next; //指向后继结点
} LNode,*LinkList;
void CreateListR(LinkList &L, int n);//尾插法建链表
void DispList(LinkList L);//输出链表
void DestroyList(LinkList &L);//销毁链表
int main()
{
LinkList L;
int n;
cin>>n;//输入链表节点个数
CreateListR(L,n);//尾插法建链表
DispList(L);//输出链表,细节不表,可自行设计验证
DestroyList(L);//销毁链尾,细节不表
return 0;
}
void CreateListR(LinkList &L,int n)
{
L=new LNode;
L->next=NULL;
LNode *r=L;
for(int i=0;i<n;i++)
{
ElemType x;
cin>>x;
LNode *p=new LNode;
p->data=x;
p->next=NULL;
r->next=p;
r=p;
}
}
题目3:单链表逆置
函数相关伪代码
伪代码
算法函数:void ReverseList(LinkList &L)。
输入:链表的创建。
输出:完成链表的逆置。
1.先判断链表是否为空或者只有单结点。
2.若为非空链表或者多结点,创建指针p指向首元结点,使链表的头结点指向NULL,断开其他结点的连接。
3.创建新指针q保存p的下一个结点,使用头插法,依次将原有的顺序插入头结点后,p->next=L->next,L->next=p,p=q。
4.结束。
函数代码
#include <iostream>
using namespace std;
typedef int ElemType;
typedef struct LNode //定义单链表结点类型
{
ElemType data;
struct LNode *next; //指向后继结点
} LNode,*LinkList;
void CreateListR(LinkList &L, int n);//尾插法建链表
void DispList(LinkList L);//输出链表
void DestroyList(LinkList &L);//销毁链表
void ReverseList(LinkList &L);//逆转链表
int main()
{
LinkList L;
int n;
cin>>n;//输入链表节点个数
CreateListR(L,n);//尾插法建带头结点链表,细节不表
ReverseList(L);//逆转链表
DispList(L);//输出链表,细节不表
DestroyList(L);//销毁链尾,细节不表
return 0;
}
void ReverseList(LinkList &L)
{
if(L->next==NULL||L->next->next==NULL)
return;
LNode *p=L->next;
L->next=NULL;
while(p!=NULL)
{
LNode *q=p->next;
p->next=L->next;
L->next=p;
p=q;
}
}
三、实验使用环境(本次实验所使用的平台和相关软件)
-操作系统:Windows11 专业版
-编程语言:C++
-开发工具:[Visual Studio2026]
-编译器:本地Windows调试器
四、实验步骤和调试过程(实验步骤、测试数据设计、测试结果分析)
***题目1:区间删除
本机运行截图

PTA提交截图

***题目2:头插法
本机运行截图

PTA提交截图

***题目2:尾插法
本机运行截图

PTA提交截图

***题目3:逆置
本机运行截图

PTA提交截图

五、实验小结(实验中遇到的问题及解决过程、实验体会和收获)
遇到的问题及解决方法:
1.问题:在发博客的预览中,发现部分格式不合适
解决方法:检查markdown的格式发现有错误,并进行修改
实验体会和收获:
-学会了大部分的markdown格式。
-掌握了发布博客的方法,
六、附件(参考文献和相关自留)
1.deepseek查询

浙公网安备 33010602011771号