《数据结构》(C语言版)学习笔记——第2章 线性表(顺序表的基本操作)
2.4 线性表的顺序表示和实现
2.4.1 线性表的顺序存储表示
//定义顺序表
typedef struct
{
Elempty *elem;//存储空间的基地址
int length;//当前长度
}*SqList,LNode;//顺序表的结构类型
2.4.2 顺序表中基本操作的实现
可以看出, 当线性表以上述定义的顺序表表示时,某些操作很容易实现。 因为表的长度是顺序表的一个 “属性”,所以可以通过返回length的值实现求表长的操作, 通过判断length的值是否为0 判断表是否为空,这些操作算法的时间复杂度都是O(1)。下面讨论顺序表其他几个主要操作的实现。
算法2.1 顺序表的初始化
顺序表的初始化操作就是构造一个空的顺序表。
【算法步骤】
①为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。
②将表的当前长度设为0。
【算法描述】
Status InitList(SqList &L)
{
L = new LNode;//新建一个结点
L->elem= new ElemType[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
if (! L->elem) return ERROR; //存储分配返回ERROR
L->length=O; //空表长度为0
return OK;
}
算法2.2 顺序表的取值
【算法步骤】
①判断指定的位置序号 i 值是否合理 (1<=i<=L->length), 若不合理,则返回ERROR。
②若 i 值合理,则将第 i 个数据元素 L->elem[i-1]赋给参数 e, 通过 e返回第 1 个数据元素的值。
【算法描述】
Status GetElem(SqList L, int i, ElemType& e)
{
if (i<1 || i>L->length)
{
printf("查找位置非法,查找错误\n");
return ERROR;
}
else
{
e = L->elem[i - 1];
printf("%d\n", e);
return OK;
}
}
顺序表基本操作详细代码
#include <iostream>
#define OK 1
#define ERROR 0
using namespace std;
typedef int ElemType;
typedef int Status;
#define MAXSIZE 100
/*定义顺序表*/
typedef struct {
ElemType *elem;
int length;
}*SqList,LNode;
/*初始化顺序表*/
Status InitList(SqList& L)
{
L = new LNode;
L->elem = new ElemType[MAXSIZE];
if (!L->elem)
{
printf("初始化失败!\n");
return ERROR;
}
L->length = 0;
printf("初始化成功!\n");
return OK;
}
/*建立顺序表*/
Status CreatList(SqList& L, int a[], int n)
{
if (n > MAXSIZE)
{
printf("空间不足,无法建立顺序表! \n");
return ERROR;
}
for (int i = 0; i < n; i++)
L->elem[i] = a[i];
L->length = n;
return OK;
}
/*遍历操作*/
void PrintList(SqList L)
{
for (int i = 0; i < L->length; i++)
printf("%d ", (L->elem[i]));
}
/*取值(按位查找)*/
Status GetElem(SqList L, int i, ElemType& e)
{
if (i<1 || i>L->length)
{
printf("查找位置非法,查找错误\n");
return ERROR;
}
else
{
e = L->elem[i - 1];
printf("%d\n", e);
return OK;
}
}
/*查找(按值查找)*/
Status LocateElem(SqList L, ElemType e)
{
for (int i = 0; i < L->length; i++)
if (L->elem[i] == e) return i + 1; //查找成功, 返回序号 i + l
return ERROR;//查找失败
}
/*插入*/
Status ListInsert(SqList& L, int i, int e)
{//在顺序表 L 中第 l. 个位置之前插入新的元素 e, i值的合法范围是 1<=i<=L->length+l
if ((i < 1) || (i > L->length + 1)) return ERROR;//i值不合法
if (L->length == MAXSIZE) return ERROR;//当前存储空间已满
for (int j = L->length - 1; j >= i - 1; j--)
L->elem[j + 1] = L->elem[j];//插入位置及之后的元素后移
L->elem[i - 1] = e;//将新元素e放入第l个位置
++L->length; //表长加1
return OK;
}
/*删除*/
Status ListDelete(SqList& L, int i)
{//在顺序表L中删除第J.个元素,J.值的合法范围是1<=i<=L->length+l
if ((i < 1) || (i > L->length)) return ERROR;//i值不合法
for (int j = i; j <= L->length - 1; j++)
L->elem[j - 1] = L->elem[j];//被删除元素之后的元素前移
--L->length;//表长减1
return OK;
}
//测试主程序
int main()
{
int a[5] = { 1,3,2,5,4 };
int* p = new int;
SqList List1;
InitList(List1);//初始化
printf("给顺序表赋值:1 2 3 4 5\n遍历并输出顺序表:\n");
CreatList(List1, a, 5);//建立
PrintList(List1);//遍历输出此顺序表
printf("\n取第三位的值:\n");//按位取值
GetElem(List1, 3, *p);
if (LocateElem(List1, 4) == 0)printf("查无此值!\n");//按值查找
else printf("顺序表中值为4的序号为:\n%d\n", LocateElem(List1, 4));
ListInsert(List1, 2, 8);//在序号2位置上插入8
printf("在序号2位置上插入8:\n");
PrintList(List1);//遍历输出此顺序表
ListDelete(List1, 3);//删除序号5上的元素
printf("\n删除序号3上的元素:\n");
PrintList(List1);//遍历输出此顺序表
}
分类:
数据结构——学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)