(最详细!)数据结构实验1-顺序表的实现和应用

(最详细!)数据结构实验1-顺序表的实现和应用

1. 实验目的:

⑴熟悉线性表的定义和基本操作;
⑵掌握线性表的顺序存储结构设计与基本操作的实现。

2.实验内容与要求:

⑴定义线性表的顺序存储表示;
⑵基于所设计的存储结构实现线性表的基本操作;
⑶编写一个主程序对所实现的线性表进行测试;
⑷线性表的应用:
①设线性表L1和L2分别代表集合A和B,试设计算法求A和B的并集C,并用线性表L3代表集合C;
②(选做)设线性表L1和L2中的数据元素为整数,且均已按值非递减有序排列,试设计算法对L1和L2进行合并,用线性表L3保存合并结果,要求L3中的数据元素也按值非递减有序排列。

3.算法思路:

(1)定义线性表L1、L2、L3
(2)基于所设计的存储结构实现线性表的基本操作
(3)定义并集的函数,首先将L1全部复制进L3,再用LocateElem函数判断L3中是否含有L2中的元素,有则跳过,没有就用ListInsert函数将元素插入L3表中。

4.心得体会:
对于线性表的运用有很多细节需要注意,比如线性表是从1~n而下标是从0~n-1,在调用线性表基本函数时需要注意。其次是new了新的线性表之后需要delete释放空间。也学习到了新函数realloc()用来重新分配空间。题目有思路之后应该动手自己打代码才能发现更多的问题。

5.上代码:

#include <iostream>
using namespace std;

#define LIST_INIT_SIZE 100   //线性表存储空间的初始分配量
#define LISTINCREMENT 10     //线性表存储空间的分配增量
#define Maxsize 100

typedef struct
{
    int *elem;     //存储空间基值
    int length;    //当前长度
    int listsize;  //当前分配的存储容量
}SqList;




void InitList(SqList &L)   //构造一个空的线性表L
{
    L.elem = new int[LIST_INIT_SIZE];
    if(!L.elem)
        cout<<"Failure"<<endl;   //存储失败
    L.length = 0;  //空表长度为0
    L.listsize = LIST_INIT_SIZE;   //初始存储容量
}


int ListLength(SqList L)     //返回L中数据元素个数
{
    return L.length;
}


void GetElem(SqList L,int i,int &e)   //用e返回L中的第i个数据元素的值 下标-1
{
    e = L.elem[i-1];
}


int LocateElem(SqList L,int e)   //判断a中是否含有e ,有返回1,没有返回0
{
    int i;
    for(i = 0; i < L.length; i++)
    {
        if(L.elem[i] == e)
            return 1;
    }
    return 0;
}




void ListInsert(SqList &L,int i,int e)   //在第i个位置之前插入新元素e
{
    int k;
    for( k = L.length-1; k>= i-1; k--)    //插入位置后数据元素向后移动一位
        L.elem[k+1] = L.elem[k];

    L.elem[i-1] = e;
    L.length++;
}



void InputList(SqList &L)   //输入线性表内容
{
    int n,i = 0;   //n表示总数
    cout<<"please input the total number of List:"<<endl;
    cin>>n;
    while(n>L.listsize)
    {
        int * newbase;
        newbase=(int *)realloc(L.elem,(L.listsize+LISTINCREMENT) *sizeof(int));
        //realloc更改已经配置的内存空间
        if(!newbase)
            exit(0);
        L.elem = newbase;   //*elem就是新的空间大小了
        L.listsize += LISTINCREMENT;

    }
    
    cout<< "Please input "<<n<<" numbers:"<<endl;
    while(n--)
    {
        cin>>L.elem[i];
        L.length++;
        i++;
    }
}


void OutputList(SqList L)   //输出线性表元素
{
    int i;
    for(i = 0; i < L.length; i++)
        cout<<L.elem[i]<<" ";
    cout<<endl;
}



void Union(SqList L1,SqList L2,SqList &L3)   //合并
{
    int L1_len,L2_len,L3_len,i,e;
    L1_len = ListLength(L1);
    L2_len = ListLength(L2);
    for(i = 0; i < L1_len; i++)    //把L1的值全部赋到L3里
    {
        L3.elem[i] = L1.elem[i];
        L3.length++;
    }
    L3_len = ListLength(L3);
    for(i = 1; i <= L2_len; i++)    //线性表从1开始 GetELem中下标-1
    {
        GetElem(L2, i, e);   //取L2中第i个数据元素赋值给e
        if(!LocateElem(L3, e))   //判断L3中是否含有e ,有返回1,没有返回0
            ListInsert(L3, ++L3_len, e);   //L3中不存在与e相同的元素 则插入L3中

    }
}


void Delete(SqList L)     //释放elem的空间
{
    delete L.elem;
}





int main()
{
    SqList L1,L2,L3;
    InitList(L1);
    InitList(L2);
    InitList(L3);
    InputList(L1);
    InputList(L2);
    Union(L1,L2,L3);
    cout <<"After combining the result is:"<<endl;
    OutputList(L3);
    Delete(L1);
    Delete(L2);
    Delete(L3);
}

6.运行结果(贴图
在这里插入图片描述

帮助到你请点赞➕收藏➕关注哦~

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值