顺序表的概念:
顺序表是指按顺序存储结构存储的线性表,顺序表中的结点在内存中占用一段连续的存储单元。逻辑上相邻的数据元素,物理上也相邻。在顺序存储结构中有如下关系:
Loc(ai) = Loc(a1)+(i-1)length(1<=i<=n),其中Loc(a1)的地址为add,即只要知道顺序表的首地址和每个数据元素所占地址的单元个数,就可以求出第i个数据元素的地址。
顺序表的优点:
- 方法简单
- 存储密度大
- 查找速度快,时间复杂度小
顺序表的缺点:
- 执行效率低
- 需要预先分配适当的存储空间
插入操作思想:
- 判断位置合法性(i<1||L->i>length+1),若满足这个条件就报错,否则进行下面的操作
- 从所要插入数据元素的位置i到表尾的所有数据元素均需要向后移动一个存储位置, 以便能够给新插入的数据元素留出一个位置;(注:如往所插入的数据元素后一个移动,则会使后面一个结点的数据域的数据被覆盖掉)
- 这时会空出一个存储位置,将新的结点插入到空余位置i处
- 表的长度需要加一
具体代码实现(c语言):
/* 顺序表的创建及基本操作 */
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
// 定义符号常量
#define LIST_INIT_SIZE 60
#define LISTINCREMENT 15
#define OK 1
#define ERROR 0
#define OVERFLOW -1
// 定义元素类型
typedef int ElemType;
// 定义顺序表类型
typedef struct {
ElemType *elem; // 顺序表元素
int length; // 顺序表长度
int listsize; // 顺序表存储容量
} SqList;
// 构造空顺序表
int InitList(SqList *L)
{
// 获取顺序表基址
L->elem = (ElemType *) malloc(sizeof(ElemType));
// 存储空间分配失败
if (!L->elem) return ERROR;
// 空表长度为0
L->length = 0;
// 分配给空表的存储容量
L->listsize = LIST_INIT_SIZE;
// 初始化成功
return OK;
}
// 获取顺序表第i个元素
ElemType GetListElem(SqList *L, int i)
{
// 检查i的合法性
if (i < 1 || i > L->length)
return ERROR;
else
return L->elem[i-1];
}
// 定位目标元素在顺序表中位置
int LocateListElem(SqList *L, ElemType e)
{
int i = 1;
// 定义指针p,指向第一个元素
ElemType *p = L->elem;
// 目标元素依次与顺序表元素比较
while (*p != e && i <= L->length)
{
i++;
p++;
}
if (i > L->length)
return 0;
else
return i;
}
// 在顺序表第i个位置插入元素
int InsertListElem(SqList *L, int i, ElemType e)
{
int k;
// 位置合法性判断
if (i < 1 || i > L->length + 1) return ERROR;
// 顺序表空间满,按增量重新分配
if (L->length >= L->listsize)
{
// 增加LISTINCREMENT个元素元素,获取顺序表新基址
L->elem = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));
if (!L->elem) return ERROR;
// 按增量修改存储空间大小
L->listsize += LISTINCREMENT;
}
// 元素后移1位
for (k = L->length - 1; k >= i - 1; k--)
L->elem[k + 1] = L->elem[k];
// 插入元素
L->elem[i-1] = e;
// 顺序表长度加1
L->length++;
// 插入成功
return OK;
}
// 删除顺序表第i个元素
int DeleteListElem(SqList *L, int i)
{
int k;
// 判断位置合法性
if (i < 1 || i >L->length) return ERROR;
// 元素前移1位
for (k = i; k <= L->length; k++)
L->elem[k-1] = L->elem[k];
// 顺序表长度减1
L->length--;
// 删除成功
return OK;
}
// 修改顺序表第i个元素
int UpdateListElem(SqList *L, int i, ElemType e)
{
// 判断位置合法性
if (i < 1 || i >L->length) return ERROR;
// 修改第i个元素值
L->elem[i-1] = e;
// 修改成功
return OK;
}
// 输出顺序表全部元素
void PrintList(SqList *L)
{
int i;
if (L->length == 0)
printf("\n顺序表为空\n");
else
for (i = 1; i <= L->length; i++)
printf("%d ", L->elem[i-1]);
printf("\n");
}
int main()
{
int i, select, position;
ElemType data, elem;
int isRunning = 1;
SqList *pl = (SqList *)malloc(sizeof(SqList));
while(isRunning)
{
printf("------------------------------\n");
printf("1. 创建一个空顺序表\n");
printf("2. 输出顺序表的全部数据\n");
printf("3. 查询顺序表某个位置的数据\n");
printf("4. 查询数据在顺序表中的位置\n");
printf("5. 向顺序表指定位置插入数据\n");
printf("6. 删除顺序表指定位置的数据\n");
printf("7. 更新顺序表指定位置的数据\n");
printf("8. 退出顺序表操作演示程序\n");
printf("------------------------------\n");
printf("\n输入1-8,选择所需的功能号:");
scanf("%d", &select);
printf("\n您选择的功能号为:%d\n", select);
switch(select)
{
case 1:
if (InitList(pl))
printf("\n顺序表创建成功\n");
else
printf("\n顺序表创建失败\n");
system("pause");//这个是重点,圈上,它的功能主要是显示出主菜单的界面
break;
case 2:
PrintList(pl);
system("pause");
break;
case 3:
printf("i=");
scanf("%d", &i);
elem = GetListElem(pl, i);
if (elem)
printf("L[%d]=%d\n\n", i, elem);
else
printf("输入的位置不合法");
system("pause");
break;
case 4:
printf("data=");
scanf("%d", &data);
position = LocateListElem(pl, data);
if (position)
printf("%d is at [%d] of the list.\n\n", data, position);
else
printf("%d is not in the list.\n\n", data);
system("pause");
break;
case 5:
printf("i,data=");
scanf("%d,%d", &i, &data);
if (InsertListElem(pl, i, data))
printf("\n数据插入成功\n");
else
printf("\n数据插入失败\n");
system("pause");
break;
case 6:
printf("i=");
scanf("%d", &i);
if (DeleteListElem(pl, i))
printf("\n数据删除成功\n");
else
printf("\n数据删除失败\n");
system("pause");
break;
case 7:
printf("i,data=");
scanf("%d,%d", &i, &data);
if (UpdateListElem(pl, i, data))
printf("\n数据更新成功\n");
else
printf("\n数据更新失败\n");
system("pause");
break;
case 8:
isRunning = 0;
break;
}
}
printf("\n谢谢使用\n");
return 0;
}
觉得不错的朋友请点个赞再走吧,期待下次相遇!有疑问欢迎在下方留言