顺序表实现增删查改

本文摘要

1.顺序表的概念

2.顺序表结构的定义

3.动态顺序表的操作实现

 

顺序表的概念

顺序表是一种数据结构,是数据的存储方式。

顺序表是改善了数组的缺点,相对增加了灵活性,使用户能够实现增删查改的操作。

顺序表分为静态顺序表和动态顺序表。

                        

顺序表的定义

//静态顺序表
#define N 100
typedef int STDataType;

typedef struct StaticSeqList{
    STDataType arr[N];    //给定数组大小
    size_t size;        //顺序表的大小
    
}StaticSeqList;

//动态顺序表

typedef struct SeqList{
    STDataType* arr;
    size_t size;        //有效元素个数
    size_t capacity;    //顺序表的容量
};

动态顺序表的操作实现

一般对数据的操作有增删查改,初始化和销毁,因为生活中动态顺序表的使用场景较多,这里只实现对动态顺序表的管理。

在对顺序表的操作过程中,要注意两点:

1.添加数据时判断顺序表是否需要增容,否则会发生数组越界。

2.删除数据时,要检查顺序表是否为空.

3.顺序表大小psl->size和数组psl->arr的大小关系:顺序表中第size个数对应的数组为psl->arr[psl->size - 1].

 

增加数据:每次操作顺序表大小加一

每次增加数据时都要检查函数容量是否够用

                         

//尾插
void SeqListPushBcak(SeqList* psl, STDataType x){
	assert(psl);

    SeqListCheckCapacity(&s1);
	psl->arr[psl->size] = x;
	psl->size++;
	
	return;
}

//头插
void SeqListPushFront(SeqList* psl, STDataType x){
	assert(psl);
    
    SeqListCheckCapacity(&s1);
	size_t i = psl->size;
	for (; i > 0; i--);
		psl->arr[i + 1] = psl->arr[i];

	psl->arr[0] = x;
	psl->size++;
}

//	在指定位置插入,然后将其后面的数依次往后。
void SeqListInsert(SeqList* psl, size_t pos, STDataType x){
	assert(psl);
    
    SeqListCheckCapacity(&s1);
	size_t end = psl->size;
	if (pos == end){
		psl->arr[pos] = x;
		psl->size++;
	}
	else if (pos < psl->size){
		size_t i = psl->size;
		while (pos < i){
			psl->arr[i] = psl->arr[i - 1];
			i--;
		}
		psl->arr[pos - 1] = x;
		psl->size++;
	}
}

删除操作:每次操作顺序表大小减一

每次

                                  

//删除任意位置的数
void SeqListErase(SeqList* psl, size_t pos){
	assert(psl);

	//pos在数组中是下一个数,删除之后,依次往前挪。
	//pos 和 psl->size 的大小一致
	if (pos == psl->size){
		psl->size--;
	}
	else if (pos < psl->size){
		size_t i = pos;
		while (i < psl->size){
			psl->arr[i - 1] = psl->arr[i];
			i++;
		}
		psl->size--;
	}
}

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

	//一次往前挪其他元素。
	size_t i;
	for (i = 0; i < psl->size; i++){
		psl->arr[i] = psl->arr[i + 1];
	}
	psl->size--;
}

//尾删
void SeqListPopBack(SeqList* psl){
	assert(psl);

	//只需要将大小减一就可以了
	psl->size--;
}

查找某个数:

                            

//查找某个数的位置
int SeqListFind(SeqList* psl, STDataType x){
	assert(psl);

	//遍历顺序表中的,size的大小可以作为边界
	size_t i = 0;
	while (i < psl->size){
		if (psl->arr[i] == x)
			return i + 1;
		else
			i++;
	}
	return -1;	//没找到
}

修改数据:

初始化顺序表:

//初始化顺序表
void SeqListInit(SeqList* psl, size_t capacity){
	assert(psl);

	psl->arr = (STDataType*)malloc(capacity*sizeof(STDataType));
	psl->size = 0;
	psl->capacity = capacity;

	return;
}

//检查容量是否够用
void SeqListCheckCapacity(SeqList* psl){
	assert(psl);

	//每一个增容函数都要用到Checkcapacity函数
	if (psl->size == psl->capacity){	//容量和有效元素大小相同,不能再存放函数,故增容
		//但要检查函数是否为空链表
		if (psl->capacity == 0){
			psl->capacity = 2;
		}
		else{
			//先使用临时变量先来保存扩容后的空间指针
			STDataType* tmp = (STDataType*)realloc(psl->arr, 2 * psl->capacity*sizeof(STDataType));
			//realloc 的第二个参数是字节大小
			assert(tmp);
			psl->arr = tmp;
			psl->capacity *= 2;

		}
	}
}

销毁顺序表:

//销毁顺序表
void SeqListDestroy(SeqList* psl){
	assert(psl);

	psl->arr = NULL;
	psl->size = 0;
	psl->capacity = 0;

	return;
}

猜你喜欢

转载自blog.csdn.net/weixin_41249411/article/details/83031733