首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据结构课程中的一点C语言基础

引言

老话说得好:光阴荏苒,岁月如梭。

不知不觉,已然大二。当我还沉浸在由萌新竟升成为学长的欢乐时,哪里知道后面会有一门“恐怖如斯”的课程在虎视眈眈的等着我,没错,就是《数据结构》。。。算了,废话不多说,咱直接上干货!

(仅简要说明课本上出现最多的用法)

一. 关键字typedef

1.最基本用法

为现有数据类型定义同义词 

typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。如:课本中常出现的:typedef int Status;此声明定义了一个 int 的同义词,名字为 Status。你可以在任何需要 int 的上下文中使用 Status。

2.typedef 用法 & 结构体

typedef struct LNode{

ElemType data;

struct LNode *next;

}LNode;

这语句实际上完成两个操作:

1)定义一个新的结构类型

struct 关键字和第一个LNode一起构成了这个结构类型,不论是否有typedef,这个结构都存在。

我们可以用struct LNode node来定义变量node,但要注意,使用LNode node来定义变量不对 的,因为struct 和LNode合在一起才能表示一个结构类型。

2)typedef为这个新的结构起了一个名字,叫LNode。因此,LNode实际上相当于struct LNode,我们可以使用LNode node来定义变量node。

3.typedef & 结构体指针类型用法

typedef struct LNode {

ElemType data;

struct LNode *next;

} *LinkList;

可理解为typedef/struct LNode*/LinkList

即给这个指向LNode结构体的指针类型LNode*定义一个别名LinkList,任何使用LNode*的地方都可以用LinkList来替换。

二. 函数malloc(),calloc,realloc()

三个函数的申明分别是:

void* realloc(void* ptr, unsigned newsize);

void* malloc(unsigned size);

void* calloc(size_t numElements, size_t sizeOfElement);

都在stdlib.h函数库内

它们的返回值都是请求系统分配的地址,如果请求失败就返回NULL。

(1) malloc函数。

newsize为要申请的空间大小,需要我们手动的去计算,如int *p= (int *)malloc(20*sizeof(int)),如果编译器默认int为4字节存储的话,那么计算结果是80Byte,一次申请一个80Byte的连续空间,并将空间基地址强制转换为int类型,赋给指针p,此时申请的内存值是不确定的。

(2)calloc函数

其比malloc函数多一个参数,并不需要人为的计算空间的大小,比如如果他要申请20个int类型空间,会int *p = (int *)calloc(20, sizeof(int)),这样就省去了人为空间计算的麻烦。但这并不是他们之间最重要的区别,malloc申请后空间的值是随机的,并没有进行初始化,而calloc却在申请后,对空间逐一进行初始化,并设置值为0;

(3)realloc函数

更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。

如果将分配的内存减少,realloc仅仅是改变索引的信息。

如果是将分配的内存扩大,则有以下情况:

1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。

2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。

3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。

算法谜题:里程表之谜

汽车的里程表可以显示从000000到999999的任意六位数组合。里程表跑完整个显示区域,此间有多少个包含数字1的里程数?整个过程中,数字1显示多少次?(如,101111显示了5次数字1,下一个里程数101112显示了4次数字1)

编辑 | 黄超

排版 | 庄一鸣

审核 | 一点点

长按下方二维码关注我们

每进步一点点

都想与你同在

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181104G01VTZ00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券