我已经得到了实现双向链表的框架。我被PushFront()方法难住了。该方法应将提供的元素添加到链表的前面,并将地址返回给新的头节点。我对如何访问列表的当前头部感到困惑,这样我就可以将它赋值给pNext指针。到目前为止,PushFront()方法看起来像这样:
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::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) {};Main:
Element* pList = new Element(Data("Cam", 12345, "Testing1"));
Element newE(Data("Bob", 335567, "Testing2"));
pList = pList->PushFront(&newE);我的理解是,您通常会在调用PushFront()时提供头的地址,但是,由于没有提供,我不确定如何访问它。
发布于 2021-09-24 20:19:56
使用您对列表定义的方法,该函数可以采用以下方式
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 );请注意,最好再声明一个数据结构,它确实将表示双向链表,并且将包含指向列表中类型元素的第一个(头)和最后一个(尾)对象的指针。
发布于 2021-09-25 10:29:51
我对如何访问列表的当前标题感到困惑
当您在pList实例上调用PushFront方法时,this引用将是pList,假设它是列表的头部。主程序负责维护对head的引用。
请注意,有时会创建另一个类来表示该列表,然后该列表具有一个head成员。然而,在这种情况下,您似乎没有这样的类,并且主程序必须管理头部本身,即pList。
然后,PushFront方法必须“帮助”主程序执行此操作,并将引用返回给新的head。所以不要返回nullptr。
我真的不明白为什么在PushFront中要创建一个新的Element,因为您已经获得了一个作为参数传递的元素。我认为这样做的目的是将该元素添加到列表中,而不是它的副本。
所以:
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);https://stackoverflow.com/questions/69320637
复制相似问题