2-栈上的c语言链表

64 阅读1分钟

一个最简单的链表

大家一般看到的链表都是在直接使用堆 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 都是相同的地址 根本无法生成 链表

同样也就无法使用 函数封装了 函数里面也是 创建的都是相同的 但是虽然这个有这么多的弊端 还是感觉这个很适合初学者 或者说 拾起来这部分内容的