数据结构—顺序表的初始化与销毁(C语言详细解读版1/3)

顺序表:顺序表 (SqList, Sequence List),即顺序线性表。
顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系。

/* [Daily Coding] Fall in love coding! */
// 顺序表的初始化

#include"stdio.h"  
#include"malloc.h"  // malloc

#include"stdlib.h"  // exit

#define List_InitSize 100
#define List_Increment 10

typedef struct{
	int *elem;  // 存储空间基址
	
	int length;  // 当前长度
	int listsize; // 当前分配的存储容量(以sizeof(int)为单位)
}SqList;

// 【A段代码】调用示例:SqList* L = Init_SqList01();
SqList* Init_SqList01()
{
	SqList* L = (SqList*)malloc(sizeof(SqList));
	
	L->elem = (int*)malloc(List_InitSize * sizeof(int));
	L->length = 0;
	L->listsize = List_InitSize;
	
	return L;
}

// 【B段代码】调用示例:SqList L = Init_SqList02();
SqList Init_SqList02()
{
	SqList L;
	L.elem = (int*)malloc(List_InitSize * sizeof(int));
	L.length = 0;
	L.listsize = List_InitSize;
	
	return L;
}

// 【C段代码】调用示例:
// SqList l; 
// Init_SqList03(&l);
void Init_SqList03(SqList *L)
{
	L->elem = (int*)malloc(List_InitSize * sizeof(int));
	if (!L->elem)
	{
		exit(-2);
	}
		
	L->length = 0;
	L->listsize = List_InitSize;
}
/*
// 有return语句和没有return语句的区别,你能看得出来吗? 
int Init_SqLite03_ret(SqList *L)
{
	L->elem = (int*)malloc(List_InitSize * sizeof(int));
	if (!L->elem)
	{
		exit(-2);
	}
	
	L->length = 0;
	L->listsize = List_InitSize;
	
	return 0;
 } 
*/

// 【D段代码】调用示例:
// SqList l; 
// Init_SqList04(&l);
void Init_SqList04(SqList *L)
{
	(*L).elem = (int*)malloc(List_InitSize * sizeof(int));
	if (!(*L).elem) 
	{
		exit(-2);
	}

	(*L).length = 0;
	(*L).listsize = List_InitSize;
}

void DestroyList(SqList *L)
{
	free(L->elem);		// free((*L).elem);
	L->elem = NULL;		// (*L).elem = NULL;  // 置空防止野指针 
	L->length = 0;		// (*L).length = 0; 
	L->listsize = 0;	// (*L).listsize = 0; 
} 

int main()
{
	
	SqList* La = Init_SqList01();  // 操作符为 "->" 
	SqList Lb = Init_SqList02();  // 操作符为 "." 
	
	SqList Lc;  // 操作符为 "." 
	Init_SqList03(&Lc);
	
	SqList Lc_ret;  // 操作符为 "." 
	Init_SqList03(&Lc_ret);
	
	SqList Ld;  // 操作符为 "." 
	Init_SqList04(&Ld);
	
	printf("La.length=%d, La.listsize=%d\n", La->length, La->listsize);
	
	printf("Lb.length=%d, Lb.listsize=%d\n", Lb.length, Lb.listsize);
	
	printf("Lc.length=%d, Lc.listsize=%d\n", Lc.length, Lc.listsize);
	/* 
	printf("\n");
	printf("Lc_ret.length=%d, Lc_ret.listsize=%d\n", Lc_ret.length, Lc_ret.listsize);
	printf("\n");
	*/ 
	printf("Ld.length=%d, Ld.listsize=%d\n", Ld.length, Ld.listsize);
	
	// 测试 - 销毁函数 
	DestroyList(La);
	printf("La.length=%d, La.listsize=%d\n", La->length, La->listsize); 

	return 0; 
}

在这里插入图片描述

代码解读

  • A段代码SqList* Init_SqList01(), 有返回值,且返回的为指针。所以直接调用的时候,用的是箭头符号->,建议大家直接这样记:指针类型用箭头
  • B段代码SqList Init_SqList02(), 有返回值,且返回的不是指针。所以直接调用的时候,用的是.
  • C段代码void Init_SqList03(SqList *L), 没有返回值,需要传入参数,且传入的是一个地址。用该函数处理完后,即可直接使用传入的变量。
  • D段代码void Init_SqList04(SqList *L), 没有返回值,需要传入参数,与C段代码不同在于,实现的时候,绕了个弯(由L->elem变为了(*L).elem)。

  • 销毁函数void DestroyList(SqList *L), malloc对应的是free,传入参数-待销毁顺序表的指针,其他操作表示还原初始状态。

初稿完成时间:2023年01月31日

预估有效期限:forever

(水平有限,欢迎评论补充、沟通探讨^_^,progress together。)

-完-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值