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;
}
相关推荐
Rachela_z3 小时前
代码随想录算法训练营第十四天| 二叉树2
数据结构·算法
细嗅蔷薇@3 小时前
迪杰斯特拉(Dijkstra)算法
数据结构·算法
S-X-S4 小时前
算法总结-数组/字符串
java·数据结构·算法
Fhd-学习笔记5 小时前
《大语言模型》综述学习笔记
笔记·学习·语言模型
努力学习java的哈吉米大王5 小时前
数据结构-队列
数据结构
萌の鱼5 小时前
leetcode 2080. 区间内查询数字的频率
数据结构·c++·算法·leetcode
简知圈6 小时前
【04-自己画P封装,并添加已有3D封装】
笔记·stm32·单片机·学习·pcb工艺
YxVoyager7 小时前
GAMES101学习笔记(五):Texture 纹理(纹理映射、重心坐标、纹理贴图)
笔记·学习·图形渲染
Buring_learn7 小时前
代理模式 -- 学习笔记
笔记·学习·代理模式
萝卜青今天也要开心7 小时前
读书笔记-《Redis设计与实现》(一)数据结构与对象(下)
java·数据结构·redis·学习