一、不定长顺序表:与定长顺序表相比不定长顺序表的区别在于我们可以通过扩容来进行增添元素的存储单元。
二、不定长顺序表的结构:是对定长顺序表的一种改进,在初始时开辟内存被利用完后,还要继续插入数据时,这时候据需要扩容。故顺序表的结构设计就要发生变化。
三、不定长顺序表的操作:
1、初始化
2、判空
3、判满、扩容
4、任意pos位置的插入
5、删除key值
6、删除pos位置的数据
7、 获取任意位置的值
8、修改任意位置的值
9、查找数据,找到返回其下标,反之返回-1
10、打印顺序表
11、销毁
四、代码如下;
//dseqlist.h
#include<stdio.h>
#include<assert.h>
typedef struct DSeqlist
{
int *elem; //指向存储内存
int listsize; //总格子数
int length; //有效数据个数
}DSeqlist;
typedef DSeqlist *PDSeqlist;
void InitDSeqlist(PDSeqlist ps); //初始化
bool Insert(PDSeqlist ps,int pos,int val); //任意位置插入
//static void Expansion(PDSeqlist ps);
bool IsEmpty(PDSeqlist ps); //判空
//static bool IsFull(PDSeqlist ps); //判满
bool Delete(PDSeqlist ps,int key); //删除key值
bool DeletePos(PDSeqlist ps,int pos,int *rtval); //删除pos位置的值
int GetVal(PDSeqlist ps,int pos,int *rtval); //获取pos位置的数据
bool SetVal(PDSeqlist ps,int pos,int newval); //修改pos位置的数据
int Search(PDSeqlist ps,int key);//查找数据,找到:返回下标 找不到:返回-1
int GetLength(PDSeqlist ps); //求有效数据个数
void Show(PDSeqlist ps); //打印
void Destroy(PDSeqlist ps); //销毁
//dseqlist.c
#include"dseqlist.h"
#include<stdlib.h>
#define SIZE 10
void InitDSeqlist(PDSeqlist ps) //初始化
{
assert(ps != NULL);
if(ps == NULL)
{
return;
}
ps->elem = (int*)malloc(SIZE *sizeof(int));
ps->listsize = SIZE;
ps->length = 0;
}
bool IsEmpty(PDSeqlist ps) //判空
{
return ps->length == 0;
}
static bool IsFull(PDSeqlist ps) //判满
{
return ps->listsize == ps->length;
}
static void Expansion(PDSeqlist ps) //扩容
{
ps->elem = (int *)realloc(ps->elem,2*ps->listsize*sizeof(int));
ps->listsize *= 2;
}
bool Insert(PDSeqlist ps,int pos,int val) //任意位置插入
{
assert(ps != NULL);
if(IsFull(ps))
{
Expansion(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 Delete(PDSeqlist ps,int key) //删除key值
{
assert(ps != NULL);
if(IsEmpty(ps))
{
return false;
}
int i = Search(ps,key);
if(i > 0)
{
DeletePos(ps,i,NULL);
}
}
bool DeletePos(PDSeqlist ps,int pos,int *rtval) //删除pos位置的值
{
assert(ps != NULL);
if(pos < 0 || pos >= ps->length ||IsEmpty(ps))
{
return false;
}
if(rtval != NULL)
{
*rtval = ps->elem[pos];
}
for(int i=pos;i< ps->length;i++)
{
ps->elem[i] = ps->elem[i+1]; //移数据
}
ps->length--;
return true;
}
int GetVal(PDSeqlist ps,int pos,int *rtval) //获取pos下标存储的数据
{
if(pos < 0 || pos >= ps->length)
{
return false;
}
if(rtval != NULL)
{
*rtval = ps->elem[pos];
}
return *rtval;
}
bool SetVal(PDSeqlist ps,int pos,int newval)//修改pos位置的数据
{
if(pos < 0 || pos >= ps->length)
{
return false;
}
ps->elem[pos] = newval;
return true;
}
int Search(PDSeqlist ps,int key) //查找数据,找到:返回下标 找不到:返回-1
{
for(int i=0;i<ps->length;i++)
{
if(ps->elem[i] == key)
{
return i;
}
}
return -1;
}
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");
}
void Destroy(PDSeqlist ps) //销毁
{
ps->length = 0;
ps->listsize = 0;
ps->elem = NULL;
}
//main.c
#include<stdio.h>
#include"dseqlist.h"
int main()
{
DSeqlist plist;
InitDSeqlist(&plist); //测试初始化函数
for(int i=0;i<20;i++)
{
Insert(&plist,i,i); //测试插入函数,同时测试了扩容和判满
}
Show(&plist); //打印
Delete(&plist,13); //测试删除key函数
Show(&plist);
int a;
int *rtval = &a;
DeletePos(&plist,6,rtval); //测试删除pos位置的值函数
Show(&plist);
printf("%d\n",GetVal(&plist,8,rtval));//测试得到pos位置的数据的函数
printf("%d\n",GetVal(&plist,25,rtval));
SetVal(&plist,7,66); //测试修改pos位置的数据的函数
Show(&plist);
printf("%d ",Search(&plist,15)); //测试查找函数 找到
printf("%d ",Search(&plist,21)); //找不到
Destroy(&plist); //测试销毁函数
return 0;
}