当前位置: 首页 > 知识库问答 >
问题:

指向双链接列表中的错误位置?

越扬
2023-03-14

我的双链表有两个虚拟节点,头部和尾部。addToFirst函数对我来说非常适合,但是当我尝试使用与addToBack相同的算法时,它会一直为我打印虚拟节点。为什么会这样?

DList *init( )
{
   head = ( DList * ) malloc( sizeof( DList ) );
   if ( head == NULL ) {
      prtError( "Insufficient memory!" );
      return( NULL );
   }
   
   tail = ( DList * ) malloc( sizeof( DList ) );
   if ( tail == NULL ) {
      prtError( "Insufficient memory!" );
      return( NULL );
   } 
     
   head->data = -1;
   tail->data = -1;   
   head->next = tail;
   head->prev = NULL;  
   tail->next = NULL; 
   tail->prev = head;
   return ( head );  /* indicates no error */ 
}

/* print function */ 
void prtList( )
{
   DList *p;
   for ( p = head->next; p != tail; p = p->next )
        printf( "%4d", p->data );
   printf( "\n");
}

DList *insertFirst( int d )
{
                
   /***** ADD YOUR CODE HERE *****/
   DList *first = ( DList * ) malloc( sizeof( DList ) );
   printf("FF");
   if ( first == NULL ) {
      prtError( "Insufficient memory!" );
      return( NULL );
   }
   /* 2. put in the data  */
    first->data = d;
 
    /* 3. Make next of new node as head and previous as NULL */
    first->next = (head)->next;
    first->prev = NULL;
 
    /* 4. change prev of head node to new node */
    if ((head) != NULL)
        (head)->prev = first;
 
    /* 5. move the head to point to the new node */
    (head)->next = first;

   return first;        // replace this line with your code
}

DList *insertLast( int d )
{

   DList *last = ( DList * ) malloc( sizeof( DList ) );
   printf("LL");
   if ( last == NULL ) {
      prtError( "Insufficient memory!" );
      return( NULL );
   }
   /* 2. put in the data  */
    last->data = d;
 
    /* 3. Make next of new node as head and previous as NULL */
    last->prev = tail->prev;
    last->next = NULL;
 
    /* 4. change prev of head node to new node */
    if ((tail) != NULL)
        (tail)->next = last;
 
    /* 5. move the head to point to the new node */
    (tail) = last;
    //if I try with (tail)->prev = last; then the outputs were empty.


   return last; // replace this line with your code          

}

预期结果:

LL  5
LL  5  10
LL  5  10  15
LL  5  10  15  20
LL  5  10  15  20  25
LL  5  10  15  20  25  30
LL  5  10  15  20  25  30  35
LL  5  10  15  20  25  30  35  40
LL  5  10  15  20  25  30  35  40  45
LL  5  10  15  20  25  30  35  40  45  50
FF   5   5  10  15  20  25  30  35  40  45  50
FF  10   5   5  10  15  20  25  30  35  40  45  50
FF  15  10   5   5  10  15  20  25  30  35  40  45  50
FF  20  15  10   5   5  10  15  20  25  30  35  40  45  50
FF  25  20  15  10   5   5  10  15  20  25  30  35  40  45  50
FF  30  25  20  15  10   5   5  10  15  20  25  30  35  40  45  50
FF  35  30  25  20  15  10   5   5  10  15  20  25  30  35  40  45  50
FF  40  35  30  25  20  15  10   5   5  10  15  20  25  30  35  40  45  50
FF  45  40  35  30  25  20  15  10   5   5  10  15  20  25  30  35  40  45  50
FF  50  45  40  35  30  25  20  15  10   5   5  10  15  20  25  30  35  40  45  50

我的结果:

LL  -1
LL  -1   5
LL  -1   5  10
LL  -1   5  10  15
LL  -1   5  10  15  20
LL  -1   5  10  15  20  25
LL  -1   5  10  15  20  25  30
LL  -1   5  10  15  20  25  30  35
LL  -1   5  10  15  20  25  30  35  40
LL  -1   5  10  15  20  25  30  35  40  45
FF   5  -1   5  10  15  20  25  30  35  40  45
FF  10   5  -1   5  10  15  20  25  30  35  40  45
FF  15  10   5  -1   5  10  15  20  25  30  35  40  45
FF  20  15  10   5  -1   5  10  15  20  25  30  35  40  45
FF  25  20  15  10   5  -1   5  10  15  20  25  30  35  40  45
FF  30  25  20  15  10   5  -1   5  10  15  20  25  30  35  40  45
FF  35  30  25  20  15  10   5  -1   5  10  15  20  25  30  35  40  45
FF  40  35  30  25  20  15  10   5  -1   5  10  15  20  25  30  35  40  45
FF  45  40  35  30  25  20  15  10   5  -1   5  10  15  20  25  30  35  40  45
FF  50  45  40  35  30  25  20  15  10   5  -1   5  10  15  20  25  30  35  40  45

