【数据结构初阶】——顺序表

本文由@睡觉待开机原创,转载请注明出处。
本内容在csdn网站首发
欢迎各位点赞—评论—收藏
如果存在不足之处请评论留言,共同进步!

这里写目录标题

  • 1.数据结构
  • 2.顺序表
    • 线性表
    • 顺序表的结构
  • 3.动态顺序表的实现

【数据结构初阶】——顺序表_第1张图片

1.数据结构

数据结构的概念:数据结构这个词可以拆分为“数据”和“结构”两个词,所谓数据就是我们存放在内存中的一系列数字而已,结构指的是组织数据的方式,整体而言,数据结构是计算机存储、组织数据的方式。

其中,数组就是一种最基本的数据结构。

2.顺序表

在介绍顺序表之前,我们先来了解一下线性表

线性表

线性表的概念:
线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中⼴泛使⽤的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…


线性表的特点:
在逻辑结构上,是线性结构,也就是一条完整的线。
在物理结构上,则是一种不规则(不一定连续)的数据组织形式。


线性表的分类:
线性表包括:顺序表、链表、栈、队列、字符串…
【数据结构初阶】——顺序表_第2张图片

顺序表的结构

【数据结构初阶】——顺序表_第3张图片

//静态顺序表
typedef int int_n;
typedef struct seqlist
{
	int_n arr_n[100];
	int size_n;
	int capacity_n;
};

//动态顺序表
typedef int int_t;
typedef struct SeqList
{
	int_t* arr;
	int size;
	int capacity;
}SL;

结论:由于动态顺序表的灵活优势,因而首选动态顺序表。

3.动态顺序表的实现

下面是一些功能函数声明和顺序表原型都放在.h文件中。
顺序表是由一个原型和一系列接口(功能)组成的:因而我们首先升级一个数组为动态顺序表原型:

//动态顺序表
typedef int int_t;
typedef struct SeqList
{
	int_t* arr;
	int size;
	int capacity;
}SL;

实现各种顺序表的功能接口:

//顺序表初始化的功能
void SLinit(SL* psl);
//顺序表尾插
void SLpushback(SL* psl,int_t n);
//顺序表头插
void SLpushfront(SL* psl,int_t n);
//顺序表中间插
void SLinnert(SL* psl, int pos, int_t n);
//顺序表打印
void SLprint(SL* psl);
//顺序表尾删
void SLpopback(SL* psl);
//顺序表头删
void SLpopfront(SL* psl);
//顺序表中间删
void SLpopinnert(SL* psl,int pos);

下面是具体实现一些函数功能接口:

#include"SeqList.h"
void SLinit(SL* psl)
{
	psl->arr = NULL;
	psl->size = psl->capacity = 0;
}

void SLcheckcapacity(SL* psl)
{
	if (psl->capacity == psl->size)
	{
		//刚开始是0,所以需要进行三目操作符
		int newcapacity = psl->capacity == 0 ? 4 : 2 * psl->capacity;
		
		int_t * t = (int_t*)realloc(psl->arr, newcapacity * sizeof(int_t));
		if (t == NULL)
		{
			perror("reallloc fail!");
			exit(1);
		}

		psl->arr = t;
		psl->capacity = newcapacity;
	}
}

void SLpushback(SL* psl,int_t n)
{
	assert(psl);
	//容量不足,需要先进行判断容量是否充足,在决定是否进行扩容
	SLcheckcapacity(psl);

	//容量充足,则直接插入
	psl->arr[psl->size] = n;
	psl->size++;
}

void SLpushfront(SL* psl, int_t n)
{
	assert(psl);
	//扩容问题
	SLcheckcapacity(psl);
	//所有数字往后挪动一位
	int i = 0;
	for (i = psl->size; i > 0; i--)
	{
		psl->arr[i] = psl->arr[i - 1];
	}
	//插入
	psl->arr[0] = n;
	psl->size++;
}

void SLinnert(SL* psl, int pos, int_t n)
{
	assert(psl);
	assert(pos >= 0 && pos <= psl->size);
	//扩容问题
	SLcheckcapacity(psl);
	//中间插入,中间往后所有的数字往后挪动一位
	int i = 0;
	for (i = psl->size; i > pos; i--)
	{
		psl->arr[i] = psl->arr[i - 1];
	}
	//插入数据
	psl->arr[pos] = n;
	psl->size++;
}

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

void SLpopback(SL* psl)
{
	assert(psl->size && psl);
	psl->size--;
}
void SLpopfront(SL* psl)
{
	assert(psl && psl->size);
	int i = 0;
	for(i = 1; i<psl->size; i++)
	{
		psl->arr[i-1] = psl->arr[i];
	}

	psl->size--;

}

void SLpopinnert(SL* psl, int pos)
{
	assert(pos >= 0 && pos < psl->size);
	int i = 0;
	for (i = pos; i < psl->size-1; i++)
	{
		psl->arr[i] = psl->arr[i + 1];
	}
	psl->size--;
}

下面是测试代码源文件内容(在test.c文件中):

#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"

int main()
{
	SL sl;
	SLinit(&sl);
	SLpushback(&sl,1);
	SLpushfront(&sl, 1);
	SLpushfront(&sl, 1);
	SLpushfront(&sl, 1);
	SLpushfront(&sl, 1);
	SLprint(&sl);
	SLinnert(&sl, 1, 3);
	SLprint(&sl);

	
	SLpopback(&sl);
	SLprint(&sl);

	SLpopfront(&sl);
	SLprint(&sl);

	SLpopinnert(&sl,3);
	SLprint(&sl);
	return 0;
}

【数据结构初阶】——顺序表_第4张图片

你可能感兴趣的:(数据结构,c语言)