Good
Bad
Marry
Open
Close
Good
Open
Slot
Door
Slot
как написать функцию удаления дублирующих элементов.
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
struct Node {
char* value;
struct Node *prev;
struct Node *next;
};
struct Deque{
Node *start;
Node *end;
int size;
//конструктор
Deque(){
start=NULL;
end=NULL;
size=NULL;
}
//деструктор
~Deque(){
Node *it=start;
while(it!=end){
it=it->next;
delete it->prev;
}
delete it;
start=NULL;
end=NULL;
size=NULL;
}
//добавление элементов в конец дека
void PushBack(char* val) {
Node *TNode = new Node;
if(this->start==NULL){//если дек пуст
this->start=TNode;//указатели start и end дека указывают на созданный узел
this->end=TNode;
TNode->next=TNode;//указатели внутри узла указывают на сам узел
TNode->prev=TNode;
}
else
{
TNode->prev=this->end;//связываем последний узел с созданным узлом
this->end->next=TNode;
this->end=TNode;//теперь созданный узел является последним
TNode->next=this->start;//последний узел должен указывать на первый
}
TNode->value=val;//помещаем строку в узел
size++;
}
//добавление элементов в начало дека
void PushHead(char* val) {
Node *TNode = new Node;
if(this->start==NULL){//если дек пуст
this->start=TNode;//указатели start и end дека указывают на созданный узел
this->end=TNode;
TNode->next=TNode;//указатели внутри узла указывают на сам узел
TNode->prev=TNode;
}
else
{
TNode->next=this->start;//связываем первый узел с созданным узлом
this->start->prev=TNode;
this->start=TNode;//теперь созданный узел является первым
TNode->prev=this->end;//первый узел должен указывать на последны
}
TNode->value=val;//помещаем строку в узел
size++;
}
//извлечение элемента из конца дека
char* PopBack() {
char* result = this->end->value;//ложим строку в переменную
if(this->end==this->start){//если элемент последний
delete this->end->value;//удаляем его
delete this->end;
start=NULL;//обнуляем указатели дека
end=NULL;
}
else
{
this->end->prev->next=this->start;//предпоследний элемент связываем с первым
this->start->prev=this->end->prev;
delete this->end->value;//удаляем последний элемент
delete this->end;
this->end=this->start->prev;//теперь предпоследний элемент - последний
}
size--;
return result;
}
//извлечение элементов из начала дека
char* PopHead() {
char* result = this->end->value;//ложим строку в переменную
if(this->end==this->start){//если элемент последний
delete this->end->value;//удаляем его
delete this->end;
start=NULL;//обнуляем указатели дека
end=NULL;
}
else
{
this->start->next->prev=this->end;//второй элемент связываем с последним
this->end->next=this->start->next;
delete this->start->value;//удаляем первый элемент
delete this->start;
this->start=this->end->next;//теперь второй элемент - первый
}
size--;
return result;
}
//поиск
Node* Search(char* val){
Node* it=this->start;//итератор указывает на начало
while(it!=this->end){//пока он не будет указывать на конец
if(strcmp(it->value,val)==0){//если строка в узле и переданная строка равны
return it;//возвращаем указатель на текущий элемент
}
it=it->next;//перемещаем указатель на следующий элемент
}//в этом цикле мы не просмотрели конечный элемент, так что ниже он просматривается
if(strcmp(it->value,val)==0){
return it;
}
return NULL;//если совпадений не найдено - возвращаем нулевой указатель
}
//прямой итератор
void IteratorFromLeft(){
{ Node* it=this->start;//итератор указывает на начало
while(it!=this->end) //пока не дойдем до конеца
{ printf("%s \n", it->value); //вывод на экран дека
it=it->next; //проходим от начала до конца
}
}
//обратный итератор
void IteratorFromRight(){
Node* it=this->end;//итератор указывает на конец дека
while(it!=this->start)//пока не дойдем до начала
{
printf("%s \n",it->value); //вывод на экран дека
it=it->prev; //проходим с конца до начала
}
}
//удаление дублирующих элементов
void DelDubles(){
char* element[256];//сюда будем записывать элементы для сравнения
//вычисление количества элементов
int Size(){
return this->size;
//сохранение контейнера в файле
void PrintToFile(char* fname){
FILE *f=fopen(fname,"rt");
Node* it=this->start;
while(it!=this->end){
fprintf(f,"%s/n",it->value);
it=it->next;
}
fprintf(f,"%s\n",it->value);
}
Точно так же как делаете удаление из списка.
Как найти дубликаты?
Например:
Берете элемент сравниваете со оставшимися в списке(исключая сам элемент из проверки). Если есть совпадения, удаляете из списка.
При удаление восстанавливаем связи с предыдущим и следующим. И так гоняете цикл пока не исключите все повторения.
Для чего определяете количество эл-тов в списке? Даже функция не закрыта!
Код:
//вычисление количества элементов
int Size(){
return this->size;
int Size(){
return this->size;
Код:
#include<iostream>
#include<fstream>
struct DEK
{
char aWord[20];
DEK *next, *prev;
}*head, *tail;
void CreateDek(std::ifstream &File);
void GetDekFromHead();
void GetDekFromTail();
void CheckForDoubleWords();
void RemoveElementFromDek(DEK *Element);
int main()
{
std::ifstream File;
File.open("aWord.txt");
if(!File.is_open())
{
std::cout << "Can't open the file, bye bye!" << std::endl;
system("pause");
return -1;
}
CreateDek(File);
std::cout<<"StartUp Dek:\n";
GetDekFromHead();
GetDekFromTail();
CheckForDoubleWords();
std::cout<<"\n\nModification Dek:\n";
GetDekFromHead();
GetDekFromTail();
File.close();
std::cout << std::endl;
system("pause");
return 0;
}
void CreateDek(std::ifstream &File)
{
DEK *ptr, *tmp;
ptr = tmp = tail = head = NULL;
while(!File.eof())
{
if(ptr == NULL)
{
ptr = new DEK;
File >> ptr->aWord;
ptr->next = ptr->prev = NULL;
head = tail = tmp = ptr;
}
else
{
ptr = new DEK;
File >> ptr->aWord;
tmp->next = ptr;
ptr->prev = tmp;
ptr->next = NULL;
tail = tmp = ptr;
}
}
}
void GetDekFromHead()
{
std::cout<<"\nFrom Head:"<<std::endl;
DEK *ptr = head;
while(ptr!=NULL)
{
std::cout << ptr->aWord << " ";
ptr = ptr->next;
}
}
void GetDekFromTail()
{
std::cout<<"\nFrom Tail:"<<std::endl;
DEK *ptr = tail;
while(ptr!=NULL)
{
std::cout << ptr->aWord << " ";
ptr = ptr->prev;
}
}
void CheckForDoubleWords()
{
DEK *ptr = head;
while(ptr != NULL)
{
DEK *tmp = head;
while(tmp != NULL)
{
if(ptr != tmp)
{
if(strcmp(ptr->aWord,tmp->aWord) == 0)
{
DEK *ToDel = tmp;
tmp = tmp->next;
RemoveElementFromDek(ToDel);
}
else
{
tmp = tmp->next;
}
}
else
{
tmp = tmp->next;
}
}
ptr = ptr->next;
}
}
void RemoveElementFromDek(DEK *Element)
{
//если есть эл-ты в списке
if(Element != NULL)
{
//если в списке 1 элемент
if(Element->next == NULL && Element->prev == NULL)
{
delete Element;
head = tail = NULL;
}
//если в списке больше одного элемента
else
{
//если э-т не равен head и tail, то есть э-т в середине
if(Element != head && Element != tail)
{
DEK *ElNext = NULL, *ElPrev=NULL;
ElNext = Element->next;
ElPrev = Element->prev;
ElNext->prev = ElPrev;
ElPrev->next = ElNext;
delete Element;
}
//если э-т равен head и tail
else
{
//если э-т равен head
if(Element == head)
{
head = Element->next;
Element->next->prev = NULL;
delete Element;
}
//если э-т равен tail
if(Element == tail)
{
tail = Element->prev;
Element->prev->next = NULL;
delete Element;
}
}
}
}
}
#include<fstream>
struct DEK
{
char aWord[20];
DEK *next, *prev;
}*head, *tail;
void CreateDek(std::ifstream &File);
void GetDekFromHead();
void GetDekFromTail();
void CheckForDoubleWords();
void RemoveElementFromDek(DEK *Element);
int main()
{
std::ifstream File;
File.open("aWord.txt");
if(!File.is_open())
{
std::cout << "Can't open the file, bye bye!" << std::endl;
system("pause");
return -1;
}
CreateDek(File);
std::cout<<"StartUp Dek:\n";
GetDekFromHead();
GetDekFromTail();
CheckForDoubleWords();
std::cout<<"\n\nModification Dek:\n";
GetDekFromHead();
GetDekFromTail();
File.close();
std::cout << std::endl;
system("pause");
return 0;
}
void CreateDek(std::ifstream &File)
{
DEK *ptr, *tmp;
ptr = tmp = tail = head = NULL;
while(!File.eof())
{
if(ptr == NULL)
{
ptr = new DEK;
File >> ptr->aWord;
ptr->next = ptr->prev = NULL;
head = tail = tmp = ptr;
}
else
{
ptr = new DEK;
File >> ptr->aWord;
tmp->next = ptr;
ptr->prev = tmp;
ptr->next = NULL;
tail = tmp = ptr;
}
}
}
void GetDekFromHead()
{
std::cout<<"\nFrom Head:"<<std::endl;
DEK *ptr = head;
while(ptr!=NULL)
{
std::cout << ptr->aWord << " ";
ptr = ptr->next;
}
}
void GetDekFromTail()
{
std::cout<<"\nFrom Tail:"<<std::endl;
DEK *ptr = tail;
while(ptr!=NULL)
{
std::cout << ptr->aWord << " ";
ptr = ptr->prev;
}
}
void CheckForDoubleWords()
{
DEK *ptr = head;
while(ptr != NULL)
{
DEK *tmp = head;
while(tmp != NULL)
{
if(ptr != tmp)
{
if(strcmp(ptr->aWord,tmp->aWord) == 0)
{
DEK *ToDel = tmp;
tmp = tmp->next;
RemoveElementFromDek(ToDel);
}
else
{
tmp = tmp->next;
}
}
else
{
tmp = tmp->next;
}
}
ptr = ptr->next;
}
}
void RemoveElementFromDek(DEK *Element)
{
//если есть эл-ты в списке
if(Element != NULL)
{
//если в списке 1 элемент
if(Element->next == NULL && Element->prev == NULL)
{
delete Element;
head = tail = NULL;
}
//если в списке больше одного элемента
else
{
//если э-т не равен head и tail, то есть э-т в середине
if(Element != head && Element != tail)
{
DEK *ElNext = NULL, *ElPrev=NULL;
ElNext = Element->next;
ElPrev = Element->prev;
ElNext->prev = ElPrev;
ElPrev->next = ElNext;
delete Element;
}
//если э-т равен head и tail
else
{
//если э-т равен head
if(Element == head)
{
head = Element->next;
Element->next->prev = NULL;
delete Element;
}
//если э-т равен tail
if(Element == tail)
{
tail = Element->prev;
Element->prev->next = NULL;
delete Element;
}
}
}
}
}
Код:
Код:
StartUp Dek:
From Head:
Good Bad Marry Open Close Good Open Slot Door Slot
From Tail:
Slot Door Slot Open Good Close Open Marry Bad Good
Modification Dek:
From Head:
Good Bad Marry Open Close Slot Door
From Tail:
Door Slot Close Open Marry Bad Good
From Head:
Good Bad Marry Open Close Good Open Slot Door Slot
From Tail:
Slot Door Slot Open Good Close Open Marry Bad Good
Modification Dek:
From Head:
Good Bad Marry Open Close Slot Door
From Tail:
Door Slot Close Open Marry Bad Good
спасибо,большое.А вот количество элементов я определяю не для чего-то,а просто так в задании указано.Что нужно такую функцию написать.А вот то что функция не закрыта,видимо из-за невнимательности