Я реализую функцию, которая удаляет дубликаты из несортированного дважды связанного списка. Я удалил другие функции, чтобы код был коротким и понятным. Предположим, что другие функции, такие как InsertFront, работают правильно.Прикрепление указателей при удалении дубликатов из дважды связанного списка
У меня возникли проблемы с прикреплением указателя prev из моего класса Node, когда я удаляю дубликат. Я не уверен, правильно ли подключаю предыдущий указатель. В настоящее время я получаю ошибку 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-> next-> пред = runner-> next-> пред -> prev; ' - 'runner-> next-> prev = runner;' будет иметь значение –
Благодарим за отзыв. К сожалению, это не сработало и привело к ошибке seg. – Josh
Совпадающие списки сложны. Вероятно, лучше всего определить функцию общего назначения, например 'removeNode()', отладить ее, а затем использовать ее как часть функции 'removeDuplicates()'. – comingstorm