将节点插入 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;
}