c - 将节点添加到链表末尾的函数签名有问题

标签 c linked-list malloc

在我正在编写的程序中,我需要一个链表,因此它是一个非常具体的实现。它需要:

  1. 能够在末尾添加一个节点
  2. 删除数据与指定值匹配的节点的能力

数据为cstring,长度不超过20个字符。我对 C 不是很有经验,并且遇到以下签名 void addToEnd(llist root, char entery[51]) 的错误。我尝试用 node 替换 llist 但错误是“未知类型名称节点”。我怎样才能摆脱这个?

这是代码

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

typedef struct node
{
  char entery[51];
  struct node* next;
} llist;

/*may be losing root address permanently*/
void addToEnd(llist root, char entery[51])
{
    while(root->next != NULL)
        root = root->next;
    node last = malloc(sizeof(struct node));
    root->next = last;
    strcpy(last, entery);
}

int main()
{
    struct node *root = malloc(sizeof(struct node));
    root->next = NULL;
    strcpy(root->entery, "Hello");

    struct node *conductor = root;//points to a node while traversing the list

    if(conductor != 0)
        while(conductor->next != 0)
            conductor = conductor->next;

    /* Creates a node at the end of the list */
    conductor->next = malloc(sizeof(struct node));

    conductor = conductor->next;

    if (conductor == NULL)
    {
        printf( "Out of memory" );
        return EXIT_SUCCESS;
    }
    /* initialize the new memory */
    conductor->next = NULL;
    strcpy(conductor->entery, " world\n");

    addToEnd(root, " at the");
    addToEnd(root, " end");

    /*print everything in list*/
    conductor = root;
    if(conductor != NULL)
    {
        while(conductor->next != NULL)
        {
            printf("%s", conductor->entery);
            conductor = conductor->next;
        }
        printf("%s", conductor->entery);
    }

    return EXIT_SUCCESS;
}

我不清楚的一件事是,在我见过的所有示例中,它们都是 typedef the struct .为什么?让我详细说明一下:你怎么知道你是否只想传递 nodestruct node。我也不太明白这一点,struct node 并不比单个 typedef 名称长多少。

最佳答案

问题:

  1. 第 12 行:void addToEnd(llist root, char entery[51]) 应为 void addToEnd(llist *root, char entery[51]) .这里的root必须是指针类型否则你实际上不能在函数内部修改它的值并使其在函数外部可见。

  2. 第 16 行:node last = malloc(sizeof(struct node)); 应为 struct node *last = malloc(sizeof(struct node));。因为在 C 中你必须使用关键字 struct 来引用类型名称,而且它必须是一个指针,否则它不能用 malloc 初始化。

至于您的 typedef 问题,我相信它是可选的,人们只是为了方便才使用它。就我个人而言,我不经常在 struct 上使用 typedef

已编辑:

您的代码也有错误。对不起,我之前只关注语法。

请注意 C 中的 malloc 并不能保证分配的内存是 zeored,它实际上可以是里面的任何东西。所以你需要手动填充它:在addToEnd的末尾添加一行last->next = NULL;

关于c - 将节点添加到链表末尾的函数签名有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19074590/

相关文章:

C编程: malloc() inside another function

c - recvfrom : Bad address, sendto: 协议(protocol)不支持的地址族

c++ - 有没有办法反编译 Linux .so?

c - 链表: Inserting a name and id number to list

C malloc 只为 int * 分配了 8 个字节

c - 在两个表之间分配数字的问题

c - 打印平方等于给定数字的所有数字组合的程序

c - 双链表中的访问冲突错误

c++制作链表的深层拷贝

C - 链表排序无限循环