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

实施双链接列表

松雅昶
2023-03-14

我已经得到了实现双向链表的框架。我被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()时提供头的地址,但是因为我没有提供,我不确定如何访问它。

共有2个答案

曹渝
2023-03-14

我对如何访问当前列表的头部感到困惑

当您在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);

蓬思博
2023-03-14

使用列表定义的方法,函数可以如下所示

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 指针,这使