04 – 第二章数据结构线性表 – 顺序表代码实现(初始化线性表和销毁操作)

线性表的基本操作(InitList&DestroyList)

1、InitList(&L)

功能:初始化表,构造一个空的线性表L,分配空间

#define _CRT_SECURE_NO_WARNINGS

// InitList(&L):初始化表,构造一个空的线性表L,分配空间
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define INIT_CAPACITY 10 //初始化线性表的容量

// 线性表结构体定义(顺序表)
typedef struct {
	int* data; //存储元素的动态数组指针
	int length; // 当前表长(已存储元素数量)
	int capacity; //线性表总容量(最大存储能力)
} LinearList;

// 初始化线性表;构造空表并分配空间
bool InitList(LinearList* L)
{
	//分配初始容量的内存空间
	L->data = (int*)malloc(INIT_CAPACITY * sizeof(int));
	if (L->data == NULL)
	{
		return false;
	}
	L->length = 0;
	L->capacity = INIT_CAPACITY;
	return true;
}


int main()
{
	LinearList L; // 声明线性表变量

	// 调用初始化函数
	if (InitList(&L))
	{
		printf("线性表初始化成功!\n");
		printf("分配容量: %d\n", L.capacity);
		printf("当前表长: %d\n", L.length);
		printf("数据存储地址: %p\n", L.data);
	}
	else
	{
		printf("初始化失败!内存分配错误。\n");
	}

	//释放分配内存空间
	free(L.data);

	return 0;
}

运行结果:

04 - 第二章数据结构线性表 - 顺序表代码实现(初始化线性表和销毁操作)

2、DestroyList(&L)

销毁操作。销毁线性表,并释放线性表L所占用的内存空间

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define INIT_CAP 10 //初始化容量

// 顺序表定义
typedef struct {
	int* data; // 存储数据的动态数组
	int len; // 当前长度(元素个数)
	int cap; // 总容量

} SeqList;

// 初始化顺序(构成空表)
bool InitList(SeqList* L)
{
	L->data = (int*)malloc(INIT_CAP * sizeof(int));
	if (L->data == NULL)
	{
		return false;
	}
	L->len = 0;
	L->cap = INIT_CAP;
	return true;
}

// 销毁顺序表(释放空间)
void DestroyList(SeqList* L)
{
	free(L->data);
	L->data = NULL; //防止野指针
	L->len = 0;     // 重置长度
	L->cap = 0;     // 重置容量
}

int main()
{
	SeqList list;

	// 初始化测试
	if (InitList(&list))
	{
		printf("初始化成功!\n");
		printf("容量:%d,当前长度:%d,数据地址:%p\n", list.cap,list.len,list.data);
	}
	else {
		printf("初始化失败(内存不足)\n");
		return 1;
	}

	// 销毁测试
	DestroyList(&list);
	printf("\n销毁后状态:\n");
	printf("容量:%d,当前长度:%d,数据地址:%p\n", list.cap, list.len, list.data);


	return 0;
}

运行结果:

04 - 第二章数据结构线性表 - 顺序表代码实现(初始化线性表和销毁操作)

注意点

操作符L 的类型示例代码等价写法
->结构体指针SeqList* L; L->data(*L).data
.结构体变量本身SeqList L; L.data
// 错误检查机制
if (!L->data) return false;

//以上写法等价于以下
if (L->data == NULL) return false;  // 显式比较NULL
  • 野指针:在 C 语言中,”野指针”(Dangling Pointer)是指向已被释放内存的指针。如果后续代码继续使用这个指针,会导致未定义行为(如程序崩溃、数据损坏)。

本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客

(2)
何大锤的头像何大锤管理团队

相关推荐

  • 第二章数据结构线性表 – 单链表动画演示

    一、带头结点单链表 1、头插法创建-动画演示 2、尾插法创建-动画演示 3、插入操作 插入表头 插入中间 插入表尾

    2025年6月16日
    800
  • 第二章数据结构线性表 – 单链表的插入和删除操作

    一、知识要点 1.1 按位序插入 – 带头结点 1.2 按位序插入 – 不带头结点 1.3 指定结点的后插操作 1.4 指定结点的前插操作 1.5 按位序删除(带头结点) 1.6 指定结点删除 1.7 封装的好处 二、单链表 – 插入操作 3.1 按位序插入(带头结点) – ListInsert(&L,…

    2025年6月16日
    300
  • 第二章数据结构线性表 – 单链表的定义与初始化

    一、单链表的定义和表示 – 知识要点 1.1 定义单链表 1.2 带头结点单链表的初始化 二、单链表 – 定义与初始化 1.1 带头结点代码实现 1.1.1 C语言实现 实现算法实现 测试主函数 运行结果 运行过程 带头结点单链表的初始化的注意点 1.1.2 C++单链表定义及初始化 运行结果 1.2 不带头结点代码实现 1.2.1 …

    2025年6月14日
    700
  • 第二章数据结构线性表 – 单链表概念

    一、引言 1.1 知识框架 1.2 有了数组为什么还要链表? 在前面我们介绍过数组,数组中元素是存储在连续的内存位置在声明数组时,我们可以指定数组的大小,但这将限制数组可以存储的元素数量 例如我们声明的是 int arr[10],那么arr数组最多可以存储10个数据元素 但是我们事先不知道元素的大小呢? 我们该如何去做? 当然首先想到的是申请一个足够大的数组…

    2025年6月14日
    300
  • 08 – 数据结构基础知识补充

    内存分类 一、静态 / 全局内存(程序运行期间一直存在) 特点:全局变量和静态变量(用static声明)的内存,在程序启动时分配,程序结束才释放。通俗理解:像「公共仓库」,一旦创建就一直存在,所有需要的地方都能访问(全局变量),或在特定范围内持续保留(静态变量)。 解释: 二、自动内存(栈内存,函数调用时临时创建) 特点:函数内的普通局部变量(不用stati…

    2025年6月6日
    1100

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

2211932694

在线咨询: QQ交谈

邮件:hdcblog1999@163.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
网站建设中ing......