#include<iostream>
using namespace std;
#include<stdlib.h>
typedef int ElemType;
struct List
{
ElemType *list; //存线性表元素的动态存储空间的指针
int size; //存线性表长度
int MaxSize; //规定list数组的长度
};
//初始化L为空
void InitList(List &L)
{
L.MaxSize = 10; //初始化长度
L.list = new ElemType[L.MaxSize]; //动态分配空间
if (L.list == NULL)
{
cout << "动态储存空间用完,退出运行!" << endl;
exit(1);
}
L.size = 0; //置线性表长度为0,即为空表
}
//清除L中所有元素
void ClearList(List &L)
{
if (L.list != NULL)
{
delete[]L.list;
L.list = NULL;
}
L.MaxSize = 0;
L.size = 0;
}
//返回L的长度
int LenthList(List &L)
{
return L.size;
}
//判断L是否为空
bool EmptyList(List &L)
{
return L.size == 0;
}
//返回L中第pos个元素的值
ElemType GetList(List &L, int pos)
{
if (pos<1 || pos>L.size)
{
cerr << "pos值无效!" << endl;
}
return L.list[pos - 1];
}
//遍历输出L中的所有元素
void TraverseList(List &L)
{
for (int i = 0; i<L.size; i++)
{
cout << L.list[i] << ' ';
}
cout << endl;
}
//从L中查找并返回元素
bool FindList(List &L, ElemType item)
{
for (int i = 0; i<L.size; i++)
{
if (L.list[i] == item)
{
item = L.list[i];
return true;
}
}
return false;
}
//修改L中的元素
bool UpdateList(List &L, const ElemType item)
{
for (int i = 0; i<L.size; i++)
{
if (L.list[i] == item)
{
L.list[i] = item; //更新
return true;
}
}
return false;
}
//向L中插入元素
bool InsertList(List &L, ElemType item, int pos)
{
//判断pos的值是否合法
if (pos<-1 || pos>L.size + 1)
{
cout << "pos的值不合法!" << endl;
return false;
}
int i; //循环变量
//判断插入的位置
if (pos == 0) //顺序插入
{
for (i = 0; i<L.size; i++)
{
if (L.list[i]>item)
break;
}
pos = i + 1;
}
else if (pos == -1) //插入表尾
{
pos = L.size + 1;
}
//如果空间用完,则重新分配大一倍的储存空间
if (L.size == L.MaxSize)
{
int k = sizeof(ElemType); //计算每个元素储存空间的长度
L.list = (ElemType*)realloc(L.list, 2 * L.MaxSize*k);
if (L.list == NULL)
{
cout << "可以空间用完,退出运行!" << endl;
exit(1);
}
L.MaxSize = 2 * L.MaxSize; //把线性表的空间大小修改为新的长度
}
//待插入位置的后续位置元素依次后移
for (i = L.size - 1; i >= pos - 1; i--)
{
L.list[i + 1] = L.list[i];
}
//把item的值赋给已空出的下标为pos-1的位置
L.list[pos - 1] = item;
L.size++; //线性表的长度加1
return true; //返回真,表示插入成功
}
//从L中删除元素
bool DeleteList(List &L, ElemType item, int pos)
{
if (L.size == 0) //检查线性表是否为空
{
cout << "线性表为空,删除无效!" << endl;
return false;
}
//判断pos的值是否合法
if (pos<-1 || pos>L.size + 1)
{
cout << "pos的值不合法!" << endl;
return false;
}
int i; //循环变量
//判断删除的位置
if (pos == 0) //按值删除
{
for (i = 0; i<L.size; i++)
{
if (L.list[i] == item)
break;
}
if (i == L.size) return false; //无元素可删除
pos = i + 1;
}
else if (pos == -1) //删除表尾元素
{
pos = L.size;
}
item = L.list[pos - 1]; //将被删除元素的值赋给变参item带回
//待删除位置的后续位置元素依次前移
for (i = pos; i<L.size; i++)
{
L.list[i - 1] = L.list[i];
}
L.size--; //线性表的长度减1
//如果剩余空间过大,进行缩小
if (float(L.size) / L.MaxSize<0.4 && L.size>10)
{
int k = sizeof(ElemType);
L.list = (ElemType*)realloc(L.list, L.MaxSize*k / 2);
}
L.MaxSize = L.MaxSize / 2; //把线性表的空间大小修改为新的长度
return true; //返回真,表示删除成功
}
//对L中的所元素按给定条件进行排序
void SortList(List &L)
{
int i, j;
ElemType x;
for (i = 1; i<L.size; i++) //共循环n-1次
{
x = L.list[i]; //把无序表中的第一个元素暂存x中
for (j = i - 1; j >= 0; j--) //向前属性进行比较和移动
{
if (x<L.list[j])
L.list[j + 1] = L.list[j];
else break;
}
L.list[j + 1] = x; //把x写入到已经空出的位置
}
}
关于线性表的具体操作方法
最新推荐文章于 2022-10-22 21:09:35 发布