顺序表

14 阅读2分钟

两种创建方式,增删改查基本一样就写了一个。 特别简单没什么可讲的 比较值得注意的就是动态创建其实可以自动扩展,但是课上没讲我就没写。

还有一件事:插入删除等操作的具体描述是删除第i个元素还是删除下标为i的元素

//静态分配
#include<iostream>
using namespace std;
#define MaxSize 10	//顺序表的最大长度
typedef int ElemType;//定义顺序表的存储种类

//顺序表的创建
typedef struct {
	ElemType data[MaxSize];
	int length;//记录当前已存元素的个数
}SqList;

//顺序表的初始化函数
void InitList(SqList& L)
{
	for (int i = 0; i < MaxSize; i++)
	{
		L.data[i] = 0;
	}
	L.length = 0;
}

//注意:插入删除等操作的具体描述是删除第i个元素还是删除下标为i的元素


//顺序表的插入操作
//第i个元素下标对应的是i-1,要先把i-1后的所有元素依次后移
bool ListInsert(SqList& L, int i, ElemType e)//在第i个元素后插入e
{
	//先判断能否插入
	if (L.length == MaxSize && (i<1 || i>L.length+1))
	{
		return false;
	}
	for (int j = L.length; j >= i; j--)
	{
		L.data[j] = L.data[j - 1];
	}
	L.data[i - 1] = e;
	L.length++;
	return true;
}
//顺序表的删除操作
bool ListDelete(SqList& L, int i, int &e) //删除第i个元素,并用e来记录
{
	if (i<1 || i>L.length)
	{
		return false;
	}
	e = L.data[i - 1];
	for (int j = i; j < L.length; j++)
	{
		L.data[j - 1] = L.data[j];
	}
	L.length--;
	return true;
}

//顺序表的查找分为按位查找和按值查找
//按位查找:找第i位
//按照查找:找与目标值相等的元素

//按位查找
ElemType GetElem(SqList L, int i)
{
	return L.data[i - 1];
}

//按值查找返回位序即下标+1
int LocateElem(SqList L, ElemType e)
{
	for (int i = 0; i < L.length; i++)
	{
		if (L.data[i] == e)
		{
			return i+1;
		}
	}
	return 0;
}

//动态分配
#include<iostream>
using namespace std;
#define InitSize 10	//顺序表的初始长度
typedef int ElemType;//定义顺序表的存储种类
					
//顺序表的创建
typedef struct{
	ElemType* data;
	int Maxsize;//当前的最大长度
	int length;//当前已存的元素个数
}SeqList;

//顺序表的初始化
void DInitList(SeqList& L) {
	L.data = (ElemType*)malloc(sizeof(ElemType) * InitSize);
	L.length = 0;
	L.Maxsize = InitSize;
}

//动态增加长度
void IncreaseSize(SeqList& L, int len)	
{
	ElemType* p = L.data;
	L.data = (ElemType*)malloc(sizeof(ElemType) * (MaxSize + len));
	L.Maxsize += len;
	for (int i = 0; i < L.length; i++)
	{
		L.data[i] = p[i];
	}
	free(p);
}