动态顺序表

本文介绍了动态顺序表的数据结构,包括其与静态顺序表的区别,以及初始化、销毁、打印、扩容、插入、删除等基本操作。并通过一个C语言示例展示了如何使用这些函数。
摘要由CSDN通过智能技术生成

 1、动态顺序表的基本结构

动态顺序表区别于静态顺序表,优势在于可以根据所需开辟新的内存去储存更多的数据

静态顺序表
struct SeqList
{
    SLDataType a[100]; //有限长度数组
    int size;        //存储数据个数
}
动态顺序表
typedef int SLDataType;

struct SeqList
{
	SLDataType* a; //动态数组
	int size;      //有效数据长度
	int capicity;  //容量
};

typedef struct SeqList SL;

2.基本接口函数

顺序表初始化

void SeqListInit(SL* sl)

void SeqListInit(SL* sl)
{
	sl->a = NULL;
	sl->size = 0;
	sl->capicity = 0;
}

顺序表销毁

void SeqListDestory(SL* sl);

void SeqListDestory(SL* sl)
{
	free(sl->a);
	sl->a = NULL;
	sl->size = 0;
	sl->capicity = 0;
}

注:开辟了动态顺序表,最后一定要销毁。否则,会内存泄漏。

顺序表打印

void SeqListPrint(SL* sl);

void SeqListPrint(SL* sl)
{
	for (int i = 0; i < sl->size; i++)
	{
		printf("%d ", sl->a[i]);
	}
	printf("\n");
}

检查空间,如果满了,进行增容

void CheckCapacity(SL* sl);

void CheckCapacity(SL* sl)
{
	if (sl->size == sl->capicity)
	{
		int newcapicity = sl->capicity == 0 ? 4 : sl->capicity * 2;
		SLDataType* tmp = (SLDataType*)realloc(sl->a,sizeof(SLDataType) * newcapicity);
		if (tmp == NULL)
		{
			printf("realloc fail!");
			exit(-1);
		}
		else
		{
			sl->a = tmp;
			sl->capicity = newcapicity;
		}
	}	
}

realloc函数:将分配内存重新分配,大小为第二个所传参数。若原指针未分配内存,直接分配内存。


顺序表尾插

void SeqListPushBack(SL* sl, SLDataType x);

void SeqListPushBack(SL* sl, SLDataType x)
{
	CheckCapacity(sl);
	sl->a[sl->size++] = x;
}
顺序表头插

void SeqListPushFront(SL* sl, SLDataType x);

void SeqListPushFront(SL* sl, SLDataType x)
{
	CheckCapacity(sl);
	int end = sl->size;
	while (end > 0)
	{
		sl->a[end] = sl->a[end - 1];
		end--;
	}
	sl->a[0] = x;
	sl->size++;
}
顺序表尾删

void SeqListPopBack(SL* sl);

void SeqListPopBack(SL* sl)
{
	assert(sl->size > 0);
	sl->size--;
}

顺序表头删

void SeqListPopFront(SL* sl);

void SeqListPopFront(SL* sl)
{
	assert(sl->size > 0);
	for (int i = 1; i < sl->size; i++)
	{
		sl->a[i - 1] = sl->a[i];
	}
	sl->size--;
}

顺序表查找

int SeqListFind(SL* sl, SLDataType x);

int SeqListFind(SL* sl, SLDataType x)
{
	for (int i = 0; i < sl->size; ++i)
	{
		if (sl->a[i] == x)
			return i;
	}
	return -1;
}

顺序表在pos位置插入x

void SeqListInsert(SL* sl, int pos, SLDataType x);

void SeqListInsert(SL* sl, int pos, SLDataType x)
{
	CheckCapacity(sl);
	int end = sl->size;
	while (end > pos)
	{
		sl->a[end] = sl->a[end - 1];
		end--;
	}
	sl->a[pos] = x;
	sl->size++;
}

顺序表删除pos位置的值

void SeqListErase(SL* sl, int pos);

void SeqListErase(SL* sl, int pos)
{
	for (int i = pos; i < sl->size - 1; i++)
	{
		sl->a[i] = sl->a[i + 1];
	}
	sl->size--;
}

3.动态顺序表的使用

int main()
{
	SL sl;
	SeqListInit(&sl);
	SeqListPushFront(&sl, 1);
	SeqListPushBack(&sl, 2);
	SeqListPushFront(&sl, 1);
	SeqListPushFront(&sl, 3);
	SeqListPushFront(&sl, 1);
	SeqListPushBack(&sl, 4);
	SeqListPopBack(&sl);
	int pos = SeqListFind(&sl, 3);//可嵌套使用
	SeqListInsert(&sl, pos, 7);   //SeqListInsert(&sl,SeqListFind(&sl, 3), 7);
	pos = SeqListFind(&sl, 1);
	SeqListErase(&sl, pos);       //SeqListErase(&sl, SeqListFind(&sl, 1));
	SeqListPrint(&sl);
	printf("%d", sl.size);
	SeqListDestory(&sl);
}


 

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值