0
点赞
收藏
分享

微信扫一扫

数据结构篇1—《顺序表》

在这里插入图片描述

文章目录

🚩前言

1. 数据结构的概念

2. 数据结构的分类

在这里插入图片描述

3. 顺序表

3.1. 顺序表的分类

(1)静态顺序表

结构体定义如下:

#define N 10;//宏定义,方便修改数组的大小
typedef int DataType;//数据类型取别名
typedef struct SeqList
{
	DataType elem[N];//此处就是一个整型数组,大小是固定的,定长数组。
	int size;//表示该数组中的有效个数。
}SL;//用typedef给struct SeqList取别名。
//在后面用到就不用写struct SeqList,直接写SL;

(2)动态顺序表

结构体定义如下:

typedef int DataType;//数据类型取别名
typedef struct SeqList
{
	DataType* elem;//此处变成指针,通过动态申请空间
	int capacity;//表示申请的空间总大小,空间是可以增容的
	int size;//表示该数组中的有效个数。
}SL;//用typedef给struct SeqList取别名。

4. 动态顺序表实现

4.1. 实现步骤

(1)框架结构

在这里插入图片描述

(2)SeqList.h头文件实现
#pragma once

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

#define INIT_SIZE 2

//创建动态顺序表的结构体
typedef int DataType;
typedef struct SeqList
{
	DataType* elem;
	int capacity;
	int size;
}SL;


//创建好后就初始化结构体
void init_seqlist(SL* sl);//初始化函数

void print_seqlist(SL sl);//打印函数

void PushBack(SL* sl, DataType data);//尾插函数

void PushFront(SL* sl, DataType data);//头插函数

void PopBack(SL* sl);//尾删函数

void PopFront(SL* sl);//头删函数

void InsertPosition(SL* ptr, int pos, DataType data);//指定位置插入数据函数

void DeletePosition(SL* ptr, int pos);//删除指定位置的元素

void ModifyPosition(SL* ptr, int pos, DataType data);//修改指定位置的数据

int FindPosition(SL ptr, DataType data);//查找函数

void DestroyCapacity(SL* ptr);//销毁函数


(3)SeqList.c源文件
①init_seqlist()初始化函数
//初始化函数
void init_seqlist(SL* sl)
{
	assert(sl);
	sl->elem = NULL;
	sl->capacity = sl->size=0;
}

我们可以在初始化的时候就分配空间,代码如下:

//初始化函数
#define INIT_SIZE 2

void init_seqlist(SL* sl)
{
	assert(sl);
	sl->elem = (SL*)malloc(INIT_SIZE * sizeof(SL));
	sl->capacity = INIT_SIZE;
	sl->size = 0;
}

②print_seqlist()打印函数
//打印函数
void print_seqlist(SL sl)
{
	if (sl.size == 0)
	{
		printf("顺序表内容为空,无法打印!\n");
		return;
	}
	for (int i = 0; i < sl.size; i++)
	{
		printf("%d ",sl.elem[i]);
	}
	printf("\n");
}

由于打印函数不需要修改内容,所以不需要传递地址


