C语言笔记25 •顺序表介绍•

数据结构是计算机存储、组织数据的⽅式。数据结构是指相互之间存在⼀种或多种特定关系
的数据元素的集合。数据结构反映数据的内部构成,即数据由那部分构成,以什么⽅式构成,以及数据元素之间呈现的结构。也就是能够存储数据; 存储的数据能够⽅便查找。

1.为什么需要数据结构
数据结构,能够有效将数据组织和管理在⼀起。按照我们的⽅式任意对数据进⾏增删改查等操 作。最基础的数据结构:数组。但是最基础的数据结构能够提供的操作已经不能完全满⾜复杂算法实现,所以就需要引入 顺序表。
2.顺序表
顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝,这就解决了数组(不 能完全满⾜复杂算法实现 )的缺点。
3.顺序表的代码示例:

cpp 复制代码
// SeqList.h 

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

typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* arr;
	int size;
	int capacity;

}SL;
//typedef struct SeqList SL;

//顺序表初始化
void SLInit(SL* ps);
//顺序表销毁头部插入
void SLDestroy(SL* ps);

//数据打印
void SLprint(SL sl);

//插入数据之前先看空间够不够
void SLCheckCapacity(SL* ps);

//尾部插入&头部插入
//尾部插入
void SLPushback(SL* ps, SLDataType x);
//头部插入
void SLPushFront(SL* ps, SLDataType x);

//尾部删除&头部删除
//尾部删除
void SLPopBack(SL* ps);
//头部删除
void SLPopFront(SL* ps);
cpp 复制代码
//SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

//顺序表初始化
void SLInit(SL* ps)
{
	ps->arr = NULL;
	ps->size = 0;
	ps->capacity = 0;
}
//顺序表销毁
void SLDestroy(SL* ps)
{
	if (ps->arr)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->size = 0;
	ps->capacity = 0;
}

//插入数据之前先看空间够不够
void SLCheckCapacity(SL* ps)
{
	if (ps->capacity == ps->size)//空间不够了  需要申请内存
	{
		int Newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SLDataType* temp = realloc(ps->arr, Newcapacity * sizeof(SLDataType));
		if (temp == NULL)
		{
			perror("realloc");
			exit(1);
			//return 1;
		}
		ps->arr = temp;//内存申请成功
		ps->capacity = Newcapacity;
	}
}
//数据打印
void SLprint(SL sl)
{
	for (int i = 0; i < sl.size; i++)
	{
		printf("%d ", sl.arr[i]);
	}
	printf("\n");
}
//尾部插入
void SLPushback(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	//ps->arr[ps->size] = x;
	//++ps->size;
	ps->arr[ps->size++] = x;
}
//头部插入
void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	//先让顺序表中已有的数据整体往后挪动一位
	for (int i = ps->size;i>0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]
	}
	ps->arr[0] = x;
	ps->size++;//长度+1
}

//尾部删除
void SLPopBack(SL* ps)
{
	assert(ps);
	ps->size--;//--ps->size
}
//头部删除
void SLPopFront(SL* ps)
{
	assert(ps);
	for (int i = 0; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}
cpp 复制代码
//SeqList-test.c


#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"


void test()
{
	SL sl;
	SLInit(&sl);//初始化

	SLPushback(&sl, 1);//尾插一个数字1
	SLPushback(&sl, 2);//尾插一个数字1
	SLPushback(&sl, 3);//尾插一个数字1
	SLPushback(&sl, 4);//尾插一个数字1
	SLprint(sl);//1 2 3 4

	SLPushFront(&sl, 0); //头插一个数字0
	SLprint(sl);//0 1 2 3 4

	SLPopBack(&sl);//尾删一个数字
	SLprint(sl);//0 1 2 3 

	SLPopFront(&sl);//头删一个数字
	SLprint(sl);//1 2 3 

	SLDestroy(&sl);
}

int main()
{
	test();

	return 0;
}
相关推荐
qiqsevenqiqiqiqi32 分钟前
MC0550鱼肠剑试锋芒
数据结构·算法
仍然.33 分钟前
算法题目---链表
数据结构·算法·链表
阿Y加油吧1 小时前
两道 LeetCode 题的复盘笔记:从「只会暴力」到「懂优化」
笔记·算法·leetcode
周末也要写八哥2 小时前
最长递增子序列典型应用题目详解
数据结构·算法
chudonghao2 小时前
[UE学习笔记][基于源码] 控制器、Pawn、相机的控制关系
笔记·学习·ue5
Qinn-2 小时前
【工作笔记】锁等待超时错误 排查
笔记
iiiiyu2 小时前
常用API(StringJoiner类 & Math类 & System类)
java·大数据·开发语言·数据结构·编程语言
小糯米6012 小时前
C语言指针3
c语言·数据结构·算法
LeeeX!3 小时前
【OpenClaw最新版本】 命令行备忘录:高频操作与实战技巧
笔记·aigc·openclaw
见叶之秋3 小时前
【数据结构】二叉树的遍历和节点个数
数据结构