数据结构 不定长顺序表的基本操作

---------------start reading---------------

前言

线性表是数据结构的基础,线性表是一种线性结构,有一个前驱,有一个后记。线性表又分为顺序表(顺序结构)和链表(链式结构)。
今天我们来看看不定长顺序表的基本操作。

顺序表的基本操作

顺序结构是逻辑相邻,物理上也相邻,也就是说地址相邻,所以说我们可以把顺序表看成一个没有结尾的数组,如图

在这里插入图片描述
定义一个数组存放数据,一个有效数据的长度,还有一个为当前数组的长度(用来判断是否需要添加动态内存)

下面是顺序表基本操作的头文件(必须要将头文件放到所在工程文件夹中,否则引用头文件时会找不到文件)

#pragma once
//不定长顺序表
typedef struct 
{
	int *elem;//指向动态内存的指针
	int length;//有效数据个数
	int listsize;//总单元个数
}DSeqList,*PDSeqList;//PDSeqList就是一个指针

#define INITSIZE 10   //初始化大小

void InitDSeqList(PDSeqList ps);

//将val插入在ps表中的pos位置
bool Insert(PDSeqList ps,int val,int pos);

bool Insert_begin(PDSeqList ps,int val);

bool Insert_end(PDSeqList ps,int val);

//查找ps中第一个key的下标
int Search(PDSeqList ps,int key);

//删除ps中的第一个key
bool Delete(PDSeqList ps,int key);

//删除ps中第pos位置的数据
bool DeletePos(PDSeqList ps,int pos);

bool IsEmpty(PDSeqList ps);

//清空数据
void Clear(PDSeqList ps);

//销毁整个结构
void Destroy(PDSeqList ps);

int GetLength(PDSeqList ps);

void Show(PDSeqList ps);

接下来是具体实现

#include <stdlib.h>  
#include <stdio.h>
#include <assert.h>
#include "desqlist.h"

void InitDSeqList(PDSeqList ps)
{
	assert(ps != NULL);

	ps->elem = (int *)malloc(INITSIZE *sizeof(int));
	ps->length = 0;
	ps->listsize = INITSIZE;
}

//判空,静态函数(自己用的函数,相当于辅助工具)
static bool IsFull(PDSeqList ps)
{
	return ps->length == ps->listsize;
}

//将ps的容量扩大到原来的2倍//静态函数
static void Inc(PDSeqList ps)
{
	ps->elem = (int *)realloc(ps->elem,ps->listsize*2*sizeof(int));
	ps->listsize *= 2;
}

//将val插入在ps表中的pos位置
bool Insert(PDSeqList ps,int val,int pos)//O(n)
{
	if(pos<0 || pos>ps->length)
	{
		return false;
	}
	if(IsFull(ps))//判断顺序表是否满
	{
		Inc(ps);
	}

	for(int i=ps->length-1;i>=pos;i--)
	{
		ps->elem[i+1] = ps->elem[i];
	}
	ps->elem[pos] = val;
	ps->length++;

	return true;
}

bool Insert_begin(PDSeqList ps,int val)//O(n)
{
	return Insert(ps,val,0);
}

bool Insert_end(PDSeqList ps,int val)//O(1)
{
	return Insert(ps,val,ps->length);
}

//查找ps中第一个key的下标
int Search(PDSeqList ps,int key)
{
	for(int i=0;i<ps->length;i++)
	{
		if(ps->elem[i] == key)
		{
			return i;
		}
	}
	return -1;
}

//删除ps中的第一个key
bool Delete(PDSeqList ps,int key)
{
	int index = Search(ps,key);
	return DeletePos(ps,index);
}

//删除ps中第pos位置的数据
bool DeletePos(PDSeqList ps,int pos)
{
	if(pos<0 || pos>=ps->length)
	{
		return false;
	}
	for(int i=pos;i<ps->length-1;i++)
	{
		ps->elem[i] = ps->elem[i+1];
	}
	ps->length--;

	return true;
}

bool IsEmpty(PDSeqList ps)
{
	return ps->length == 0;
}

//清空数据
void Clear(PDSeqList ps)
{
	ps->length = 0;//ps->length == (*ps).length//直接把有效数据置成0,就表示里面没有有效数字
}

//销毁整个结构
void Destroy(PDSeqList ps)
{
	free(ps->elem);//1
	ps->elem = NULL;//2
	ps->length = 0;//3
	ps->listsize = 0;//4
	//ps = NULL;//5,没有意义
}

int GetLength(PDSeqList ps)
{
	return ps->length;
}

void Show(PDSeqList ps)
{
	for(int i=0;i<ps->length;i++)
	{
		printf("%d ",ps->elem[i]);
	}
	printf("\n");
}

注意理解删除和插入
删除直接覆盖数据,改length
插入先移位再插入,改length

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值