访问双链表的结构字段

时间:2014-11-08 09:50:26

标签: c list dynamic dynamic-allocation

我想创建一个双链表,我在访问结构中的字段时遇到问题。这是我的代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int val;
    struct node * next;
    struct node * prev;
}node;

void insert(int val, node **head)
{
    node * temp= *head;
    node * temp2=(node *)malloc(sizeof(node));
    node * temp3=(node *)malloc(sizeof(node));
    temp2->val=val;
    temp2->prev=NULL;
    temp2->next=*head;
    *head=temp2;
    temp2->next->prev=temp2;
}

void print(node* head)
{
    node* temp=head;
    while(temp!=NULL)
    {
        printf("%d ", temp->val);
        temp=temp->next;
    }
}

int main()
{   node * head=NULL;
    insert(1, &head);
    insert(2, &head);
    print(head);
    return 0;
}

我在temp2->next->prev遇到了崩溃,我不明白为什么。我不被允许访问temp2->next节点的prev字段吗?我尝试写(temp2->next)->prev但也没有工作。有什么办法让我无法做到这一点吗?

3 个答案:

答案 0 :(得分:0)

当您插入第一个节点*head,因此temp->next时,NULL。检查一下这个案例:

void insert(int val, node **head)
{
    node *temp= malloc(sizeof(*temp));

    temp->val = val;
    temp->prev = NULL;
    temp->next = *head;
    *head = temp;

    if (temp->next) temp->next->prev = temp;
}

(我删除了未使用的变量并丢失了malloc上的强制转换。)

双重链表也应该有尾巴。在这种情况下,当您在空列表的头部附加项目时更新尾部。

答案 1 :(得分:0)

试试这个:

void insert(int val, node **head)
{
    if(*head == NULL){
        node * temp2=(node *)malloc(sizeof(node));
        temp2->val=val;
        *head = temp2;
    }
    else{
       node * temp= *head;
       node * temp2=(node *)malloc(sizeof(node));
       temp2->val=val;
       temp2->prev=NULL;
       temp2->next=temp;
       temp->prev = temp2;
    }

}

很可能头部未初始化

答案 2 :(得分:0)

据我所知,你总是在头部之前插入一个新节点,但是在双链表中你必须通常在列表尾部添加新节点。由于双链表通常有两个方面,因此可以定义两个函数:push_frontpush_back。您的函数insert对应于函数push_front

然而,函数insert可能看起来如下

void insert( int val, node **head )
{
    node *temp = ( node * )malloc( sizeof( node ) );

    temp->val  = val;
    temp->prev = NULL;
    temp->next = *head;

    if ( *head ) ( *head )->prev = temp; 

    *head = temp;
}

如果要定义另一个名为List(或其他)的结构并且可以定义为

,那会更好
struct List
{
   node *head;
   node *tail;
};

此外,您还可以添加一个数据成员 - 列表中节点的计数,例如

struct List
{
   node *head;
   node *tail;
   size_t count; 
};

另外,不要忘记编写一个函数,在不再需要时删除列表中的所有节点。