线性表的顺序结构(顺序表)
顺序表,线性表的一种,其存储时需要开辟一块足够大的连续的空间,数据之间的存放是相连的,中间没有空隙。
顺序表的初始化:需要指定顺序表的大小,这个大小要足够大,还要将元素个数初始化为0。
按照位置查找元素:可以查找指定位置的元素,这个通过下标可以快速找到。常数时间复杂度。
查找指定元素的位置:给定一个元素,查找其所在的位置。这个可以从第一个元素开始,遍历所有元素进行查找,找到第一个后就可以返回。
插入元素:在指定位置插入元素。首先位置是要合法的,这个可以进行判断;在插入时,首先需要从最后一个元素开始,一直到插入位置的元素将它们向后移动一个位置。移动完毕后将要插入的元素写入到对应位置。当然元素个数也要相应的加一。
注:以上两图来自于LeetCode,链接:https://leetcode-cn.com/leetbook/read/array-and-string/yjcir/
删除元素:比插入要简单一点,直接将要删除元素后的元素向前移动一个位置就可以。元素个数要相应的减一。插入和删除要素要大量的进行元素的移动操作,这严重影响了顺序表的效率。
注:上图来自于LeetCode,链接:https://leetcode-cn.com/leetbook/read/array-and-string/yjcir/
以下代码根据某课程进行了少量的修改,有问题还请理解。
/*
线性表的顺序存储结构,数据在内存中是连续存储的,C语言中主要是通过数组来实现
其插入删除操作时,由于要进行大量的数据移动操作,涉及到大量的数据拷贝等工作,
所以效率比较低。以下代码实现了线性表顺序存储结构的初始化、查找、插入、删除等操作。
*/
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 100
#define LIST_INCREAMENT 10
typedef int ElemTYPE;
//顺序表的结构,包括数据,长度,表的大小
typedef struct SqList
{
ElemTYPE *elem;
int length;
int list_size;
} SqList, *Ptr;
typedef Ptr SqListPtr;
//状态
typedef enum Status
{
success,
fail,
range_error
} Status;
Status List_Init(SqListPtr L); //线性表顺序存储结构初始化生成一个空表
Status List_Retrivsl(SqListPtr L, int pos, ElemTYPE *elem); //按位置查找
Status List_Locate(SqListPtr L, ElemTYPE elem, int *pos); //按值查找位置
Status List_Insert(SqListPtr L, int pos, ElemTYPE elem); //插入元素
Status List_Delete(SqListPtr L, int pos); //删除元素
void print_data(SqListPtr L); //打印数据
int main()
{
SqListPtr list;
printf("initial data
");
List_Init(list);
printf("insert 5 data:
");
ElemTYPE data;
for (int i = 1; i < 6; i++)
{
scanf("%d", &data);
List_Insert(list, i, data);
}
print_data(list);
printf("
");
printf("delete data:
");
int pos;
scanf("%d", &pos);
List_Delete(list, pos);
print_data(list);
printf("
");
ElemTYPE elem;
printf("the position you will find:
");
scanf("%d", &pos);
List_Retrivsl(list, pos, &elem);
printf("%d
", elem);
printf("the element you will find:
");
scanf("%d", &elem);
List_Locate(list,elem,&pos);
printf("%d
",pos);
system("pause");
return 0;
}
Status List_Init(SqListPtr L)
{
Status s = success;
L->list_size = LIST_INIT_SIZE;
L->length = 0;
L->elem = (ElemTYPE *)malloc(sizeof(ElemTYPE) * L->list_size);
if (L->elem == NULL)
{
s = fail;
}
return s;
}
Status List_Retrivsl(SqListPtr L, int pos, ElemTYPE *elem)
{
Status s = range_error;
if (L)
{
if ((pos - 1) >= 0 && (pos - 1) < L->length)
{
*elem = L->elem[pos - 1];
s = success;
}
}
return s;
}
Status List_Locate(SqListPtr L, ElemTYPE elem, int *pos)
{
Status s = range_error;
if (L)
{
for (int i = 0; i < L->length; ++i)
{
if (L->elem[i] == elem)
{
*pos = i + 1;
s = success;
break;
}
}
}
else
{
s = fail;
}
return s;
}
Status List_Insert(SqListPtr L, int pos, ElemTYPE elem)
{
Status s = range_error;
if ((pos - 1) >= 0 && (pos - 1) <= L->length)
{
for (int i = L->length - 1; i >= pos - 1; --i)
{
L->elem[i + 1] = L->elem[i];
}
L->elem[pos - 1] = elem;
L->length++;
s = success;
}
else
{
s = fail;
}
return s;
}
Status List_Delete(SqListPtr L, int pos)
{
Status s = range_error;
if ((pos - 1) >= 0 && (pos - 1) <= L->length)
{
if (L && L->length > 0)
{
for (int i = pos; i < L->length; ++i)
{
L->elem[i - 1] = L->elem[i];
}
L->length--;
s = success;
}
}
else
{
s = fail;
}
return s;
}
void print_data(SqListPtr L)
{
for (int i = 0; i < L->length; i++)
{
printf("%d ", L->elem[i]);
}
}




鲁公网安备 37148202000241号