C语言---链表(包括学习过程中的思想活动)
2021-02-18 12:18
标签:想法 i++ 段错误 har 节点 变量 玩游戏 scan string 写链表想法的由来: 链表---重要的数据结构,工作了这么长时间,再也没有写过链表,可能是由于工作中没有使用的原因,也可能是我太懒了,还可能是因为玩游戏玩过头了吧!总之我知道有链表,但是链表是什么好想就天马行空了,所以决定写一下,哈哈,虽然我很菜,但是再菜我也要它跑起来,万一哪天要用那么一下子呢!好了废话不多说,来满足一下自己的小小的一个期望(它跑起来)。 特简单的: 首先呢!先码一个特别简单的,主要是为了先了解一下嘛!然后在一点点深入嘛!毕竟这么长时间没有写过了,不是嘛? [root@yuan misc]# gcc link_list.c 链表从表面的意思上就是链状的表,就像一根线上系了很多一样的结,这些结就是我们定义的结构体,而链就是我们定义的结构体中的指针next。next中存放着下一个节点的地址,这样我们就把所有的节点串联了起来,就像我们上边执行的结果一样。其实就是指针将数据串联。 稍微有点复杂的: (我觉得上边码的那个并不算是真正意义上的链表,我们只是把三个结构体变量串联了起来)写一个稍微复杂点的链表: [root@localhost address_list]# ./a.out 代码中有部分注掉的,那部分是因为数字长度的问题,我试了%ll,%l64d, %lld,%ld输出的结果都不是期望值,所以就改用了字符串,这个问题有时间我在查一下吧! 逐句分析: 首先我们定义了一个结构体Node,结构体成员有三个,用来存储一个人名和其对应的电话号码(11位),next指针用来指向下一个节点; 在main函数中,先要输入一个数字,来确定我们的链表的长度,然后创建链表,将其存储的内容打印出来,最后释放各个节点。 createList函数中: 生成一个头节点,根据num确定需要生成节点的个数,并对其各个节点进行赋值。 createList函数中我们定义了三个结构体变量,一个是头节点head,一个是节点node,还有一个临时结构体变量tmp。我们将头节点head赋值给中间变量tmp,然后分配一个新的节点node,将node赋值给中间变量tmp结构体成员变量中的next指针变量(也就是头节点head结构体成员变量中的next指针变量),这样头节点就和新分配的节点node串联起来了。其中有一句tmp = node,这句话表示将新生成的节点node赋值给了中间变量tmp,这样做是为了在下一次循环中中间变量tmp表示的是上一次分配的node节点,再次分配新的节点后和现在的中间变量tmp(也就是上一次分配的节点)串联。描述的有点乱,仔细想一下也不是那么乱。 当循环结束后,将最后分配的节点node结构体成员中的next指针变量指向NULL。 返回头节点head。 printList函数中: 刚开始是这样写的: [root@localhost address_list]# ./a.out 从执行结果中可以看出,我们链表长度是2,但是在打印的出来的结果中去出现三个,只是因为其中空的那个是头节点。 freeList函数: 由于使用了malloc函数动态分配就需要free函数掉,防止内存泄漏,其中有一句tmp = NULL;这句是为了防止野指针,但是NULL也是一个地址,只不过这个地址是确定的(void *)0;但是这句话加到循环里就会出现问题,因为在free掉tmp后这个指针还是存在的,可能就是野指针吧(这里我不确定),但是这时的tmp确确实实是存在的,所以才有了下面的操作。而当我们将tmp制空后,它的地址也就不存在了,我们在进行后边的操作的时候就操作非法地址,就会出现段错误。 还需将头节点free掉。 C语言---链表(包括学习过程中的思想活动) 标签:想法 i++ 段错误 har 节点 变量 玩游戏 scan string 原文地址:https://www.cnblogs.com/coolYuan/p/9261364.html#include
// 执行结果
[root@yuan misc]# ./a.out
---->10---->20---->30 1 #include
// 执行结果
Please enter the number of nodes int the link_list :
2
create [1] node!
Please enter your name :
test
Please enter your number :
12345678901
create [2] node!
Please enter your name :
test2
Please enter your number :
12345678902
name : test, number : 12345678901
name : test2, number : 12345678902
clean up [1] node!
clean up [2] node!
clear finish!void printList(Node *node)
{
while(node) {
printf("name : %s, number : %s\n", node->name, node->number);
node = node->next;
}
}
// 执行结果
Please enter the number of nodes int the link_list :
2
create [1] node!
Please enter your name :
test
Please enter your number :
12345678901
create [2] node!
Please enter your name :
test2
Please enter your number :
12345678902
name : , number :
name : test, number : 12345678901
name : test2, number : 12345678902
clean up [1] node!
clean up [2] node!
clear finish!
文章标题:C语言---链表(包括学习过程中的思想活动)
文章链接:http://soscw.com/index.php/essay/57037.html