数据结构之动态开辟顺序表

**

1.定义一个动态顺序表

**

#pragma once
#define INIT_SIZE 10
typedef struct DSqlist
{
	int *elem;//存储数据的内存
	int usedsize;//有效数据个数
	int size;//总单元数
}DSqlist, *PDSqlist;

动态顺序表的elem是一个指针,这样就可以在队中进行灵活的开辟内存
并且需要有一个总单元数size记录当前有多少个单元通俗说也就是有多少个空格

2.动态顺序表的各种操作

void InitList(PDSqlist psq);
bool Insert(PDSqlist psq,int pos,int val);
int Search(PDSqlist Psq,int pos,int key);//查找 key 值
bool DeletePos(PDSqlist Psq,int pos,int *rtv);//删除 pos 位置的值
bool Delete(PDSqlist Psq,int pos,int key);//删除一个 key 值
void Clear(PDSqlist psq);
void Destroy(PDSqlist psq);
void Show(PDSqlist psq)

void InitList(PDSqlist psq)
{
	assert(psq != NULL);
	psq->elem = (int *)malloc(sizeof(int) * INIT_SIZE);
	assert(psq->elem != NULL);//判断是否开辟成功
	psq->usedsize = 0;
	psq->size = INIT_SIZE;
}
static bool isFull(PDSqlist psq)
{
	if (psq->usedsize == psq->size)
	{
		return true;
	}
	return false;
}
static void Inc(PDSqlist psq)
{
	int *p = (int *)realloc(psq->elem, psq->size*sizeof(int) * 2);
	if (p != NULL)
	{
		psq->elem = p;
	}
	psq->size *= 2;
}
bool Insert(PDSqlist psq, int pos, int val)
{
	if (isFull(psq))
	{
		Inc(psq);
	}
	for (int i = psq->usedsize - 1; i >= pos; i--)
	{
		psq->elem[i + 1] = psq->elem[i];
	}
	psq->elem[pos] = val;
	psq->usedsize++;
	return true;
}
static bool isEmpty(PDSqlist Psq) 
{
	return Psq->usedsize == 0;
}
int Search(PDSqlist Psq,int pos,int key)//查找 key 值
{
	if(pos < 0 || pos >= Psq->usedsize || isEmpty(Psq))
	{
		return -1;
	}
	for(int i = pos;i < Psq->usedsize;i++)
	{
		if(Psq->elem[i] == key)
		{
			return i;
		}
	}
	return -1;
}

bool DeletePos(PDSqlist Psq,int pos,int *rtv)//删除 pos 位置的值
{
	if(pos < 0 || pos >= Psq->usedsize || isEmpty(Psq))
	{
		return false;
	}
	if(rtv != NULL)
	{
		*rtv = Psq->elem[pos];
	}
	for(int i = pos;i < Psq->usedsize-1;i++)
	{
		Psq->elem[i] = Psq->elem[i+1];
	}
	Psq->usedsize--;
	return true;
}

bool Delete(PDSqlist Psq,int pos,int key)//删除一个 key 值
{
	int index = Search(Psq,pos,key);
	if(index == -1)
	{
		return false;
	}
	return DeletePos(Psq,index,NULL);
}

void Clear(PDSqlist psq)
{
	psq->usedsize = 0;
	//psq->size = 0;
}

void Destroy(PDSqlist psq)
{
	free(psq->elem);
	psq->elem = NULL;
	psq->usedsize = 0;
	psq->size = 0;
}

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

猜你喜欢

转载自blog.csdn.net/zhangfei5354/article/details/84869450
今日推荐