创建三个结构链接列表的简单方法

时间:2018-02-22 08:28:56

标签: c struct

我想创建一个总共三个结构的链接列表 有没有办法让下面的代码更简单?

#include <stdio.h>
#include <stdlib.h>

struct hello {
    int data;
    struct hello *next;
};

void main()
{
    struct hello *head;

    if (head == NULL) {
        head = malloc(sizeof(struct hello));
        head->next = malloc(sizeof(struct hello));
        head->next->next = malloc(sizeof(struct hello));
        head->next->next->next = NULL;
    }
}

2 个答案:

答案 0 :(得分:1)

最基本且更易于理解的一个,更简单的解决方案将采用一系列指针和循环。

我能观察到的代码的另一个问题是:

struct hello *head;

    if (head == NULL) { }

head是指针类型的局部变量,除非你的代码那样做,否则不保证它被初始化为零。

在下面的代码中,pNode会为您做到这一点。

#include <stdio.h>
#include <stdlib.h>

struct hello {
    int data;
    struct hello *next;
};

int main(void)
{
    int i = 0;
    struct hello *pNode[3] = { NULL, NULL, NULL };

    for(i = 0; i < 3; i++)
    {
        pNode[i] = malloc(sizeof(struct hello));
        if(pNode[i] == NULL)
        {
            printf("No memory");
            // Some error-handling
            return -1;
        }
    }

    // lets link all the nodes that were malloc'ed (successfully)
    for(i = 0; i < 2; i++) //Note: loop from index 0 to 1, instead of 2.
    {
        pNode[i]->next = pNode[i+1];
    }       
    pNode[2]->next = NULL;

    // Ugly, straight, crude way to write data values
    pNode[0]->data = 10;
    printf("\n%d", pNode[0]->data);
    pNode[0]->next->data = 20;
    printf("\n%d, %d", pNode[0]->next->data, pNode[1]->data);
    pNode[0]->next->next->data = 30;
    printf("\n%d, %d", pNode[0]->next->next->data, pNode[2]->data);

    return 0;
}

确保你养成检查malloc是否返回任何内容的习惯,否则你也需要处理该错误。

请记住,上面的代码总是可以用更加优化,智能和复杂的方式实现。它只是想要抛出一个基本的代码,它似乎做了它所说的,以及你可以随时随地改变的东西。

答案 1 :(得分:0)

如果你不打算添加任何更多的节点(结构),即使它意味着从列表中取出一个并再次将其重新放入,那么你可以使它更短(如果简短是你的意思,简单)删除

if(head==null)

如果声明。无论如何,它在一开始就是无效的(最可能是垃圾价值)。

但是,不建议以这种方式实现链接列表。它缺乏可扩展性(我的意思是,如果你不得不在以后增加节点数量会很繁琐)并且在这种情况下变得更难 - 在这种情况下几乎不可能 - 稍后进行更改。

互联网上有大量的链表示例。一些好习惯是包含add_node函数,delete_node函数和search_node函数。只需将这些功能添加到链接列表中,您的代码就会变得更易于管理。

如果它不必是链表,那么int [3]数组也可以。

希望这会有所帮助。