顺序表 代码实现

Posted 程序字母K

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺序表 代码实现相关的知识,希望对你有一定的参考价值。

实现顺序表的头文件seqList.h

typedef int SLDataType;

typedef struct seqList{
	SLDataType* _data;//需要动态开辟的数组
	size_t _size;//有效元素个数
	size_t _capacity;//元素容量大小
}seqList;

void initSeqList(seqList* sl);//初始化顺序表
void push_back(seqList* sl, SLDataType val);//尾插
void checkCapacity(seqList* sl);//检查容量
void printSeqList(seqList* sl);//打印顺序表
void pop_back(seqList* sl);//尾删
void push_front(seqList* sl);//头插
void pop_front(seqList* sl);//头删
void insert(seqList* sl, size_t pos, SLDataType val);//任意位置插入
void erase(seqList* sl, int pos);//任意位置删除元素
bool empty(seqList* sl);//判断是否为空
int size(seqList* sl);//有效元素的大小
int find(seqList* sl, SLDataType val);//查找值返回位置
void destroySeqList(seqList* sl);//销毁顺序表

顺序表的代码实现

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
#include"seqList.h"

//初始化顺序表
void initSeqList(seqList* sl){
	assert(sl);
	sl->_data = NULL;
	sl->_size = sl->_capacity = 0;
}

//尾插数据
void push_back(seqList* sl,SLDataType val){
	assert(sl);
	//检查容量
	checkCapacity(sl);
	sl->_data[sl->_size] = val;
	++sl->_size;
}

//检查容量
void checkCapacity(seqList* sl){
	//assert(sl);//检查指针   debug有效,release无效
	if (sl == NULL)
		return;
	if (sl->_size == sl->_capacity){
		int newCapacity = sl->_capacity == 0 ? \\
			1:2 * sl->_capacity;
		sl->_data = (SLDataType*)realloc(sl->_data, sizeof(SLDataType)*newCapacity);
		
		/*
		//开空间,拷贝数据,释放原有空间
		SLDataType* tmp = (SLDataType*)\\
			malloc(sizeof(SLDataType)*newCapacity);
		memcpy(tmp, sl->_data, sizeof(SLDataType)*sl->_size);
		//释放
		free(sl->_data);
		//更新
		sl->_data = tmp;
		*/
		//更新
		sl->_capacity = newCapacity;
	}
}

//打印顺序表
void printSeqList(seqList* sl){
	if (sl == NULL)
		return;
	for (int i = 0; i < sl->_size; ++i){
		printf("%d ", sl->_data[i]);
	}
	printf("\\n");
}

//尾删
void pop_back(seqList* sl){
	if (sl == NULL)
		return;
	if (sl->_size>0)
	--(sl->_size);
}

//头插
void push_front(seqList* sl,SLDataType val){
	if (sl == NULL)
		return;
	checkCapacity(sl);//1.
	int end = sl->_size;//2.移动元素
	while (end>0){
		sl->_data[end] = sl->_data[end - 1];
		--end;
	}
	sl->_data[0] = val;//3.头插
	++sl->_size;//4.更新
}

//头删
void pop_front(seqList* sl){
	if (sl == NULL)
		return;
	//0.判断
	if (sl->_size == 0)
		return;
	//1.移动
	int start = 1;
	while (start < sl->_size){
		sl->_data[start - 1] = sl->_data[start];
		++start;
	}
	//2.更新
	--(sl->_size);
}

void insert(seqList* sl, size_t pos, SLDataType val){
	if (sl == NULL) return;
	//1.检查容量
	if (pos >= 0 && pos <= sl->_size){
		checkCapacity(sl);
		//2.移动数据[pos,sl->_size)
		int end = sl->_size;
		while (end > pos){
			sl->_data[end] = sl->_data[end - 1];
			end--;
		}
		//3.插入数据
		sl->_data[pos] = val;
		//4.更新
		++(sl->_size);
	}
}