③PushBack()尾插函数+图解
static check_capacity(SL* sl)
{
	assert(sl);
	//看空间里面实际的元素个数是否等于申请的空间大小,相等就说明满了;
	if (sl->capacity == sl->size)
	{
		int new_capacity = sl->capacity == 0 ? 4 : 2 * sl->capacity;//以2倍数增容
		DataType* temp = (DataType*)realloc(sl->elem, new_capacity * sizeof(DataType*));
		if (temp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		//申请成功
		sl->elem = temp;
		sl->capacity = new_capacity;
	}
}


//尾插函数
void PushBack(SL* sl, DataType data)
{
	assert(sl);
	//在插入的时候,必须判断空间是否满,是否需要扩容;
	check_capacity(sl);
	//插入数据
	sl->elem[sl->size++] = data;
}

④PushFront()头插函数+图解
//头插函数
void PushFront(SL* sl, DataType data)
{
	assert(sl);
	//插入之前也是需要检测空间的
	check_capacity(sl);
	//插入,移动元素,从后往前移动
	for (int i = sl->size; i > 0; i--)
	{
		sl->elem[i] = sl->elem[i - 1];
	}
	//第一个空出来后插入数据
	sl->elem[0] = data;
	sl->size++;
}
⑤PopBack()尾删函数+图解
//尾删函数
void PopBack(SL* sl)
{
	assert(sl&&sl->size);//保证传入的空间有效和数据个数不为0
	//尾删
	sl->size--;
}

⑥PopFront()头删函数+图解
//头删函数
void PopFront(SL* sl)
{
	assert(sl && sl->size);
	//头删
	for (int i = 0; i < sl->size - 1; i++)
	{
		sl->elem[i] = sl->elem[i + 1];
	}
	sl->size--;
}


⑦DeletePosition()删除指定位置函数
//删除指定位置的元素
void DeletePosition(SL* sl, int pos)
{
	assert(sl && sl->size);		
	assert(pos >= 0 && pos < sl->size);
	for (int i = pos; i < sl->size; i++)
	{
		sl->elem[i] = sl->elem[i + 1];
	}
	sl->size--;
}
⑧InsertPosition()指定位置插入数据函数
//指定位置插入数据函数
void InsertPosition(SL* sl, int pos, DataType data)
{
	assert(sl&&pos>=0&&pos<=sl->size);
	//先移动位置,往后移动
	//还得检查是否需要扩容
	check_capacity(sl);
	for (int i = sl->size; i > pos; i--)
	{
		sl->elem[i] = sl->elem[i - 1];
	}
	//位置空出来之后就加入数据
	sl->elem[pos] = data;
	//记得元素个数+1
	sl->size++;
}
⑨ModifyPosition()修改指定位置数据函数
//修改指定位置的数据
void ModifyPosition(SL* sl, int pos, DataType data)
{
	assert(sl&&pos>=0&&pos<sl->size);
	//现找到修改数据的位置
	for (int i = 0; i < sl->size; i++)
	{
		if (i == pos)
		{
			//修改
			sl->elem[i] = data;
		}
	}
}

⑩FindPosition()查找函数
//查找函数
int FindPosition(SL sl, DataType data)
{
	if (sl.size == 0)
	{
		printf("数据内容为空,无法查找!\n");
		exit(1);
	}
	for (int i = 0; i < sl.size; i++)
	{
		if (sl.elem[i] == data)
		{
			return i;
		}
	}
	return -1;
}
🚀DestroyCapacity()销毁函数
//销毁函数
void DestroyCapacity(SL* sl)
{
	if (sl->elem != NULL)
	{
		free(sl->elem);
	}
	sl->elem = NULL;
	sl->capacity = sl->size = 0;
}

5. 完整代码

SeqList.h

#pragma once

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

#define INIT_SIZE 2

//创建动态顺序表的结构体
typedef int DataType;
typedef struct SeqList
{
	DataType* elem;
	int capacity;
	int size;
}SL;


//创建好后就初始化结构体
void init_seqlist(SL* sl);//初始化函数

void print_seqlist(SL sl);//打印函数

void PushBack(SL* sl, DataType data);//尾插函数

void PushFront(SL* sl, DataType data);//头插函数

void PopBack(SL* sl);//尾删函数

void PopFront(SL* sl);//头删函数

void InsertPosition(SL* sl, int pos, DataType data);//指定位置插入数据函数

void DeletePosition(SL* sl, int pos);//删除指定位置的元素

void ModifyPosition(SL* sl, int pos, DataType data);//修改指定位置的数据

int FindPosition(SL sl, DataType data);//查找函数

void DestroyCapacity(SL* sl);//销毁函数

SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"

//打印函数
void print_seqlist(SL sl)
{
	if (sl.size == 0)
	{
		printf("顺序表内容为空,无法打印!\n");
		return;
	}
	for (int i = 0; i < sl.size; i++)
	{
		printf("%d ",sl.elem[i]);
	}
	printf("\n");
}


//初始化函数
void init_seqlist(SL* sl)
{
	assert(sl);
	sl->elem = NULL;
	sl->capacity = sl->size=0;

	/*assert(sl);
	sl->elem = (SL*)malloc(INIT_SIZE * sizeof(SL));
	sl->capacity = INIT_SIZE;
	sl->size = 0;*/
}

static check_capacity(SL* sl)
{
	assert(sl);
	//看空间里面实际的元素个数是否等于申请的空间大小,相等就说明满了;
	if (sl->capacity == sl->size)
	{
		int new_capacity = sl->capacity == 0 ? 4 : 2 * sl->capacity;//以2倍数增容
		DataType* temp = (DataType*)realloc(sl->elem, new_capacity * sizeof(DataType*));
		if (temp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		//申请成功
		sl->elem = temp;
		sl->capacity = new_capacity;
	}
}


//尾插函数
void PushBack(SL* sl, DataType data)
{
	assert(sl);
	//在插入的时候,必须判断空间是否满,是否需要扩容;
	check_capacity(sl);
	//插入数据
	sl->elem[sl->size++] = data;
}

//头插函数
void PushFront(SL* sl, DataType data)
{
	assert(sl);
	//插入之前也是需要检测空间的
	check_capacity(sl);
	//插入,移动元素,从后往前移动
	for (int i = sl->size; i > 0; i--)
	{
		sl->elem[i] = sl->elem[i - 1];
	}
	//第一个空出来后插入数据
	sl->elem[0] = data;
	sl->size++;
}


//尾删函数
void PopBack(SL* sl)
{
	assert(sl&&sl->size);//保证传入的空间有效和数据个数不为0
	//尾删
	sl->size--;
}


//头删函数
void PopFront(SL* sl)
{
	assert(sl && sl->size);
	//头删
	for (int i = 0; i < sl->size - 1; i++)
	{
		sl->elem[i] = sl->elem[i + 1];
	}
	sl->size--;
}


//删除指定位置的元素
void DeletePosition(SL* sl, int pos)
{
	assert(sl && sl->size);
	assert(pos >= 0 && pos < sl->size);
	for (int i = pos; i < sl->size-1; i++)
	{
		sl->elem[i] = sl->elem[i + 1];
	}
	sl->size--;
}

//指定位置插入数据函数
void InsertPosition(SL* sl, int pos, DataType data)
{
	assert(sl&&pos>=0&&pos<=sl->size);
	//先移动位置,往后移动
	//还得检查是否需要扩容
	check_capacity(sl);
	for (int i = sl->size; i > pos; i--)
	{
		sl->elem[i] = sl->elem[i - 1];
	}
	//位置空出来之后就加入数据
	sl->elem[pos] = data;
	//记得元素个数+1
	sl->size++;
}

//修改指定位置的数据
void ModifyPosition(SL* sl, int pos, DataType data)
{
	assert(sl&&pos>=0&&pos<sl->size);
	//现找到修改数据的位置
	for (int i = 0; i < sl->size; i++)
	{
		if (i == pos)
		{
			//修改
			sl->elem[i] = data;
		}
	}
}


//查找函数
int FindPosition(SL sl, DataType data)
{
	if (sl.size == 0)
	{
		printf("数据内容为空,无法查找!\n");
		exit(1);
	}
	for (int i = 0; i < sl.size; i++)
	{
		if (sl.elem[i] == data)
		{
			return i;
		}
	}
	return -1;
}

//销毁函数
void DestroyCapacity(SL* sl)
{
	if (sl->elem != NULL)
	{
		free(sl->elem);
	}
	sl->elem = NULL;
	sl->capacity = sl->size = 0;
}

test.c

#define _CRT_SECUR_NO_WARNINGS 1
#include"SeqList.h"

void test01()
{
	SL sl;
	init_seqlist(&sl);//此处记得传地址。

	//尾插
	PushBack(&sl, 1);
	PushBack(&sl, 2);
	PushBack(&sl, 3);
	PushBack(&sl, 4);
	print_seqlist(sl);

	//头插
	PushFront(&sl, 5);
	print_seqlist(sl);
	/*PushFront(&sl, 6);
	print_seqlist(sl);*/

	尾删
	//PopBack(&sl);
	//print_seqlist(sl);
	//PopBack(&sl);
	//print_seqlist(sl);

	//头删
	/*PopFront(&sl);
	print_seqlist(sl);
	PopFront(&sl);
	print_seqlist(sl);*/

	//指定位置删除
	/*printf("删除下标为2的数据:\n");
	DeletePosition(&sl,2);
	print_seqlist(sl);*/

	//指定位置插入数据
	/*printf("在下标为2的位置插入100数据:\n");
	InsertPosition(&sl,2,100);
	print_seqlist(sl);*/

	修改
	//printf("修改下标为3的数据:\n");
	//ModifyPosition(&sl,3,666);
	//print_seqlist(sl);


	//查找
	printf("查找数据为2的位置:\n");
	int ret=FindPosition(sl, 2);
	if (ret == -1)
	{
		printf("没找到!\n");
	}
	else
	{
		printf("找到了,在下标为%d位置处!",ret);
	}

	DestroyCapacity(&sl);
	
}


int main()
{
	test01();//函数测试
	return 0;
}
举报

相关推荐

0 条评论