我正在實現一個從未排序的雙向鏈表中刪除重複項的函數。我刪除了其他函數以使代碼更簡短更清晰。請假設像InsertFront這樣的其他功能可以正常工作。在從雙向鏈表中刪除重複項時附加指針
我在刪除重複項時附加從Node類的prev指針時遇到問題。我不確定是否正確連接了prev指針。我目前正在發生seg故障。謝謝。
這是我的頭文件。 dlinkedlist.h
#ifndef _DLINKEDLIST_H_
#define _DLINKEDLIST_H_
#include <cstdlib>
#include <stdexcept>
#include <string>
#include <iostream>
using namespace std;
template <class T>
class Node
{
public:
T data;
//string data;
Node<T>* prev;
Node<T>* next;
// default constructor
Node(T value)
{
data = value;
prev = NULL;
next = NULL;
}
};
// DLinkedList class definition
template <class T>
class DLinkedList
{
private:
// DLinkedList private members
int size; // number of items stored in list
Node<T>* front; // references to the front
Node<T>* back; // and back of the list
DLinkedList();
DLinkedList(const DLinkedList& ll);
~DLinkedList();
void RemoveDuplicates();
}
這是我實現dlinkedlist.cpp
#ifdef _DLINKEDLIST_H_
#include <cstdlib>
#include <stdexcept>
#include "dlinkedlist.h"
#include <string>
#include <iostream>
using namespace std;
template <class T>
void DLinkedList<T>::RemoveDuplicates() {
Node<T> *current, *runner, *dup;
current = front;
cout << "Removing the duplicates..." << endl;
while (current != NULL && current->next != NULL) {
runner = current;
while (runner->next != NULL) {
if(current->data == runner->next->data) {
dup = runner->next;
runner->next = runner->next->next;
runner->next->prev = runner->next->prev->prev; //trying to connect to previous node. Works without this line.
delete dup;
}
else {
runner = runner->next;
}
}
current = current->next;
}
}
這是我的測試文件。 test.cpp
#include <cstdlib>
#include <iostream>
#include <string>
#include "ccqueue.h"
#include "dlinkedlist.h"
#include "ticket.h"
using namespace std;
void LLTest();
int main()
{
cout << "\nEntering DLinkedList test function..." << endl;
LLTest();
cout << "...DLinkedList test function complete!\n" << endl;
return 0;
}
void LLTest()
{
// default constructor, InsertFront, InsertBack, ElementAt
DLinkedList<int> lla;
lla.InsertFront(2);
cout << "-------------------------------------------------\n";
lla.InsertBack(5);
lla.InsertBack(10);
lla.InsertBack(2);
cout << "-------------------------------------------------\n";
lla.RemoveDuplicates();
}
謝謝你的時間。
我不知道爲什麼會造成一個問題,但它可能是值得考慮第二,看是否改變 'runner->下一步 - >分組= runner->下一步 - >上一頁 - > prev;' 至 'runner-> next-> prev = runner;' 會有所作爲 –
感謝您的回覆。不幸的是,這並沒有奏效,導致了seg故障。 – Josh
雙鏈表很棘手。最好定義一個通用函數,比如'removeNode()',調試它,然後將它用作removeDuplicates()函數的一部分。 – comingstorm