文章目录
定长🔗:
【顺序表】定长 知识点(含代码实现)_又秃又弱的博客-CSDN博客
不定长即为当顺序表长度length与当前顺序表总容量listsize相等时,可以对顺序表进行动态扩容,增加顺序表的总容量。
一、存储结构
最大存储容量:INIT_SIZE
线性表的当前长度(有效个数长度):length
顺序表表总容量:listsize
#define INIT_SIZE 20
typedef struct DQList
{
int* elem;//动态内存的地址
int length;//有效数据的个数
int listsize;//总容量
}DSQList,*DPSQList
二、线性表操作
1.初始化
//初始化
void InitSqlist(DPSQList ps)
{
assert(ps != NULL);
if (ps == NULL)
{
return;
}
ps->elem = (int *)malloc(INIT_SIZE * sizeof(int));
ps->length = 0;
ps->listsize = INIT_SIZE;
}
2.判满
static bool IsFull(DPSQList ps)
{
return ps->length == ps->listsize;
}
3.扩容
用到realloc函数
static bool Inc(DPSQList ps)
{
ps->elem=(int *)realloc(ps->elem, ps->listsize * 2 * sizeof(int));//扩容机制
assert(ps->elem != NULL);
ps->listsize *= 2;
//ps->length;不变;
return true;
}
4.判空
//判空
bool IsEmpty(DPSQList ps)
{
return ps->length == 0;
}
5.插入
插入数据,在ps顺序表的pos位置插入val
bool Insert(DPSQList ps, int pos, int val)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
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;
}
6.查找
在ps查找第一个key值,找到返回下标,没有找到返回-1
int Search(DPSQList ps, int key)
{
assert(ps != NULL);
if (ps == NULL)
{
return -1;
}
for (int i = 0; i < ps->length; i++)
{
if (key == ps->elem[i])
{
return i;
}
}
return -1;
}
7.删除
删除pos位置的值
bool DelPos(DPSQList ps, int pos)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
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;
}
删除第一个val的值
bool DelVal(DPSQList ps, int val)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
int i = Search(ps, val);
if (i < 0)
{
return false;
}
return DelPos(ps, i);
}
8.查找前驱下标
返回key的前驱下标,如果不存在返回-1
int GetPrio(DPSQList ps, int key)
{
int i = Search(ps, key);
if (i <=0)//头没有前驱
{
return -1;
}
return i - 1;
}
9.查找后继下标
//返回key的后继下标,如果不存在返回-1;
int GetNext(DPSQList ps, int key)
{
int i = Search(ps, key);
if (i < 0 || i == ps->length - 1)//尾没有后继
{
return -1;
}
return i + 1;
}
10.输出
void Show(DPSQList ps)
{
assert(ps != NULL);
if (ps == NULL)
{
return;
}
for (int i = 0; i < ps->length; i++)
{
printf("%d ", ps->elem[i]);
}
printf("\n");
}
11.清空
//清空数据
void Clear(DPSQList ps)
{
ps->length = 0;
}
12.销毁
//销毁整个内存
void Destroy(DPSQList ps)
{
free(ps->elem);//1
ps->elem = NULL;//2
ps->length = 0;//3
ps->listsize = 0;//4
//ps = NULL;//5,无效代码
}
完整代码
dqlist.cpp
#include "dsqlist.h"
#include <assert.h>
#include <stdlib.h>
#include <stdio.h>
//初始化
void InitSqlist(DPSQList ps)
{
assert(ps != NULL);
if (ps == NULL)
{
return;
}
ps->elem = (int *)malloc(INIT_SIZE * sizeof(int));
ps->length = 0;
ps->listsize = INIT_SIZE;
}
static bool IsFull(DPSQList ps)
{
return ps->length == ps->listsize;
}
static bool Inc(DPSQList ps)
{
ps->elem=(int *)realloc(ps->elem, ps->listsize * 2 * sizeof(int));//扩容机制
assert(ps->elem != NULL);
ps->listsize *= 2;
//ps->length;不变;
return true;
}
//插入数据,在ps顺序表的pos位置插入val;
bool Insert(DPSQList ps, int pos, int val)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
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 IsEmpty(DPSQList ps)
{
return ps->length == 0;
}
//在ps查找第一个key值,找到返回下标,没有找到返回-1;
int Search(DPSQList ps, int key)
{
assert(ps != NULL);
if (ps == NULL)
{
return -1;
}
for (int i = 0; i < ps->length; i++)
{
if (key == ps->elem[i])
{
return i;
}
}
return -1;
}
//删除pos位置的值
bool DelPos(DPSQList ps, int pos)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
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;
}
//删除第一个val的值
bool DelVal(DPSQList ps, int val)
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
int i = Search(ps, val);
if (i < 0)
{
return false;
}
return DelPos(ps, i);
}
//返回key的前驱下标,如果不存在返回-1;
int GetPrio(DPSQList ps, int key)
{
int i = Search(ps, key);
if (i <=0)//头没有前驱
{
return -1;
}
return i - 1;
}
//返回key的后继下标,如果不存在返回-1;
int GetNext(DPSQList ps, int key)
{
int i = Search(ps, key);
if (i < 0 || i == ps->length - 1)//尾没有后继
{
return -1;
}
return i + 1;
}
//输出
void Show(DPSQList ps)
{
assert(ps != NULL);
if (ps == NULL)
{
return;
}
for (int i = 0; i < ps->length; i++)
{
printf("%d ", ps->elem[i]);
}
printf("\n");
}
//清空数据
void Clear(DPSQList ps)
{
ps->length = 0;
}
//销毁整个内存
void Destroy(DPSQList ps)
{
free(ps->elem);//1
ps->elem = NULL;//2
ps->length = 0;//3
ps->listsize = 0;//4
//ps = NULL;//5,无效代码
}