集美大学课程实验报告-实验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:区间删除
本机运行截图

微信图片_20260323220134_39_4
PTA提交截图

微信图片_20260323220327_41_4
***题目2:头插法
本机运行截图

微信图片_20260323220757_43_4
PTA提交截图

微信图片_20260323221002_45_4
***题目2:尾插法
本机运行截图

微信图片_20260323221539_47_4
PTA提交截图

微信图片_20260323221710_49_4
***题目3:逆置
本机运行截图

微信图片_20260323222208_52_4
PTA提交截图

微信图片_20260323222447_54_4


五、实验小结(实验中遇到的问题及解决过程、实验体会和收获)

遇到的问题及解决方法:

1.问题:在发博客的预览中,发现部分格式不合适
解决方法:检查markdown的格式发现有错误,并进行修改

实验体会和收获:

-学会了大部分的markdown格式。
-掌握了发布博客的方法,

六、附件(参考文献和相关自留)

1.deepseek查询

posted @ 2026-03-23 22:38  望归时  阅读(7)  评论(0)    收藏  举报