首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现双向链表

实现双向链表
EN

Stack Overflow用户
提问于 2021-09-24 20:08:51
回答 2查看 88关注 0票数 0

我已经得到了实现双向链表的框架。我被PushFront()方法难住了。该方法应将提供的元素添加到链表的前面,并将地址返回给新的头节点。我对如何访问列表的当前头部感到困惑,这样我就可以将它赋值给pNext指针。到目前为止,PushFront()方法看起来像这样:

代码语言:javascript
复制
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类构造函数:

代码语言:javascript
复制
Element::Element(Data d){
   ElementData = d;
   pNext = NULL;
   pPrev = NULL;
}

数据类:

代码语言:javascript
复制
Data::Data(){
Name = "Unknown";
SN = 0;
Program = "Unknown";
}

Data::Data(string NameStr, unsigned int sNumber, string Prog) :
Name(NameStr), SN(sNumber), Program(Prog) {};

Main:

代码语言:javascript
复制
Element* pList = new Element(Data("Cam", 12345, "Testing1"));   
Element newE(Data("Bob", 335567, "Testing2"));
pList = pList->PushFront(&newE);

我的理解是,您通常会在调用PushFront()时提供头的地址,但是,由于没有提供,我不确定如何访问它。

EN

回答 2

Stack Overflow用户

发布于 2021-09-24 20:19:56

使用您对列表定义的方法,该函数可以采用以下方式

代码语言:javascript
复制
Element * Element::PushFront( Element *d )
{
    Element *newElement = new Element( d->ElementData );

    newElement->pNext = this;
    newElement->pPrev = this->pPrev;
    this->pPrev = newElement;

    return newElement;
}

尽管这样的函数声明并没有多大意义。该函数的声明至少应类似于

代码语言:javascript
复制
Element * Element::PushFront( const Data &d );

而不是

代码语言:javascript
复制
Element * Element::PushFront( Element *d );

或者甚至像

代码语言:javascript
复制
Element * Element::PushFront( const char *Name, unsigned int SN, const char *Program );

请注意,最好再声明一个数据结构,它确实将表示双向链表,并且将包含指向列表中类型元素的第一个(头)和最后一个(尾)对象的指针。

票数 1
EN

Stack Overflow用户

发布于 2021-09-25 10:29:51

我对如何访问列表的当前标题感到困惑

当您在pList实例上调用PushFront方法时,this引用将是pList,假设它是列表的头部。主程序负责维护对head的引用。

请注意,有时会创建另一个类来表示该列表,然后该列表具有一个head成员。然而,在这种情况下,您似乎没有这样的类,并且主程序必须管理头部本身,即pList

然后,PushFront方法必须“帮助”主程序执行此操作,并将引用返回给新的head。所以不要返回nullptr

我真的不明白为什么在PushFront中要创建一个新的Element,因为您已经获得了一个作为参数传递的元素。我认为这样做的目的是将该元素添加到列表中,而不是它的副本。

所以:

代码语言:javascript
复制
Element* Element::PushFront(Element* d){
   d->pNext = this;
   d->pPrev = NULL;
   return d;
}

在主程序中,我建议使用new创建两个Element实例,以便它们的内存管理是相同的:

代码语言:javascript
复制
Element* pList = new Element(Data("Cam", 12345, "Testing1"));   
Element* newE = new Element(Data("Bob", 335567, "Testing2"));
pList = pList->PushFront(newE);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69320637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档