链表(一)【C语言】
写在前面的话:
- 文本编辑器:Sublime Text3
- 编译环境:Dev-C++
- 本章内容:C语言链表知识、malloc函数
目录
1.安装Sublime Text3
在开始学习链表之前,先简单的介绍文本编辑器Sublime Text3
点击此处下载编辑器:sublime文本编辑器
如果下载不了:请关闭防护墙,复制下载链接,即可下载成功!
sublime只是文本编辑工具,要运行你可以找cfree,devC++,Visual Studio等编译器。
设置sublime中文乱码的情况:
1.点击“首选项” - “设置-用户”
2.打开文件所在目录
3. 右键“Preferences.txt”,点击“属性”
没有找到该文件,你应该将Preferences.sublime-settings复制,粘贴在本文件夹下,改成Preferences.txt
4.点击“安全”,图中缺少选择”Users“(组或用户名(G)最后1项),再然后选择“编辑”
5.允许所有权限
6.点击”应用“,回到文件夹,以记事本打开它
7.添加上这一行代码
"font_size": 11.0,
添加的位置(见下图):
8.将原来的Preferences.sublime-settings删除,或者改成另外的名字
然后将Preferences.txt(自己才修改的文件)改成Preferences.sublime-settings,就完成了。
9.效果图
这样不会出现中文乱码了
2.了解malloc
malloc的全称是memory allocation,中文叫动态分配内存,用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存,且分配的大小就是程序要求的大小。
如:malloc(100); //表示分配100内存空间大小
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
//申请空间
void *p = malloc(100);
/*
打印分配空间的内存地址
*/
printf("内存地址:%p\n",p);
/*
分配空间上赋初值
*/
int i;
//在分配的空间中赋值【因为int一个整型变量占4个字节,4 * 25 = 100】
for(i = 0;i < 25;i++){
//p还是void*类型,添加int型数据需强转
*((int*)p+i) = i + 1;
}
/*
打印输出
*/
for(i = 0;i < 25;i++){
printf("%d ",*((int*)p+i));
}
free(p);//分配完空间,需释放资源
return 0;
}
根据打印结果,我们知道该分配空间在内存地址为:0000 0000 006F 1430(操作系统64位)
3.链表
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
链表节点组成:
- 存储数据元素的数据域
- 存储下一个节点地址的指针域
链表图解:
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int n;
struct Node *next;//保存的下一个节点的地址
}Node;
int main(int argc, char const *argv[])
{
struct Node *node1 = malloc(sizeof(struct Node));
struct Node *node2 = malloc(sizeof(struct Node));
printf("node1地址:%p\n",node1);
printf("node2地址:%p\n",node2);
printf("\n");
//将两个节点进行关联起来
node1->next = node2;
printf("node1地址\t%p\n",node1);
printf("node2地址\t%p\n",node2);
printf("node1的next地址:%p\n",node1->next);
free(node1);
free(node2);
return 0;
}
由下面的截图我们可以知道,当node1指针域指向node2时,node1.next就是node2的内存地址了。
4.总结 (sublime text代码截图)
完