数据结构_顺序表

一、定长顺序表

1. 采用结构体定义顺序表,定义顺序表的存放数据、有效数字个数以及结构体自身的指针,代码如下:

typedef struct SeqList
{
	int elem[SIZE];//存放数据
	int length;//有效数字个数
}SeqList,*PSeqList;

2. 顺序表的初始化,代码如下:

void InitSeqList(PSeqList ps)
{
	assert(ps != NULL);
	if(ps == NULL)
	{
		return ;
	}
	ps->length = 0;
}

3. 判满,代码如下:

static bool IsFull(PSeqList ps)
{
	return ps->length == SIZE;
}

4. 插入数据,代码如下:

bool Insert(PSeqList ps,int pos,int val)//插入数据必须连续
{
	assert(ps != NULL);
	if(pos<0 || pos>ps->length || IsFull(ps))
	{
		return false;
	}
	for(int i=ps->length-1;i>=pos;i--)//移动原有的数据
	{
		ps->elem[i+1] = ps->elem[i];
	}

	ps->elem[pos]  = val; //插入新数据

	ps->length++;//有效个数增加

	return true;
}

5. 按位删除,代码如下:

bool DeletePos(PSeqList ps,int pos)//todo
{
	assert(ps != NULL);
	if (pos<0 || pos >ps->length || IsEmpty(ps))
	{
		return false;
	}
	for (int i=pos; i<ps->length; i++)
	{
		ps->elem[i] = ps->elem[i+1];
	}
	ps->length--;
	return true;
}

6. 按关键字查找,代码如下:

int Search(PSeqList ps,int key)
{
	for(int i=0;i<ps->length;i++)
	{
		if(key == ps->elem[i])
		{
			return i;
		}
	}
	return -1;
}

7. 按关键字删除,代码如下:

bool DeleteVal(PSeqList ps,int key)//todo
{
	if (Search(ps, key) == -1)
	{
		return false;
	}
   DeletePos(ps, Search(ps, key));
}

8. 清除顺序表数据,代码如下:

void Clear(PSeqList ps)
{
	ps->length = 0;
}

9. 判空,代码如下:

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

10.获取顺序表有效长度,代码如下:

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

11. 打印顺序表,代码如下:

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

12. 摧毁顺序表,代码如下:

void Destroy(PSeqList ps)
{
	Clear(ps);
}

二、不定长顺序表
1. 采用结构体定义顺序表,定义顺序表的指向保存数据数组的地址、有效数据长度、当前分配给数据表的存储容量以及结构体自身的指针,代码如下:
typedef struct DSeqList
{
	int *elem;//指向保存数据数组的地址
	int length;//有效数据个数
	int listsize;//总格子数
}DSeqList,*PDSeqList;
2. 顺序表的初始化,代码如下:
void InitSeqList(PDSeqList ps)
{
	assert(ps != NULL);
	ps->elem = (int *)malloc(INITSIZE * sizeof(int));
	ps->length = 0;
	ps->listsize = INITSIZE;
}
3. 判满,代码如下:
static bool IsFull(PDSeqList ps)
{
	return ps->length == ps->listsize;//和定长有区别
}
4. 扩容,代码如下:
static void Inc(PDSeqList ps)//将总格子数扩到到原来的2倍
{
	ps->elem = (int *)realloc(ps->elem,ps->listsize*2 * sizeof(int));
	ps->listsize *= 2;
}
5. 插入数据,代码如下:
bool Insert(PDSeqList ps,int pos,int val)
{
	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. 按位删除,代码如下:
bool DeletePos(PDSeqList ps,int pos)
{
	if (pos<0 || pos>ps->length || IsEmpty(ps))
	{
		return false;
	}
	for (int i=pos; i<ps->length; i++)
	{
		ps->elem[i] = ps->elem[i+1];
	}
	ps->length--;
	return false ;
}
7. 按关键字查找,代码如下:
int Search(PDSeqList ps,int key)
{
	for(int i=0;i<ps->length;i++)
	{
		if(key == ps->elem[i])
		{
			return i;
		}
	}
	return -1;
}
8. 按关键字删除,代码如下:
bool DeleteVal(PDSeqList ps,int key)//todo
{
	if (Search(ps, key) == -1)
	{
		return false;
	}
   DeletePos(ps, Search(ps, key));
}
9. 清楚顺序表数据,代码如下:
void Clear(PDSeqList ps)
{
	ps->length = 0;
}
10. 判空,代码如下:
bool IsEmpty(PDSeqList ps)
{
	return ps->length == 0;
}
11. 获取顺序表有效长度,代码如下:
int GetLength(PDSeqList ps)
{
	return ps->length;
}
12. 打印顺序表,代码如下:
void Show(PDSeqList ps)
{
	for(int i=0;i<ps->length;i++)
	{
		printf("%d ",ps->elem[i]);
	}
	printf("\n");
}
13. 摧毁顺序表,代码如下:
void Destroy(PDSeqList ps)
{
	free(ps->elem);
	ps->elem = NULL;
	ps->length = 0;
	ps->listsize = 0;
}































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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值