不定长顺序表

一、不定长顺序表:与定长顺序表相比不定长顺序表的区别在于我们可以通过扩容来进行增添元素的存储单元。

二、不定长顺序表的结构:是对定长顺序表的一种改进,在初始时开辟内存被利用完后,还要继续插入数据时,这时候据需要扩容。故顺序表的结构设计就要发生变化。

三、不定长顺序表的操作:

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;
}

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值