数据结构实验-线性表&&链表操作

这篇博客通过两个实验详细介绍了线性表的顺序存储结构和单链表的操作。实验一展示了如何使用C++实现顺序表的初始化、遍历、查找、插入和删除元素。实验二则演示了单链表的初始化、尾插法创建、遍历、逆置以及两个有序单链表的合并。这些操作涵盖了数据结构基础中的核心概念,有助于理解线性表的动态管理。
摘要由CSDN通过智能技术生成

实验目的:

理解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。

实验内容:

(1)顺序表的操作

① 随机产生一组两位数整数,建立线性表的顺序存储结构。

② 实现该线性表的遍历。

③ 在该顺序表中查找某一元素,查找成功显示查找元素,否则显示查找失败。

④ 在该顺序表中删除或插入指定元素。

(2)单链表的操作

① 输入一组整型元素序列,使用尾插法建立一个带有头结点的单链表。

② 实现该线性表的遍历。

③ 实现单链表的就地逆置。

④ 建立两个按值递增有序的单链表,将他们合并成一个按值递减有序的单链表。要求利用原来的存储空间,并且新表中没有相同的元素。

实验一:顺序表操作代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ListInitSize 100
#define ListIncerment 10
typedef struct
{
    int *base;
    int length;
    int listsize;
}SqList;
//初始化操作
void InitSqList(SqList &L)
{
    L.base = (int*)malloc(ListInitSize*sizeof(int));
    if(!L.base){
        cout << "分配失败";
        return ;
    }
    L.length = 0;
    L.listsize = ListInitSize;
}
//查找元素
bool chazhao(SqList L,int e)
{
    if(L.length == 0)
        return 0;
    for(int i = 0;i < L.length;i++){
        if(L.base[i] == e)
            return 1;
    }
    return 0;
}
void deleteElem(SqList &L,int e)
{
    for(int i = 0;i <L.length;i++){
        if(L.base[i] == e){
            for(int j = i;j < L.length-1;j++){
                L.base[j] = L.base[j+1];
            }
            L.length--;
            i--;
        }
    }
}
int main()
{
    SqList L;
    InitSqList(L);
    int n = 20;
    for(int i = 0;i < n;i++){
        L.base[i] = rand() % 90 + 10;
        L.length++;
    }
    //线性表的遍历
    for(int i = 0;i < L.length;i++){
        cout << L.base[i] << " ";
    }
    cout << endl;
    //查找某一元素
    cout << "请输入想要查询的元素:";
    int e;
    cin >> e;
    if(chazhao(L,e))
        cout << e << endl;
    else
        cout << "查找失败" << endl;
    cout << "请输入想要删除的元素:";
    cin >> e;
    deleteElem(L,e);
    for(int i = 0;i < L.length;i++){
        cout << L.base[i] << " ";
    }
    cout << endl;
    cout << "请输入想要插入的元素:";
    cin >> e;
    L.base[L.length++]=e;
    for(int i = 0;i < L.length;i++){
        cout << L.base[i] << " ";
    }
}

实验二链表操作代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef struct LNode
{
    int data;
    struct LNode *next;
}LNode,*LinkList;
//单链表的初始化
void InitLinkList(LinkList &L)
{
    L = (LinkList)malloc(sizeof(LNode));
    if(!L)
        return;
    L -> next = NULL;
}
//尾插法
void Create(LinkList &L,int n)
{
    L = (LinkList)malloc(sizeof(LNode));
    L -> next = NULL;
    LNode *p;
    for(int i = 0;i < n;i++){
        p = (LNode *)malloc(sizeof(LNode));
        cin >> p -> data;
//        cout << p -> date /*<< "jinlai" << endl*/;
        p -> next = L -> next;
        L -> next = p;
    }
}
//遍历
void out(LinkList L)
{
    LNode *p = L;
    p=p->next;
    while(p){
        cout << p -> data << " ";
        p = p->next;
    }
    cout << endl;
}
LNode* reverseList(LNode* list){
    //将头节点与链表断开 first为待插入链表的第一个节点
    LNode* first = list->next;
    list->next = NULL;
    //将断开的链表使用头插法插入到头节点后 work为待插入节点
    while (first != NULL)
    {
        LNode* work = first;
        first = work->next;
        //将work插入
        work->next = list->next;
        list->next = work;
    }
    //返回头节点
    return  list;
}
void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc)
{
    LNode *pa;
    LNode *pb;
    LNode *t;
    Lc = t = La;
    pa = La -> next;
    pb = Lb -> next;
    while(pa && pb)
    {
        if(pa -> data >= pb -> data){
            t -> next = pa;
            t = pa;
            pa = pa -> next;
        }
        else
        {
            t -> next = pb;
            t = pb;
            pb = pb -> next;
        }
    }
    if(pa)
        t -> next = pa;
    else
        t -> next = pb;
    free(Lb);
}
int main()
{
    LinkList L;
    InitLinkList(L);
    cout << "请输入元素的个数:";
    int n;
    cin >> n;
    Create(L,n);
    out(L);
    L = reverseList(L);
    out(L);
    cout << "请输入两个升序链表的元素:";
    int a,b;
    cin >> a >> b;
    LinkList L1,L2;
    InitLinkList(L1);
    InitLinkList(L2);
    cout << "请输入第一个升序链表中的元素" << endl;
    Create(L1,a);
    cout << "请输入第二个升序链表中的元素" << endl;
    Create(L2,b);
    MergeList(L1,L2,L1);
    out(L1);
}

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值