从单链表到双链表的变化
C++ Changing from singly linked list to doubly linked list
我使用单链表编写了这段代码。现在我想把它改成双链表。我尝试了一些不同的东西,但都搞砸了。在我的代码中有一些无用的行,但它基本上是一个单链表。把它改成双链表的正确方法是什么?
#pragma once
#include "Exhibit.h"
struct Node
{
Exhibit exhibit;
Node *next;
};
class Museum
{
private:
Node *p;
Node *d;
Exhibit *Ex;
int n;
int nmax;
public:
Museum();
~Museum();
void Start() { d = p; }
bool HasNext() { if (d == NULL) return false; return true; }
void Next() { d = d->next; }
Exhibit GetExhibit() const { return d->exhibit; }
int GetN() { return n; }
void Sort();
void AddExhibit(Exhibit e);
void RemoveExpensive(int p); //Removes elements more expensive than int p
};
Museum::Museum()
{
p = NULL;
d = NULL;
}
Museum::~Museum()
{
Node * element;
while (p)
{
element = p;
p = p->next;
delete element;
}
p = NULL;
d = NULL;
}
void Museum::AddExhibit(Exhibit e)
{
Node *element = new Node;
element->exhibit = e;
element->next = p;
p = element;
}
int CountExhibits(string CDfv)
{
string line;
int count = 0;
ifstream fd(CDfv.c_str());
while (!fd.eof())
{
getline(fd, line);
count++;
}
fd.close();
return count;
}
void Museum::Sort()
{
// traverse the entire list
for (Node *list = p; list->next != NULL; list = list->next)
{
// compare to the list ahead
for (Node *pass = list->next; pass != NULL; pass = pass->next)
{
// compare and swap
if (list->exhibit.Date() > pass->exhibit.Date())
{
// swap
Exhibit temp = list->exhibit;
list->exhibit = pass->exhibit;
pass->exhibit = temp;
}
}
}
}
void Museum::RemoveExpensive(int pr)
{
Node *pPre = NULL, *pDel = NULL;
pPre = p;
pDel = p->next;
/* traverse the list and check the value of each node */
while (pDel != NULL) {
if (pDel->exhibit.Price() > pr) {
/* Update the list */
pPre->next = pDel->next;
/* If it is the last node, update the tail */
if (pDel == d) {
d = pPre;
}
delete pDel; /* Here only remove the first node with the given value */
pDel = pPre;
/* break and return */
}
pPre = pDel;
pDel = pDel->next;
}
/* Check whether it is the head node?
if it is, delete and update the head node */
if (p->exhibit.Price() > pr) {
/* point to the node to be deleted */
pDel = p;
/* update */
p = pDel->next;
delete pDel;
}
}
编辑:我的新AddExhibit()方法:
void Museum::AddExhibit(Exhibit e)
{
Node *element = new Node;
element->exhibit = e;
if (p == NULL)
p = d = element;
else
{
p->prev = element;
element->next = p;
p = element;
}
//element->next = p;
//p = element;
}
我用这个AddExhibit()方法解决了我的问题:
void Museum::AddExhibit(Exhibit e)
{
Node *element = new Node;
element->exhibit = e;
element->next = p;
element->prev = NULL;
if (p == NULL)
d = element;
else
p->prev = element;
p = element;
}
我不知道它是否完全正确,但它对我的情况很好。
相关文章:
- 反向给定链表中的K节点
- 如果没有malloc,链表实现将失败
- 文本文件中的单词链表
- 努力将整数转换为链表。不知道我在这里做错了什么
- 链表,反向函数,数据结构
- 使用std::list创建循环链表
- 链表的泛型函数remove()与成员函数remove)
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 我们可以删除链表中静态内存中的节点吗
- C++,指针数组,指向双链表中的条目
- 链表中写入访问冲突的未知原因
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 打印所有链表的元素 (C++)
- 错误:需要类名(链表c++)
- 为什么C中的通用链表中存储的数据已损坏
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 链表c++插入,所有情况都已检查,但没有任何工作
- 链表,将列表复制到另一个列表
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 从单链表到双链表的变化