0

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

  1. 将节点添加到末尾的能力
  2. 删除数据与指定值匹配的节点的能力

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

这是代码

#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 struct。为什么?让我详细说明一下:你怎么知道你是想通过node还是struct node. 此外,我真的不明白这一点,struct node不比单个 typedef 名称长多少。

4

2 回答 2

2

问题:

  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问题,我相信它是可选的,人们只是为了方便而使用它。就个人而言,我不经常使用typedefstruct

编辑:

您的代码也带有错误。抱歉,我之前只关注语法。

请注意,malloc在 C 中不要向您保证分配的内存是 zeored,它实际上可能是里面的任何东西。所以需要手动填写:last->next = NULL;addToEnd.

于 2013-09-29T05:06:37.523 回答
1

要引用您struct的链表,请使用struct node,在 之后typedef,您也可以使用llist。您也可以使用链接问题的用途。

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

在这种风格中,您可以使用nodestruct node.

您面临的语法错误是,您误用了箭头运算符->它与. 对于,使用点运算符structstruct.

所以对于函数

void addToEnd(llist root, char entery[51])
{
    while(root->next != NULL)
        root = root->next;

你应该传入一个指针:

void addToEnd(llist* root, char entery[51])
于 2013-09-29T05:08:32.687 回答