我已经得到了实现双向链表的框架。我被PushFront()方法难住了。方法应该将提供的元素添加到链表的前面,并且应该将地址返回到新的头节点。我对如何访问列表的当前头部感到困惑,以便我可以将其分配给pNext指针。到目前为止,PushTop()方法看起来是这样的:
Element* Element::PushFront(Element* d){
Element* newElement = new Element(Data()); // Allocate space for new element
newElement->ElementData = d->ElementData; // Assign ElementData to the new element
newElement->pNext = // Head address
newElement->pPrev = NULL;
return nullptr;
}
元素类构造函数:
Element::Element(Data d){
ElementData = d;
pNext = NULL;
pPrev = NULL;
}
数据类:
Data::Data(){
Name = "Unknown";
SN = 0;
Program = "Unknown";
}
Data::Data(string NameStr, unsigned int sNumber, string Prog) :
Name(NameStr), SN(sNumber), Program(Prog) {};
主要:
Element* pList = new Element(Data("Cam", 12345, "Testing1"));
Element newE(Data("Bob", 335567, "Testing2"));
pList = pList->PushFront(&newE);
我的理解是,您通常会在调用PushFron()时提供头的地址,但是因为我没有提供,我不确定如何访问它。
我对如何访问当前列表的头部感到困惑
当您在pList
实例上调用PushTop
方法时,这个引用将是
pList
,它被假定为列表的头部。主程序负责维护对头部的引用。
请注意,有时会创建另一个类来表示列表,然后该列表有一个
head
成员。然而,在这种情况下,您似乎没有这样一个类,主程序必须管理头部本身,即pList
。
然后,
PushFront
方法必须“帮助”主程序执行此操作,并将引用返回到新头部。所以不要返回nullptr
。
我真的不明白为什么在
PushFront
中创建一个新的元素,因为您已经获得了一个作为参数传递的元素。我认为目的是将该元素添加到列表中,而不是它的副本。
因此:
Element* Element::PushFront(Element* d){
d->pNext = this;
d->pPrev = NULL;
return d;
}
在主程序中,我建议使用
new
创建两个Element
实例,以便它们的内存管理相同:
Element* pList = new Element(Data("Cam", 12345, "Testing1"));
Element* newE = new Element(Data("Bob", 335567, "Testing2"));
pList = pList->PushFront(newE);
使用列表定义的方法,函数可以如下所示
Element * Element::PushFront( Element *d )
{
Element *newElement = new Element( d->ElementData );
newElement->pNext = this;
newElement->pPrev = this->pPrev;
this->pPrev = newElement;
return newElement;
}
尽管这样的函数声明意义不大。函数应至少声明为
Element * Element::PushFront( const Data &d );
而不是
Element * Element::PushFront( Element *d );
甚至像
Element * Element::PushFront( const char *Name, unsigned int SN, const char *Program );
请注意,最好再声明一个数据结构,它实际上将表示双链接列表,并包含指向列表中type元素的第一个(head)和最后一个(tail)对象的指针。
我正在尝试为一个项目创建一个双链接列表容器。我不能使用任何std容器。必须对双链接列表进行排序。以下是我目前的代码: 我遇到的问题是在我的插入函数中。我正在使用调试器,并在以下行插入代码:list.insert(10);。 它正确地进入第一种情况,即head==nullptr并创建节点。当我进入下一行代码(list.insert(20))时,它会用这一行创建一个节点:node*node=newno
给定单链接列表:
我有一个头和lastNode的参考。嗨我有个问题。当我删除双向链表中的最后一个节点时,我必须将该节点的前一个引用设置为空,或者我可以离开它。我在删除lastNode时做了这样的事情。 当我使用toString方法时,它会按预期打印。只是想知道是否有必要将旧的last node prev设置为null。或者垃圾收集器只是删除它,因为没有对它的引用,即使旧节点仍然有对链接列表中某个节点的引用
我正在尝试反转一个链表,我为此编写了代码。但是,当我在反转后打印列表时,输出有点不完整。 产量:120 110 100
双向链接列表是链接列表的变体,与单链接列表相比,可以以两种方式轻松地向前和向后导航。 以下是理解双向链表概念的重要术语。 Link - 链接列表的每个链接都可以存储称为元素的数据。 Next - 链接列表的每个链接都包含指向下一个名为Next的链接的链接。 Prev - 链表的每个链接都包含一个名为Prev的上一个链接的链接。 LinkedList - 链接列表包含指向名为First的第一个链接和
因此,我对数据结构很陌生,我在对数组进行排序时,在尝试了几天之后,我偶然发现了双链表的插入排序。我仍然无法理解排序有什么问题,是的,我已经在线检查过,我不能只插入排序,我需要对函数参数中传递的列表进行排序,它的名称是internationSort(Dlinkedlist-arr)。 ` ` 我尝试实现它,但我被困住了,因为处理数组的逻辑有点不同,因为我们正在使用 next 和 prev 指针,这使