共有2个答案

闾丘英悟
2023-03-14

我怀疑这个问题是通过你的虚拟元素引入的。我更多地使用单链接列表,而不是双向列表。但在这种情况下,我有一个头部指针,它不在列表中。当列表为空时,则为空。这需要特殊的案例html" target="_blank">代码来检查每次插入时列表的头是否为空。因为插入是稍微不同的。

所以我倾向于你们的情况是,头和尾都是空的。然后,当添加第一个元素时,head和tail被设置为指向同一个元素。元素的next和prev将被设置为null。因为之前或之后都没有元素。

然而,我认为对于双向链表(通常被称为双链表)有一个更干净的解决方案。在该解决方案中,只有一个“虚拟”条目。同时充当头部和尾部。嗯-

因为我怀疑这是一个编码练习,所以我没有为您编写代码。相反,这有助于理解其中的逻辑。

巫化
2023-03-14

这里有几个错误。我建议你重新复习一下基础知识。下面是对代码的快速修复。确保理解每个变化。

DList *insertFirst( int d )
{
                
   /***** ADD YOUR CODE HERE *****/
   DList *first = ( DList * ) malloc( sizeof( DList ) );
   printf("FF");
   if ( first == NULL ) {
//      prtError( "Insufficient memory!" );
      return( NULL );
   }
   /* 2. put in the data  */
    first->data = d;
 
    /* 3. Make next of new node as head and previous as NULL */
    first->next = (head)->next;
    first->prev = head;
 
    head->next->prev=first;
    (head)->next = first;

   return head;        // replace this line with your code
}

DList *insertLast( int d )
{

   DList *last = ( DList * ) malloc( sizeof( DList ) );
   printf("LL");
   if ( last == NULL ) {
//      prtError( "Insufficient memory!" );
      return( NULL );
   }
   /* 2. put in the data  */
    last->data = d;
 
    /* 3. Make next of new node as head and previous as NULL */
    last->prev = tail->prev;
    last->next = tail;
    tail->prev->next=last;
    tail->prev=last;
   return head; // replace this line with your code 
}```
 类似资料:
  • 我正在制作一个方法,将一个节点添加到名为“publicvoidadd(int-index,T-value)”的列表中。 此方法将把一个值放入索引中,然后将有指向列表中下一个和上一个元素的指针。我把指向前面节点的指针搞砸了,我一直坐在那里进行实验,但没有让它工作。 示例:我们有一个包含整数值[2,4,6]实例变量的列表:Node head、tail;整数金额,变动; 内部类的实例变量为:T值;节点p

  • 我试图打印一个双链接列表,从tail元素开始,以first元素结束。我下面的代码就是这样做的,但出于某种原因,我也返回了被删除的项目。当我从头到尾打印列表时,它不会这样做。Idk,如果是toString导致了这个或dequed方法。我把两者都包括在内。

  • 我正在尝试创建二维双链接圆形阵列,从txt文件读取数据并自动创建节点。我的程序正在正确地读取第一行,但当它到达下一行并开始创建下一个节点时,会出现空指针。我不明白为什么会这样,请帮帮我。 这些都是错误。Null指针在尝试创建第二个节点时发生。它正确地创建第一个节点,而不是紧接着创建空指针。 第77行=位置next=n; 第69行=插入后(head.prev, x); 第18行=mList。镶片(k

  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 我有关于如何修改指针的问题,使用类类型元素的对象的前一个和下一个实例变量。双向链表由具有lastName、firstName、phoneNumber、前一个和下一个实例变量的Element对象填充。RemveElement方法接受lastName作为参数,并找到具有该确切String的元素,然后将其从列表中删除。然而,当修改应该从列表中删除元素的指针时,我遇到了一个异常。具体来说,在这段代码中:

  • 在下面的双向链表示例中,我可以将节点添加到双向链表的前面和双向链表的末尾。我还可以向前遍历双向链表并成功打印节点的值。当我向后打印列表时,我的tail.previous值为空,我只能打印当前在尾部的节点值。请告诉我出了什么问题。谢谢。 测试代码如下:公共类DDLTest{