【问题标题】:How to use a struct in C?如何在 C 中使用结构?
【发布时间】:2010-11-17 06:47:03
【问题描述】:

这是 C 编程语言中链表的代码。

#include <stdio.h>    /* For printf */
#include <stdlib.h>   /* For malloc */

typedef struct node {
    int data;
    struct node *next; /* Pointer to next element in list */
} LLIST;

LLIST *list_add(LLIST **p, int i);
void list_remove(LLIST **p);
LLIST **list_search(LLIST **n, int i);
void list_print(LLIST *n);

代码未完成,但我认为对于我的问题来说已经足够了。这里在结构节点的末尾使用“LLIST”,它也用作函数list_add 原型设计中的返回类型。怎么回事?

【问题讨论】:

    标签: c struct


    【解决方案1】:

    那是typedef。它实际上是同时做两件事。首先,它定义了一个结构:

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

    然后做一个typedef:

    typedef struct node LLIST;
    

    这意味着LLIST 是一个类型,就像intFILEchar,这是struct node 的简写,你的链表节点结构。这不是必需的 - 您可以在所有这些地方将 LLIST 替换为 struct node - 但它使它更易于阅读,并有助于向讨厌的最终用户隐藏实现。

    【讨论】:

      【解决方案2】:

      LLIST 只是已创建结构的另一个类型名称。通常,以下格式将创建一个类型为“NAME”的“struct x”:

      typedef struct x { ... } NAME;
      

      【讨论】:

        【解决方案3】:

        C 要求您引用带有“struct”前缀的结构,因此通常会引入 typedef 以减少冗长的提及。

        也就是说,你的结构体的声明有两部分,可以这样重写:

        struct node {
            int data;
            struct node *next; /* pointer to next element in list */
        };
        
        typedef struct node LLIST;
        

        所以,LLIST 只是 struct node 的另一个名称(感谢 Chris Lutz)。

        【讨论】:

          【解决方案4】:

          typedef 在你的程序中创建一个新的“类型”,所以这些函数的返回值和参数类型就是你的结构。它只是使用struct node 类型的简写。

          如果你要创建一个新节点,你可以这样做(使用类型):

          LLIST *node = malloc(sizeof(LLIST));
          node->data = 4;
          node->next = someOtherItem;
          list_add(node, 1)
          

          此外,对于您问题中的函数原型,您实际上并不需要双指针;因为你的结构中的数据只是一个int,你可以做类似的事情

          LLIST *list_add(int data, int position);
          

          然后list_add 函数将处理分配,将int 复制到结构中并将其添加到链表中。

          把它放在某个位置,就这么简单,把它之前的节点中的next指针改成新分配节点的地址,把新节点中的next指针指向下一个(之前的节点最初指向的那个)。

          请记住(鉴于您的函数原型的其余部分),您必须跟踪指向您创建的每个节点的指针,以便将它们全部删除。

          我不确定我是否理解搜索功能的工作原理。整个事情可以更好地实施。您不应该必须在创建节点时提供节点的位置(如果您指定的数量大于节点数怎么办?)等等。

          【讨论】:

            【解决方案5】:

            LLIST* 是指向由LLIST 结构定义的结构的指针。

            你应该这样做

            LLIST* myList = malloc(sizeof(LLIST)*number_of_elements);
            

            为这个列表分配一些内存。添加和删​​除项目需要您使用 realloc 重新分配内存。我已经为列表编写了一些代码(用数组制作)。

            我可能会在我回家后立即发布代码,但目前情况并非如此。

            【讨论】:

            • 从技术上讲,您应该为列表中的每个项目执行malloc,因为它不是严格意义上的列表,而是带有指向列表中下一个项目的指针 (*next) 的结构。因此,您在创建每个列表项时执行单独的 malloc。
            猜你喜欢
            • 2021-04-23
            • 1970-01-01
            • 2011-10-28
            • 2014-10-07
            • 2019-06-05
            • 1970-01-01
            • 2014-11-28
            • 2014-04-05
            • 1970-01-01
            相关资源
            最近更新 更多