(最详细!)数据结构实验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.运行结果(贴图)
帮助到你请点赞➕收藏➕关注哦~