【数据结构】顺序表的定义和基本操作

 

一、顺序表

1.1、顺序表的定义

顺序表——用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现

1.2、顺序表的实现

1.2.1、静态分配

顺序表的静态分配,即通过数组的方式来实现一个顺序表,特点是这个数组的长度大小在创建的时候确定了以后就无法更改。下面的代码表示创建了一个类型为"SqList"的静态分配的顺序表

tips:ElemType不代表具体的数据类型,可根据自身需要修改成其他类型

#define MaxSize 10            //定义最大程度
typedef struct{
    ElemType data[MaxSize];   //用静态的“数组”存放数据元素
    int lenth;                //顺序表的当前长度
}SqList;                      //顺序表的类型定义

 接下来我们通过具体的代码来表示静态分配的顺序表的创建和初始化

#define MaxSize 10
#include <stdio.h>
typedef struct {
	int data[MaxSize];		//用静态数组存放数据元素
	int length;				//顺序表的当前长度
}SqList;					//顺序表的类型定义
void InitList(SqList* L) {
	for (int i = 0; i < MaxSize; i++)
		L->data[i] = 0;     //初始化顺序表数据
	L->length = 0;		    //初始化顺序表长度
}

int main() {
	SqList L;           //声明一个顺序表
	InitList(&L);		//初始化顺序表
	return 0;
}

此时内存中地址的分配如图1

图1

 1.2.2、动态分配

顺序表的动态分配,通过malloc等函数创建容量可变的顺序表,下面的代码表示创建了一个类型为"SqList"的动态分配的顺序表

#define InitSize 10        //顺序表的初始长度
typedef struct{
    ElemType *data;        //指示动态分配数组的指针
    int MaxSize;           //顺序表的最大容量
    int length;            //顺序表的当前长度
}SeqList;                  //顺序表的类型定义

接下来我们通过具体的代码来表示动态分配的顺序表的创建和初始化

#define _CRT_SECURE_NO_WARNINGS 1
#define InitSize 10
#include <stdio.h>
typedef struct {
	int* data;				//指示动态分配数组的指针
	int MaxSize;			//顺序表的最大容量
	int length;				//顺序表的当前长度
}SqList;					//顺序表的类型定义
void InitList(SqList* L) {
	//使用malloc函数开辟一片连续的内存空间
	L->data = (int*)malloc(InitSize * sizeof(int));	  
	L->length = 0;
	L->MaxSize = 0;
}
void IncreaseList(SqList* L, int len) {
	int* p = L->data;		
	L->data = (int*)malloc((L->MaxSize + len) * sizeof(int));
	for (int i = 0; i < L->MaxSize; i++)
		p[i] = L->data[i];			//将数据复制到新区域
	L->MaxSize = L->MaxSize + len;
	free(p);					//释放p指针
}

int main() {
	SqList L;           //声明一个顺序表
	InitList(&L);		//初始化顺序表
	IncreaseList(&L, 5);    //增加顺序表容量
	return 0;
}

此时内存中地址的分配如下图2

 1.3、顺序表的基本操作

1.3.1、顺序表的插入和删除

下面通过代码详解

#define MaxSize 10
#include <stdio.h>
#include <stdbool.h>
typedef struct {
	int data[MaxSize];		//指示动态分配数组的指针
	int length;				//顺序表的当前长度
}SqList;					//顺序表的类型定义
void InitList(SqList* L) {
	for (int i = 0; i < MaxSize; i++)
		L->data[i] = 0;
	L->length = 0;
}
void ListInsert(SqList* L, int i, int e) {     //在第i位序插入数据元素e
	for (int j = L->length; j >= i; j--)
		L->data[j] = L->data[j - 1];
	L->data[i - 1] = e;
	L->length++;
}
bool ListDelete(SqList* L, int i,int *x) {
	if (i<1 || i>L->length)      //增加i不符合条件的情况,增加代码健壮性
		return false;
	*x = L->data[i - 1];
	for (int j = i; j < L->length; j++) {
		L->data[j - 1] = L->data[j];
	}
		return true;
	
}

int main() {
	SqList L;           //声明一个顺序表
	InitList(&L);		//初始化顺序表
	int x = 0;			//声明变量x存放被删除的元素 
	if (ListDelete(&L, 4, &x))
		printf("成功删除第4个元素,删除元素为%d\n", x);
	else
		printf("位序i不合法,删除失败\n");
	return 0;
}

1.3.2、顺序表的查找

①、按位查找
#define MaxSize 10
typedef struct{
    ElemType data[MaxSize];
    int length;
}SqList;

ElemType GetElem(SqList L,int i){
    return L->data[i-1];
}
②、按值查找
#define MaxSize 10
typedef struct{
    ElemType data[MaxSize];
    int length;
}SqList;

ElemType GetElem(SqList L,int i,int e){
    for(int i=0;i<L->length;i++){     //从第一个元素遍历查找
        if(L.data[i]==e)
            return i+1;        //返回查找的位序
        }
    return 0;            //查找失败,返回0
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值