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;
}
相关推荐
暗然而日章30 分钟前
C++基础:Stanford CS106L学习笔记 13 特殊成员函数(SMFs)
c++·笔记·学习
小智RE0-走在路上34 分钟前
Python学习笔记(6)--列表,元组,字符串,序列切片
笔记·python·学习
yyy(十一月限定版)40 分钟前
c语言——栈和队列
java·开发语言·数据结构
d111111111d1 小时前
什么是内存对齐?在STM32上面如何通过编辑器指令来实现内存对齐。
笔记·stm32·单片机·嵌入式硬件·学习·编辑器
xu_yule2 小时前
算法基础-背包问题(01背包问题)
数据结构·c++·算法·01背包
蒙奇D索大2 小时前
【数据结构】考研408 | 伪随机探测与双重散列精讲:散列的艺术与均衡之道
数据结构·笔记·学习·考研
budingxiaomoli2 小时前
分治算法-快排
数据结构·算法
dragoooon342 小时前
[C++——lesson30.数据结构进阶——「红黑树」]
开发语言·数据结构·c++
Crkylin2 小时前
尚硅谷Linux应用层学习笔记(一)GCC编译
linux·笔记·学习
蓝色汪洋3 小时前
数码串和oj
数据结构·算法