[英]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
是一种类型,就像int
或FILE
或char
,它是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.