繁体   English   中英

如何在C中使用结构?

[英]How to use a struct in C?

这是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的原型中还将其用作返回类型。 到底是怎么回事?

那是一个typedef 实际上,它同时执行两项操作。 首先,它定义一个结构:

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

然后执行typedef

typedef struct node LLIST;

这意味着LLIST是一种类型,就像intFILEchar ,它是struct node (链接列表节点结构)的简写。 没必要-您可以在所有这些位置上用struct node替换LLIST但这使它更易于阅读,并帮助讨厌的最终用户隐藏实现。

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

typedef struct x { ... } NAME;

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)。

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复制到struct并将其添加到链接列表。

将其放在某个位置就像将它之前的节点中的next指针更改为新分配的节点的地址,然后将新节点中的next指针指向next指针(该节点之前的节点)一样简单。一个人最初指向)。

请记住(考虑到其余的函数原型),必须删除所有创建的节点的指针。

我不确定我是否了解搜索功能的工作方式。 这整个事情可以更好地实现。 创建节点时,您不必提供节点的位置(如果指定的数字大于节点数,该怎么办?)等等。

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

你应该做

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM