我正在采取数据结构课程,目前的任务是创建一个简单的队列类,它是从现有的双向链表列类构建的。问题与双向链接列表中的添加方法C++
听起来很容易,但我相当生疏,尤其是使用C++,而且我很难从书中获取双链表代码。代码有意义(除了add方法),但是当我尝试调用addFront()时程序崩溃。
我有一种感觉,我犯了一个愚蠢的错误,但我显然需要一些帮助和解释,如果我不能得到示例代码来正确运行。
教授建议我们使用的代码在Michael T. Goodrich的C++数据结构和算法的第127页。您可以使用亚马逊的外观功能实际查看此页面。 http://amzn.com/0470383275
我试图编译的文件可以在这里找到: https://dl.dropboxusercontent.com/u/12660663/DLinkedList.zip
这是笔者的前面添加方法,它要求在那里我认为问题出在add()方法。
void DLinkedList::addFront(const Elem& e) // add to front of list
{ add(header->next, e); }
这是它究竟是如何(顺便说完全Comic Sans字体)写在书和教授MS Word文档完整的示例代码的附加功能:
// Insert new node before v
void DLinkedList::add(DNode* v, const Elem& e)
{
DNode* u = new DNode; u->elem = e; // create a new node for e
u->next = v; // link u in between v
u->prev = v->prev; // ...and v->prev
v->prev->next = v->prev = u;
}
这段代码有意义,除了最后一行,我发现很难遵循。
这是我做的主,使程序崩溃(记住,该项目实际上是使用这个类来创建另一个类,所以我只是想获得它的工作):
#include "DLinkedList.h"
int main()
{
DLinkedList list;
Elem s;
s = "Jim";
list.addFront(s); // This and addBack(s) causes the program to crash,
// doesn't crash if I remove this line
return 0;
}
这里是头文件:
#include <string>
#include <iostream>
using namespace std;
#ifndef DLINKEDLIST_H_
#define DLINKEDLIST_H_
// Code Fragment 3.22
typedef string Elem; // list element type
class DNode { // doubly linked list node
private:
Elem elem; // node element value
DNode* prev; // previous node in list
DNode* next; // next node in list
friend class DLinkedList; // allow DLinkedList access
};
// Code Fragment 3.32
class DLinkedList { // doubly linked list
public:
DLinkedList(); // constructor
~DLinkedList(); // destructor
bool empty() const; // is list empty?
const Elem& front() const; // get front element
const Elem& back() const; // get back element
void addFront(const Elem& e); // add to front of list
void addBack(const Elem& e); // add to back of list
void removeFront(); // remove from front
void removeBack(); // remove from back
private: // local type definitions
DNode* header; // list sentinels
DNode* trailer;
protected: // local utilities
void add(DNode* v, const Elem& e); // insert new node before v
void remove(DNode* v); // remove node v
};
#endif /* DLINKEDLIST_H_ */
我试图与“功课”这个标签,但显然这不是个东西了。
尽管这是作业,我的任务是重用这个已经写好的代码来创建一个新类。
在此先感谢,我非常感谢任何建议和解释。
迈克尔
您可以显示'DLinkedList'构造?我怀疑你没有适当地设置'header'。 –
您需要显示'DLinkedList'的构造函数,因为无论它如何初始化'header',都不足以让'add'工作而不会崩溃。 –