【问题标题】:Accessing fields of a struct for a double linked list访问双链表结构的字段
【发布时间】:2015-01-05 02:28:36
【问题描述】:

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

#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-&gt;next-&gt;prev 遇到了崩溃,我不明白为什么。我是否不允许访问 temp2-&gt;next 节点的 prev 字段?我试过写(temp2-&gt;next)-&gt;prev,但也没有用。有什么方法我不能让它工作吗?

【问题讨论】:

  • 如果发生崩溃,这通常意味着您尝试使用*-&gt; 取消引用的指针要么是NULL,要么未初始化。所以检查temp2temp2-&gt;next

标签: c list dynamic dynamic-allocation


【解决方案1】:

当您插入第一个节点时,*head,因此temp-&gt;nextNULL。检查那个案例:

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 的演员表。)

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

【讨论】:

    【解决方案2】:

    试试这个:

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

    很可能头部没有初始化

    【讨论】:

      【解决方案3】:

      据我了解,您总是在头部之前插入一个新节点,但在双链表中,您通常必须在列表的尾部添加新节点。由于双链表通常有两侧,所以定义两个函数是有意义的: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; 
      };
      

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

      【讨论】:

        猜你喜欢
        • 2010-11-03
        • 1970-01-01
        • 2014-07-10
        • 2017-08-14
        • 1970-01-01
        • 2014-06-20
        • 2014-07-06
        • 2019-05-02
        相关资源
        最近更新 更多