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)
何大锤的头像何大锤管理团队

相关推荐

  • 08 – 数据结构基础知识补充

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

    6天前
    400
  • 07 – 第二章数据结构线性表 – 顺序表总结

    顺序表代码实现 一、动态分配方式实现的所有功能 dynamic_list.c dynamic_list.h relloc函数 realloc 是 C 语言标准库中用于重新调整已分配内存块大小的函数,主要用于动态内存管理(头文件 <stdlib.h>)。 ptr:指向待调整大小的原内存块的指针(若为 NULL,效果等价于 malloc…

    2025年5月29日
    200
  • 06 – 第二章数据结构线性表 – 顺序表代码实现(顺序表查找操作)

    线性表的基本操作(GetElem&LocateElem) 一、GetElem(L,i,&e) 按位查找:获取表L中第 i 个位置元素的值 代码实现1 – 静态分配方式 运行结果: 代码实现2 – 动态分配方式 运行结果: 代码说明: 注意点: 动态顺序表(SeqList) 静态顺序表(SqList) 二、LocateE…

    2025年5月27日
    000
  • 05 – 第二章数据结构线性表 – 顺序表代码实现(插入和删除操作)

    线性表的基本操作(ListInsert&ListDelete) 1、ListInsert(&L,i,e) 功能:1、插入操作实现,在表L中的第i个位置上插入指定元素e。2、静态分配方式插入操作 定义插入操作关键步骤1. 检查表是否已满(静态分配的核心限制)2. 检查插入位置有效性(i的合法范围:1 ≤ i ≤ length+1)3. 从最后一…

    2025年5月26日
    100
  • 03 – 第二章数据结构线性表 – 顺序表

    2.1 线性表的定义和基本操作 2.1.1 线性表的定义 2.1.2 线性表的基础操作 InitList(&L) 初始化表。构造一个空的线性表L,分配内存空间。 DestroyList(&L) 销毁操作。销毁线性表,并释放线性表L所占用的内存空间 ListInsert(&L;i,e) 插入操作。在表L中的第i个位置上插入指定元素e。 …

    2025年5月26日
    400

发表回复

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

联系我们

2211932694

在线咨询: QQ交谈

邮件:hdcblog1999@163.com

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

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