我想创建一个双链表,我在访问结构中的字段时遇到问题。这是我的代码:
#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
但也没有工作。有什么办法让我无法做到这一点吗?
答案 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_front
和push_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;
};
另外,不要忘记编写一个函数,在不再需要时删除列表中的所有节点。