将节点插入Dllist

时间:2018-03-28 13:13:26

标签: c algorithm list data-structures doubly-linked-list

我正在尝试使用过程而不是返回指向列表新头部的指针的函数将节点插入到双向链表中。

我收到此编译错误:

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;
}

2 个答案:

答案 0 :(得分:1)

看来你的意思是

( *head )->prev = new_node;

而不是

*head->prev = new_node;

因为后缀运算符->的优先级高于一元运算符*,并且在应用运算符之前首先需要取消引用指针head - >。

然而,无论如何这个功能都是错误的。如果你只声明了列表的头部(尽管通常为双向链表列出头部和尾部节点),那么该函数应该像

一样实现
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;
}

或者最好定义它,以便在操作成功时返回信号。

例如

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;
}

答案 1 :(得分:0)

我收到此编译错误:?这是因为运算符优先级(因为->的优先级高于*所以它执行的是您不想要的第一个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;
   }