1.顺序表的定义
#define LIST_INIT_SIZE 100
typedef char ElemType;
typedef struct
{
ElemType data[LIST_INIT_SIZE];//存储顺序表元素空间
int length;//顺序表长度(以sizeof(ElemType)为单位)
}SqList;//顺序表类型定义
2.初始化顺序表
在主函数中利用malloc函数向堆区分配一个大小为Sqlist的空间并返回一个指向该内存空间的无类型的指针,利用强制转化,将指针转化为一个Sqlist*类型的指针,并赋值给L。
使用 初始化函数将顺序表的现有长度初始化0。
//构造一个空的顺序表L
void InitSqList(SqList *L)
{
L->length=0;//初始长度为0
}
3.增加元素
顺序表的添加可以想象成排队时有人插队。排队时每个人的位置都是固定的,当有人要插队时,那它插队时后面的每个人都要向后移动,不然没有位置让他插。
还需要判断插入的位置是否合法,比如那里本来就没人,你怎么去插队是吧。判断时还需注意数组下标是从0开始的,所以判断是否合法时,临界值要注意不能出错。
因此步骤是:判断插入位置是否合法->元素后移->最后插入。
//在顺序表L中第i(1≤i≤ListLength(L))个位置上插入新的数据元素e
void SqListInsert(SqList *L,int i,ElemType e)
{
int j;
if(i>=1&&i<=L->length+1)//判断i是否合法
{
i--;
for(j=L->length;j>i;j--)//找到插入的位置
L->data[j]=L->data[j-1];
L->data[i]=e;//将元素插入到已找到的适当位置
L->length++; //顺序表L长度增一
}
else
printf("i不符合要求");
}
这里if语句就是判断是否合法,for语句用来找到插入位置并后移元素,之后插入。
假设插入位置为3。
进行元素后移
最后进行添加。
4.显示顺序表中元素个数
这个没什么好说的,直接返回就行了。
//求顺序表L中数据元素个数
int SqListLength(SqList *L)
{
return L->length;
}
5.判断顺序表是否为空
这里根据顺表长度判断。返回值1代表不为空,返回值为0代表顺序表为空。
//判断顺序表L是否为空
int SqListEmpty(SqList *L)
{
//调用函数可通过判断函数返回值确定结果状态
if(L->length==0)//根据顺序表L当前长度判断
return 0;
else
return 1;
}
6.求顺序表特定位置的元素
这里同理,也要先判断位置是否合法。如果合法则直接返回该位置的元素。不合法则退出函数。
//求顺序表L中第i(1≤i≤ListLength(L))个数据元素的值
char GetSqListElem(SqList *L,int i,ElemType e)
{
if(i>=1&&i<=L->length)//判断i是否合法
{
e=L->data[i-1];//获取第i个元素的值
return e;
}
else
printf("i不符合要求");
}
7.求顺序表L中第1个与e的值相等的数据元素的位序
这里也很简单,直接遍历一遍顺序表,进行与e值得比较,那怎样判断顺序表中没有与e相等得元素呢?遍历结束时i值就等于顺序表得长度,因此可以根据i得值来判断。
//求顺序表L中第1个与e的值相等的数据元素的位序
int LocateSqListElem(SqList* L, ElemType e)
{
int i;
for (i = 0; L->data[i] != e && i < L->length; i++)//判断条件,在i合法的基础上逐个比较当前值与e值是否相等
;
if (i == L->length)//根据情况返回相应的值
return -1;
else
return i + 1;
}
8.删除指定位置得元素
删除元素时也可以想象成排队。正在排队时你前面的人走了,这时(你内心是不是很高兴)你立马向前走一步把那个空位补上,同理你后面的人也向前走补空位。因此删除时步骤:判断位置是否合法->合法则删除->补空位。
//删除顺序表L的第i(1≤i≤ListLength(L))个数据元素
void SqListDelete(SqList *L,int i)
{
int j;
if(i>=1&&i<=L->length)//判断i是否合法
{
i--;
for(j=i;j<L->length-1;j++)//找到插入的位置
L->data[j]=L->data[j+1];//元素前移
L->length--; //顺序表L长度减一
}
else
printf("i不符合要求");
}
9.销毁顺序表
主函数创建顺序表时,利用malloc函数向堆区申请了空间,堆区内存需要我们自己释放,因此销毁顺序表时,利用free函数将内存释放。
//销毁顺序表L
void DestroySqList(SqList *L)
{
free(L);
}
完整代码如下:
#include<stdio.h>
#include<malloc.h>
#define LIST_INIT_SIZE 100
typedef char ElemType;
typedef struct
{
ElemType data[LIST_INIT_SIZE];//存储顺序表元素空间
int length;//顺序表长度(以sizeof(ElemType)为单位)
}SqList;//顺序表类型定义
//基本操作算法代码实现
//构造一个空的顺序表L
void InitSqList(SqList* L)
{
L->length = 0;//初始长度为0
}
//销毁顺序表L
void DestroySqList(SqList* L)
{
free(L);
}
//判断顺序表L是否为空
int SqListEmpty(SqList* L)
{
//调用函数可通过判断函数返回值确定结果状态
if (L->length == 0)//根据顺序表L当前长度判断
return 0;
else
return 1;
}
//求顺序表L中数据元素个数
int SqListLength(SqList* L)
{
int l;
l = L->length;
return l;
}
//输出顺序表L中的元素
void DispSqList(SqList* L)
{
int i = 0;
while (i < L->length)//依次输出元素
{
printf("%c ", L->data[i]);
i++;
}
printf("\n");
}
//在顺序表L中第i(1≤i≤ListLength(L))个位置上插入新的数据元素e
void SqListInsert(SqList* L, int i, ElemType e)
{
int j;
if (i >= 1 && i <= L->length + 1)//判断i是否合法
{
i--;
for (j = L->length; j > i; j--)//找到插入的位置
L->data[j] = L->data[j - 1];
L->data[i] = e;//将元素插入到已找到的适当位置
L->length++; //顺序表L长度增一
}
else
printf("i不符合要求");
}
//删除顺序表L的第i(1≤i≤ListLength(L))个数据元素
void SqListDelete(SqList* L, int i)
{
int j;
if (i >= 1 && i <= L->length)//判断i是否合法
{
i--;
for (j = i; j < L->length - 1; j++)//找到插入的位置
L->data[j] = L->data[j + 1];//元素前移
L->length--; //顺序表L长度减一
}
else
printf("i不符合要求");
}
//求顺序表L中第i(1≤i≤ListLength(L))个数据元素的值
char GetSqListElem(SqList* L, int i, ElemType e)
{
if (i >= 1 && i <= L->length)//判断i是否合法
{
e = L->data[i - 1];//获取第i个元素的值
return e;
}
else
printf("i不符合要求");
}
//求顺序表L中第1个与e的值相等的数据元素的位序
int LocateSqListElem(SqList* L, ElemType e)
{
int i;
for (i = 0; L->data[i] != e && i < L->length; i++)//判断条件,在i合法的基础上逐个比较当前值与e值是否相等
;
if (i == L->length)//根据情况返回相应的值
return -1;
else
return i + 1;
}
//整体建立顺序表L
void CreateSqList(SqList* L, ElemType a[], int n)
{
for (int i = 0; i < n; i++)
L->data[i] = a[i];
L->length = n;//设置长度
}
//主函数
void main()
{
SqList* L = (SqList*)malloc(sizeof(SqList));
ElemType e = 0;
printf("1、初始化顺序表\n");
InitSqList(L);
printf("2、插入元素h、e、l、l、o\n");
SqListInsert(L, 1, 'h');//插入元素'h'
SqListInsert(L, 2, 'e');//插入元素'e'
SqListInsert(L, 3, 'l');//插入元素'l'
SqListInsert(L, 4, 'l');//插入元素'l'
SqListInsert(L, 5, 'o');//插入元素'o'
printf("3、顺序表元素为:");
DispSqList(L);//输出顺序表L
printf("4、长度为%d\n", SqListLength(L));//显示顺序表L中数据元素个数
printf("5、顺序表是否为空?");
if (SqListEmpty(L) == 1)//判断当前顺序表L的状态
printf("非空\n");
else
printf("空\n");
printf("6、顺序表的第5个元素是:%c\n", GetSqListElem(L, 5, e));//求顺序表L中第5个数据元素的值
printf("7、元素'h'的位置是:%d\n", LocateSqListElem(L, 'l'));//查找顺序表L中第1个与e的值相等的数据元素的位序
printf("8、删除第2个元素,并在第2个元素位置上插入‘w’元素\n");
SqListDelete(L, 2);//删除顺序表L的第2个数据元素
SqListInsert(L, 2, 'w');//在顺序表L中第2个位置上插入新的数据元素'w'
printf("输出当前顺序表:");
DispSqList(L);//输出顺序表L
printf("9、销毁顺序表");
DestroySqList(L);//销毁顺序表L
}