//任意位置删除元素
void erase(seqList* sl, int pos){
	if (sl == NULL || sl->_size == 0)
		return;
	//1.检查位置[0,sl->_size)
	if (pos >= 0 && pos < sl->_size){
		//2.移动元素
		int start = pos;
		while (start<(sl->_size-1)){
			sl->_data[start] = sl->_data[start + 1];
			start++;
		}
		//3.更新
		--(sl->_size);
	}
}

//判断是否为空
bool empty(seqList* sl){
	if (sl == NULL || sl->_size == 0)
		return true;
	else
		return false;
}

//有效元素的大小
int size(seqList* sl){
	if (sl == NULL)
		return 0	;
	return sl->_size;
}

//查找值返回位置
int find(seqList* sl, SLDataType val){
	if (sl == NULL)
		return 0;
	int i = 0;
	for (; i < sl->_size; ++i){
		if (sl->_data[i] == val)
			return i;
	}
	return -1;
}

//销毁顺序表
void destroySeqList(seqList* sl){
	if (sl == NULL)
		return;
	if (sl->_data){
		free(sl->_data);
		sl->_data = NULL;
	}
}

测试案例

//测试
void test(){
	seqList sl;
	initSeqList(&sl);

}
/*
void test(){
	seqList sl;
	initSeqList(&sl);
	push_back(&sl, 1);
	push_back(&sl, 2);
	push_back(&sl, 3);
	push_back(&sl, 4);
	push_back(&sl, 5);
	printSeqList(&sl);//1 2 3 4 5

	erase(&sl, 0); printSeqList(&sl);//2 3 4 5
	erase(&sl, 7); printSeqList(&sl);//2 3 4 5 
	erase(&sl, 3); printSeqList(&sl);//2 3 4 
	erase(&sl, 0); printSeqList(&sl);//3 4
	erase(&sl, 2); printSeqList(&sl);//3 4
	erase(&sl, 1); printSeqList(&sl);//3


}

void test(){
	seqList sl;
	initSeqList(&sl);
	insert(&sl, 0, 1);
	printSeqList(&sl);
	insert(&sl, 1, 2);
	printSeqList(&sl);
	insert(&sl, 0, 0);
	printSeqList(&sl);
	//insert(&sl, 2, 0.5);
	printSeqList(&sl);
	insert(&sl, 3, 9);
	//insert(&sl, 7, 9);
	printSeqList(&sl);

}

void test(){
	seqList sl;
	initSeqList(&sl);
	push_back(&sl, 1);
	push_back(&sl, 2);
	push_back(&sl, 3);
	push_back(&sl, 4);
	push_back(&sl, 5);

	printSeqList(&sl);

	pop_front(&sl);
	pop_front(&sl);
	pop_front(&sl);
	pop_front(&sl);
	printSeqList(&sl);
	pop_front(&sl);
	pop_front(&sl);
	printSeqList(&sl);

}

void test(){
	seqList sl;
	initSeqList(&sl);
	push_front(&sl, 9);
	printSeqList(&sl);
	push_front(&sl, 8);
	printSeqList(&sl);
	push_front(&sl, 7);
	printSeqList(&sl);
	push_front(&sl, 6);
	printSeqList(&sl);
	push_front(&sl, 5);
	printSeqList(&sl);

}

void test(){
	seqList sl;
	initSeqList(&sl);
	push_back(&sl, 1);
	push_back(&sl, 2);
	push_back(&sl, 1);
	push_back(&sl, 3);
	push_back(&sl, 4);
	printSeqList(&sl);
	pop_back(&sl);
	printSeqList(&sl);
	
}
*/
int main(){
	test();
	system("pause");
	return 0;
}

以上是关于顺序表 代码实现的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)

数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)

顺序查找的概念及实现代码详解

顺序线性表的代码实现

关于代码片段的时间复杂度

数据结构 顺序表