如何在ADT中创建一个双向链表并且不使用指针?
How to create a bi-directional linked list and do not use pointer in ADT?
现在我正在尝试定义一个ADT并用它来创建一个链表,我想让它适合函数List newList(void);
。我知道如果是List* newList(void);
我该怎么办。如果我试图适应 List* newList(void);
,那么我会像
这样定义这个 ADT
typedef struct List{
struct List *next;
struct List *prev;
int number;
} List;
但是我这样定义的话,链表中的节点都是指针,我不想用。现在我试着用下面的方式定义链表。
typedef struct List{
struct List next;
struct List prev;
int number;
} List;
但是我收到错误信息:
List.h:4:17: error: field ‘next’ has incomplete type
4 | struct List next;
| ^~~~
List.h:5:17: error: field ‘prev’ has incomplete type
5 | struct List prev;
| ^~~~
我试图将 typedef
移动到 .c 文件中(现在它在头文件中),但它仍然不起作用。有人可以帮我吗?
But If I define in this way, the nodes in linked list will be all
pointers, which I don't want to use
你错了。列表中的所有节点都将具有 struct List
类型。但是它们会被动态分配。
至于这个功能
List newList(void);
那就说不通了。
你需要像这样声明函数
List * newList( int number );
例如
List * newList( int number )
{
List *node = malloc( sizeof( List ) );
if ( node != NULL )
{
node->next = NULL;
node->prev = NULL;
node->number = number;
}
return node;
}
如果您不想动态分配节点,您可以使用例如将列表定义为数组时的方法。在这种情况下,您可以使用函数
将节点添加到列表中
List newList( int number )
{
List node = { .next = NULL, .prev = NULL, .number = number };
return node;
}
但在这种情况下,您需要再声明一个确实会描述列表的结构。您当前的结构实际上只声明了列表的一个节点。
现在我正在尝试定义一个ADT并用它来创建一个链表,我想让它适合函数List newList(void);
。我知道如果是List* newList(void);
我该怎么办。如果我试图适应 List* newList(void);
,那么我会像
typedef struct List{
struct List *next;
struct List *prev;
int number;
} List;
但是我这样定义的话,链表中的节点都是指针,我不想用。现在我试着用下面的方式定义链表。
typedef struct List{
struct List next;
struct List prev;
int number;
} List;
但是我收到错误信息:
List.h:4:17: error: field ‘next’ has incomplete type
4 | struct List next;
| ^~~~
List.h:5:17: error: field ‘prev’ has incomplete type
5 | struct List prev;
| ^~~~
我试图将 typedef
移动到 .c 文件中(现在它在头文件中),但它仍然不起作用。有人可以帮我吗?
But If I define in this way, the nodes in linked list will be all pointers, which I don't want to use
你错了。列表中的所有节点都将具有 struct List
类型。但是它们会被动态分配。
至于这个功能
List newList(void);
那就说不通了。
你需要像这样声明函数
List * newList( int number );
例如
List * newList( int number )
{
List *node = malloc( sizeof( List ) );
if ( node != NULL )
{
node->next = NULL;
node->prev = NULL;
node->number = number;
}
return node;
}
如果您不想动态分配节点,您可以使用例如将列表定义为数组时的方法。在这种情况下,您可以使用函数
将节点添加到列表中List newList( int number )
{
List node = { .next = NULL, .prev = NULL, .number = number };
return node;
}
但在这种情况下,您需要再声明一个确实会描述列表的结构。您当前的结构实际上只声明了列表的一个节点。