82.【C语言】数据结构之顺序表的初始化和销毁

目录

1.线性表

2.分类

1.静态顺序表:使用定长数组存储元素

代码示例(写入Seqlist.h中)

2.动态顺序表:使用与动态内存管理有关的函数

代码示例(写入Seqlist.h中)

补:数据管理的四个需求:增改删查

3.操作顺序表

1.初始化顺序表

1.不开辟空间

2.开辟空间

1.传值调用

2.传址调用

SeqList项目的函数的传址调用的过程


在软件开发中,存储列表常用顺序表或链表

1.线性表

定义:n个具有相同特性的数据元素的有限序列(相当于一条直线)(用数组存储),要求数据依次存储

2.分类

1.静态顺序表:使用定长数组存储元素

代码示例(写入Seqlist.h中)

cpp 复制代码
typedef int SLDataType;//将int重定义为SLDataType
#define N 10
struct Seqlist
{
	SLDataType a[N];
	int size;
};

备注:SLDataType的全称 Sequence List Data Type,a[N]为int类型,含10个元素的空间

想修改a数组的空间大小,修改#define的那一行即可

缺点:空间少了不够用,空间多了浪费

2.动态顺序表:使用与动态内存管理有关的函数

代码示例(写入Seqlist.h中)

cpp 复制代码
typedef int SLDataType;//将int重定义为SLDataType
struct Seqlist
{
	SLDataType* a;
	int size;
    int capacity;//空间的容量
};

补:数据管理的四个需求:增删查改

增:增加(插入数据); 删:删除数据; 查:搜索数据; 改:修改数据的内容

3.操作顺序表

1.初始化顺序表

1.不开辟空间

SeqList.h

cpp 复制代码
#pragma once
#include <stdio.h>
#include <stdlib.h>

typedef int SLDataType;//将int重定义为SLDataType
typedef struct Seqlist
{
	SLDataType* a;//动态顺序表
	int size;//有效数据的个数
	int capacity;//空间的容量
}SL;//SL 就是 struct Seqlist 

void SeqInit(SL s);//声明初始化顺序表的函数
void SeqDestory(SL s);//声明销毁顺序表的函数

将结构体写入头文件,这样多个源文件可以同时引用

main.c

cpp 复制代码
#include "SeqList.h"
SL s;//全局变量

//定义测试顺序表的函数
void TestSeqList1()
{
	SeqInit(s);
}

int main()
{
	TestSeqList1();
	return 0;
}

注意:不能将SL s;写在TestSeqList1内,否则未初始化会报错

SeqList.c(将对操作顺序表的函数写入此文件)

cpp 复制代码
#include "SeqList.h"
void SeqInit(SL s)
{
	s.a = NULL;
	s.size = 0;
	s.capacity = 0;
}

上述为s.a赋值为NULL

2.开辟空间

1.传值调用

在SeqList.h中添加

cpp 复制代码
#define INIT_CAPACITY 4//初始容量为4

SeqList.c修改为

cpp 复制代码
#include "SeqList.h"
void SeqInit(SL s)
{
	s.a = (SLDataType*)malloc(sizeof(SLDataType)*INIT_CAPACITY);
	if (s.a == NULL)
	{
		perror("malloc");
        //错误返回,不用返回具体的数,因为SeqInit的返回类型为void
		return;
	}
	s.size = 0;
	s.capacity = INIT_CAPACITY;
}

注意:

1.在68.【C语言】动态内存管理(重点)(1) 讲过,malloc函数可能开辟不成功,需要判断返回的指针是否为NULL

2.这里SeqInit(s);是传值调用,形参是实参的一份拷贝

2.传址调用

SeqList.h

cpp 复制代码
#pragma once
#include <stdio.h>
#include <stdlib.h>

typedef int SLDataType;//将int重定义为SLDataType
#define INIT_CAPACITY 4
typedef struct Seqlist
{
	SLDataType* a;//动态顺序表
	int size;//有效数据的个数
	int capacity;//空间的容量
}SL;

void SLInit(SL* ps);//声明初始化顺序表的函数
void SLDestory(SL* ps);//声明销毁顺序表的函数

main.c

cpp 复制代码
#include "SeqList.h"
//定义测试顺序表的函数
void TestSeqList1()
{
	SL s;
	SLInit(&s);
	SLDestory(&s);
}

int main()
{
	TestSeqList1();
	return 0;
}

SeqList.c(将对操作顺序表的函数写入此文件)

cpp 复制代码
#include "SeqList.h"
void SLInit(SL* ps)
{
	ps->a = (SLDataType*)malloc(sizeof(SLDataType)*INIT_CAPACITY);
	if (ps->a == NULL)
	{
		perror("malloc");
		return ;//错误返回
	}
	ps->size = 0; 
	ps->capacity = 0;
}
SeqList项目的函数的传址调用的过程

main()-->TestSeqList1()-->SLInit(&s)-->函数逐个返回

2.销毁顺序表

SeqList.c写入

cpp 复制代码
void SLDestory(SL *ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->size = ps->capacity = 0;
}

注:在定义结构体时, a为指针,先对指针释放,再置为NULL;size和capacity为int类型,置为0即可

SLDataType***** a;
int size;
int capacity;

相关推荐
凉茶钱5 小时前
【c语言】动态内存管理:malloc,calloc,realloc,柔性数组
c语言·c++·vscode·柔性数组
散峰而望5 小时前
【算法竞赛】C/C++ 的输入输出你真的玩会了吗?
c语言·开发语言·数据结构·c++·算法·github
小龙报5 小时前
【C语言】内存里的 “数字变形记”:整数三码、大小端与浮点数存储真相
c语言·开发语言·c++·创业创新·学习方法·visual studio
躺不平的理查德5 小时前
时间复杂度与空间复杂度备忘录
数据结构·算法
yaki_ya5 小时前
yaki-C语言:从概念基础到内存解析---数组(array)完全指南
java·c语言·算法
刃神太酷啦5 小时前
扒透 STL 底层!map/set 如何封装红黑树?迭代器逻辑 + 键值限制全手撕----《Hello C++ Wrold!》(23)--(C/C++)
java·c语言·javascript·数据结构·c++·算法·leetcode
星辰徐哥5 小时前
C语言网络编程:TCP、UDP、HTTP深度解析
c语言·网络·tcp/ip
2301_789015625 小时前
C++:继承
c语言·开发语言·c++
多加点辣也没关系6 小时前
数据结构与算法|第六章:队列
数据结构·算法·队列
霍霍的袁6 小时前
【初识C语言】预处理笔记(预处理指令、宏定义等)
c语言·笔记·visualstudio