将节点插入 Dllist
Insert node into Dllist
我正在尝试使用过程而不是 returns 指向列表新头的指针的函数将节点插入双向链表。
我遇到这个编译器错误:
struct.c: In function 'insert':
struct.c:28:10: error: '*head' is a pointer; did you mean to use '->'?
*head->prev = new_node;
^~
->
代码:
typedef struct node {
int val;
struct node* next;
struct node* prev;
}node;
void insert(node** head, int val) {
node* new_node = malloc(sizeof(node));
new_node->val = val;
new_node->next = *head;
*head->prev = new_node;
*head = new_node;
}
我收到这个编译器错误:?这是因为运算符优先级(因为 ->
比 *
具有更高的优先级所以它首先执行 head->
你不想要的,你希望首先 *head
发生,所以把(*head)
.
*head->prev
应该是 (*head)->prev
.
(*head)->prev = new_node;
正如其他人所指出的,进行适当的验证(检查所有测试用例)。
if((*head) == NULL) { /* for first node */
new_node->prev = 0; /* for first node prev should 0 */
new_node->next = *head;
*head = new_node;
return 1;
}
else {
new_node->next = *head;
(*head)->prev = *head; /*otherwise head content */
*head = new_node;
}
你的意思好像是
( *head )->prev = new_node;
而不是
*head->prev = new_node;
因为后缀运算符 ->
的优先级高于一元运算符 *
并且在应用运算符 ->.[= 之前首先需要取消引用指针 head
17=]
然而无论如何这个函数都是错误的。如果你只声明了列表的头部(尽管通常为 doubly-linked 列表声明了头部和尾部节点)那么该函数应该像
一样实现
void insert( node** head, int val )
{
node *new_node = malloc( sizeof( node ) );
new_node->val = val;
new_node->next = *head;
new_node->prev = NULL;
if ( *head ) ( *head )->prev = new_node;
*head = new_node;
}
或者最好将其定义为 return 指示操作是否成功。
例如
int insert( node** head, int val )
{
node *new_node = malloc( sizeof( node ) );
int success = new_node != NULL;
if ( success )
{
new_node->val = val;
new_node->next = *head;
new_node->prev = NULL;
if ( *head ) ( *head )->prev = new_node;
*head = new_node;
}
return success;
}
我正在尝试使用过程而不是 returns 指向列表新头的指针的函数将节点插入双向链表。
我遇到这个编译器错误:
struct.c: In function 'insert':
struct.c:28:10: error: '*head' is a pointer; did you mean to use '->'?
*head->prev = new_node;
^~
->
代码:
typedef struct node {
int val;
struct node* next;
struct node* prev;
}node;
void insert(node** head, int val) {
node* new_node = malloc(sizeof(node));
new_node->val = val;
new_node->next = *head;
*head->prev = new_node;
*head = new_node;
}
我收到这个编译器错误:?这是因为运算符优先级(因为 ->
比 *
具有更高的优先级所以它首先执行 head->
你不想要的,你希望首先 *head
发生,所以把(*head)
.
*head->prev
应该是 (*head)->prev
.
(*head)->prev = new_node;
正如其他人所指出的,进行适当的验证(检查所有测试用例)。
if((*head) == NULL) { /* for first node */
new_node->prev = 0; /* for first node prev should 0 */
new_node->next = *head;
*head = new_node;
return 1;
}
else {
new_node->next = *head;
(*head)->prev = *head; /*otherwise head content */
*head = new_node;
}
你的意思好像是
( *head )->prev = new_node;
而不是
*head->prev = new_node;
因为后缀运算符 ->
的优先级高于一元运算符 *
并且在应用运算符 ->.[= 之前首先需要取消引用指针 head
17=]
然而无论如何这个函数都是错误的。如果你只声明了列表的头部(尽管通常为 doubly-linked 列表声明了头部和尾部节点)那么该函数应该像
一样实现void insert( node** head, int val )
{
node *new_node = malloc( sizeof( node ) );
new_node->val = val;
new_node->next = *head;
new_node->prev = NULL;
if ( *head ) ( *head )->prev = new_node;
*head = new_node;
}
或者最好将其定义为 return 指示操作是否成功。
例如
int insert( node** head, int val )
{
node *new_node = malloc( sizeof( node ) );
int success = new_node != NULL;
if ( success )
{
new_node->val = val;
new_node->next = *head;
new_node->prev = NULL;
if ( *head ) ( *head )->prev = new_node;
*head = new_node;
}
return success;
}