1.采用动态分配存储空间
2.实现的功能如下:
- initList(SeqList *L) //初始化顺序表,构造一个空的线性表
- ShowList(SeqList* L) //遍历顺序表,返回个数
- GetEleByValue(SeqList& L, int e, int a[]) //按值查找并返回第一个位置和匹配个数
- ListInsert(SeqList &L,int position,ElementType &e) //指定位置插入
- ListDelet(SeqList &L,int position,ElementType &e) //指定位置删除,并返回该元素
- Destroy(SeqList &L) //销毁表
- isEmpty(SeqList &L) //判空表
#include"./pch.cpp"
//定义ElementType数据类型
typedef int ElementType;
//表长度的初始定义
#define InitSize 50
//定义顺序表
typedef struct {
ElementType *data;//数据项
int MaxSize, length;//表的最大个数,当前数量
}SeqList;
//初始化顺序表
void initList(SeqList *L) {
//c动态分配
//L->data = (ElementType*)malloc(sizeof(ElementType) * InitSize);
//c++动态分配
L->data = new ElementType[InitSize];
L->MaxSize = InitSize;
L->length = 0;
}
//遍历顺序表并输出个数
void ShowList(SeqList* L) {
for (int i = 0; i < L->length; i++)
{
cout << L->data[i] << " 、";
}
cout << "共:" << L->length << "个\n";
}
//按值查找:第一个匹配的元素以及总共匹配个数
//(数据是随机的,如果是顺序的应该使用折半查找)
void GetEleByValue(SeqList& L, int e, int a[]) {
//初始化数量和位置为0
a[0] = 0; a[1] = 0;
int firstPosition = 0;
for (int i = 0; i < L.length; i++)
{
if (L.data[i] == e)
{
//a数组第一个元素用于存储个数,第二个元素用来存储位置
a[0] += 1;
a[1] = i + 1;
}
if (a[0] == 1)
{
firstPosition = a[1];
}
}
a[1] = firstPosition;
}
//在顺序表插入元素
bool ListInsert(SeqList* L,int position,ElementType e) {
if (position<1||position>L->length+1)
{
cout << "位置不合法";
return false;
}
if (L->length>=InitSize)
{
cout <<"存储空间已满";
return false;
}
for (int j=L->length; j>=position;j--)
{
L->data[j] = L->data[j - 1];
}
L->data[position-1] = e;
L->length++;
return true;
}
//在顺序表中删除元素,并返回该元素
bool ListDelet(SeqList &L,int position,ElementType &e) {
if (position<1 || position>L.length)
{
cout << "删除位置不合法";
return false;
}
//将所要删除的元素值取出
e = L.data[position - 1];
for (int i = position; i <L.length ; i++)
L.data[i - 1] = L.data[i];
L.length--;
return true;
}
//销毁顺序表
void Destroy(SeqList &L) {
free(L.data);
L.data = NULL;
L.length = 0;
L.MaxSize = 0;
}
//判空操作
bool isEmpty(SeqList &L) {
if (L.length == 0)
return true;
else
return false;
}
//主函数
void main() {
//创建顺序表
SeqList L;
//初始化表
initList(&L);
//插入一个元素
if (ListInsert(&L,0,77))
cout << " 插入成功" << endl;
else
cout << " 插入失败" << endl;
//批量插入
int p[8] = { 12,34,22,564,3434,33,33,5 };
for (int i = 1; i < 9; i++)
{
if (ListInsert(&L, i, p[i - 1]) != true)
cout << "批量插入失败";
}
//遍历顺序表
ShowList(&L);
//按值查找元素
int result[2];
int target = 90;
GetEleByValue(L, target, result);
if (result[0])
cout <<"共匹配" <<result[0]<<"个"<<" /" << "首位为:" << result[1] << endl;
else
cout << "该元素不存在此表中" << endl;
//删除指定位置元素
ElementType e;
if (ListDelet(L, 4, e))
cout << "删除成功\n" << "该元素值为:" << e << endl;
ShowList(&L);
//销毁顺序表
Destroy(L);
ShowList(&L);
if (isEmpty(L))
cout << "顺序表为空" << endl;
else
cout << "顺序表不为空" << endl;
}
此代码部分借鉴于王道数据结构的线性表章节。
结果如下:
存在问题:1.对于判空操作是length为0还是此表为NULL?