一个最简单的链表
大家一般看到的链表都是在直接使用堆 malloc分配空间然后封装成函数 个人觉得不是很适合初学者 或者说 太突兀了 和之前的内容 间隔过多了 甚至于我每次想要复习链表都要很大的勇气来 翻看那很长一串的代码 很抽象的代码 但是这个是我想出来的最简单的一个链表 这个只能有我们自己使用 长度里面的值都是写死了的 但是 很简洁 没有封装 和一些其他的东西
#include "head.h"
typedef struct node
{
int value;
// node_t * next;
struct node *next;
} node_t;
int main()
{
node_t head;
node_t *temp = head.next;
head.value = -1;
// NULL 一般作为一个宏出现 是被封装在 stddef里面的
head.next = NULL;
node_t n1 = {.next = NULL, .value = 1};
node_t n2 = {.next = NULL, .value = 2};
node_t n3 = {.next = NULL, .value = 3};
node_t n4 = {.next = NULL, .value = 4};
node_t n5 = {.next = NULL, .value = 5};
head.next = &n1;
n1.next = &n2;
n2.next = &n3;
n3.next = &n4;
n4.next = &n5;
temp = &head;
for (int i = 0; i < 20; i++)
{
printf("%d ", temp->value);
temp = temp->next;
if (temp->next == NULL)
{
break;
}
}
return 0;
}
一些问题
1.为什么不用for循环
for (int i = 0; i < 10; i++)
{
node_t new_node = {.next = NULL, .value = i};
printf("new_node %p \n", &new_node);
printf("head %p \n", &head);
node_t *temp = head.next;
printf("temp %p \n", temp);
// temp.next = new_node;
head.next = &new_node;
new_node.next = temp;
/* code */
}
这个是一个for循环的 链表 但是这个我测试了几次都是 报错 出来的内容很抽象 然后我就看了一下 就是 c语言在一个作用域里面 生成的变量分配的 地址是相同的 即 我每次 生成 new_node 都是相同的地址 根本无法生成 链表
同样也就无法使用 函数封装了 函数里面也是 创建的都是相同的 但是虽然这个有这么多的弊端 还是感觉这个很适合初学者 或者说 拾起来这部分内容的