01.数据结构——顺序表(动态)(初始化、增、删、查、改)


提示:个人学习记录,日后复习 仅供参考

一、顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

顺序表:可动态增长的数组,要求数据是连续存储的

二、顺序表定义

动态顺序表

typedef int SeqListDataType;

typedef struct SeqList {
	SeqListDataType* arr;    //动态开辟的数据
	int size;               //有效数据个数
	int capacity;           //容量
}SeqList;

工程结构
博主使用的是VS2019

在这里插入图片描述

SeqList.h:头文件的引用,顺序表的定义,接口声明
SeqList.c:顺序表接口的实现
test.c:主函数,测试接口

顺序表头文件代码SeqList.h如下

#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

typedef int SeqListDataType;

typedef struct SeqList {

	SeqListDataType* arr;
	int size;
	int capacity;

}SeqList;

//初始化
void SeqListInit(SeqList* ps);

//销毁
void SeqListDestory(SeqList* ps);

//扩容
void BuySeqList(SeqList*ps);

//尾插
void SeqListPushBack(SeqList*ps, SeqListDataType x);

//尾删
void SeqListPopBack(SeqList *ps);

//头插
void SeqListPushFront(SeqList* ps, SeqListDataType x);

//头删
void SeqListPopFront(SeqList* ps);

//遍历
void SeqListPrint(SeqList * ps);

//指定位置插
void SeqListInsert(SeqList * ps ,int pos, SeqListDataType x);

//指定位置删
void SeqListErase(SeqList* ps, int pos);

//修改指定下标位置值
void SeqListModify(SeqList* ps, int pos, SeqListDataType x);

//查找指定值,返回下标
int SeqListFind(SeqList * ps ,SeqListDataType x);

//查看数据个数
int SeqListSize(SeqList * ps);

三、接口实现(增删改查)

1.初始化顺序表

//初始化
void SeqListInit(SeqList* ps) {
	assert(ps);
	ps->arr = (SeqListDataType*)malloc(sizeof(SeqListDataType)*4);
	ps->size = 0;
	ps->capacity = 4;
};

2.销毁顺序表

//销毁
void SeqListDestory(SeqList* ps) {
	ps->capacity = 0;
	ps->size = 0;
	free(ps->arr);
};

3.遍历顺序表(打印)

//遍历
void SeqListPrint(SeqList* ps) {
	int size = 0;
	for(size = 0; size < ps->size; size++) {
		printf("%d ",ps->arr[size]);
	}
	printf("\n");
};

4.扩容

//扩容
void BuySeqList(SeqList* ps) {
	assert(ps);
	
	if (ps->size>=ps->capacity) {
		ps->capacity *= 2;
		SeqListDataType* size = (SeqListDataType*)realloc(ps->arr,sizeof(SeqListDataType)*ps->capacity);
		if (size==NULL) {
			perror("realloc");
			return;
		}
		ps->arr = size;
	}
};

5.顺序表尾插

//尾插
void SeqListPushBack(SeqList* ps, SeqListDataType x) {
	assert(ps);

	BuySeqList(ps);
	ps->arr[ps->size] = x;
	ps->size++;
};

6.顺序表尾删

//尾删
void SeqListPopBack(SeqList* ps) {
	assert(ps);
	ps->size--;
};

7.顺序表头插

//头插
void SeqListPushFront(SeqList* ps, SeqListDataType x) {
	assert(ps);

	BuySeqList(ps);
	int size = ps->size;
	while (size--) { 
		ps->arr[size+1] = ps->arr[size ];
	}
	//以上循环执行完,size是-1
	ps->arr[size+1] = x;
	ps->size++;
};

8.顺序表头删

//头删
void SeqListPopFront(SeqList* ps) {
	assert(ps);

	int size = 0;
	for (size = 0; size < ps->size - 1;size++) {
		ps->arr[size] = ps->arr[size + 1];
	}
	ps->size--;
};

9.指定位置插入数据

//指定位置插
void SeqListInsert(SeqList* ps, int pos,SeqListDataType x) {

	assert(ps);
	assert(pos>=0 && pos<=ps->size);
	BuySeqList(ps);
	
	int size = ps->size;
	while (size>pos-1) {
		ps->arr[size] = ps->arr[size - 1];
		size--;
	}
	ps->arr[size] = x;
	ps->size++;

};

10.指定位置删除数据

//指定位置删
void SeqListErase(SeqList* ps, int pos) {
	assert(ps);

	int size = pos - 1;
	for (size; size < ps->size; size ++) {
		ps->arr[size] = ps->arr[size + 1];
	}
	ps->size--;
};

11.指定位置修改数据

//修改指定下标位置值
void SeqListModify(SeqList* ps, int pos, SeqListDataType x) {

	assert(ps);
	assert(pos>=0&&pos<=ps->size);

	ps->arr[pos] = x;
};

12.返回顺序表有效数据个数

//查看数据个数
int SeqListSize(SeqList* ps) {
	assert(ps);
	return ps->size;
};

13.查找指定数据(返回下标)

//查找指定值,返回下标
int SeqListFind(SeqList* ps, SeqListDataType x) {

	assert(ps);

	int size = 0;
	for (size; size < ps->size;size++) {
		if (ps->arr[size]==x) {
			return size;
		}
	}
	return -1;   //没找到
};

总结

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值