我的双链表有两个虚拟节点,头部和尾部。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
我怀疑这个问题是通过你的虚拟元素引入的。我更多地使用单链接列表,而不是双向列表。但在这种情况下,我有一个头部指针,它不在列表中。当列表为空时,则为空。这需要特殊的案例html" target="_blank">代码来检查每次插入时列表的头是否为空。因为插入是稍微不同的。
所以我倾向于你们的情况是,头和尾都是空的。然后,当添加第一个元素时,head和tail被设置为指向同一个元素。元素的next和prev将被设置为null。因为之前或之后都没有元素。
然而,我认为对于双向链表(通常被称为双链表)有一个更干净的解决方案。在该解决方案中,只有一个“虚拟”条目。同时充当头部和尾部。嗯-
因为我怀疑这是一个编码练习,所以我没有为您编写代码。相反,这有助于理解其中的逻辑。
这里有几个错误。我建议你重新复习一下基础知识。下面是对代码的快速修复。确保理解每个变化。
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
我有关于如何修改指针的问题,使用类类型元素的对象的前一个和下一个实例变量。双向链表由具有lastName、firstName、phoneNumber、前一个和下一个实例变量的Element对象填充。RemveElement方法接受lastName作为参数,并找到具有该确切String的元素,然后将其从列表中删除。然而,当修改应该从列表中删除元素的指针时,我遇到了一个异常。具体来说,在这段代码中:
本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。
在下面的双向链表示例中,我可以将节点添加到双向链表的前面和双向链表的末尾。我还可以向前遍历双向链表并成功打印节点的值。当我向后打印列表时,我的tail.previous值为空,我只能打印当前在尾部的节点值。请告诉我出了什么问题。谢谢。 测试代码如下:公共类DDLTest{