Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6305
Последний выпуск: 19.06.2015

как написать функцию удаления дублирующих элементов.

85K
27 октября 2012 года
dosha1302
3 / / 27.10.2012
Помогите с лабой!!!Создан контейнер типа дек.Для него необходимо написать функции,одна из которых удаление дублирующих элементов.вот код лабы, с комментариями. Как написать функцию удаления дублирующих элементов.Язык с++.Причем,средства C++ (объекты, классы, шаблоны классов) использовать не следует. Готовые контейнерные классы из библиотеки STL также нельзя использовать.
#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);
}
459
27 октября 2012 года
cronya
420 / / 03.01.2009
Код нечитабельный, оформляем в соответствующие теги({...} указываем тип языка вставляем код), иначе глаза в куче и ничего не понять.
Цитата:
Как написать функцию удаления дублирующих элементов


Точно так же как делаете удаление из списка.
Как найти дубликаты?
Например:
Берете элемент сравниваете со оставшимися в списке(исключая сам элемент из проверки). Если есть совпадения, удаляете из списка.
При удаление восстанавливаем связи с предыдущим и следующим. И так гоняете цикл пока не исключите все повторения.

459
28 октября 2012 года
cronya
420 / / 03.01.2009
Короче чего-то я поглядел, у вас бред написан какой-то, вот например:
Для чего определяете количество эл-тов в списке? Даже функция не закрыта!

 
Код:
//вычисление количества элементов
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;
                }
            }
        }
    }
}
в файле

 
Код:
Good
Bad
Marry
Open
Close
Good
Open
Slot
Door
Slot
Результат работы программы:

Код:
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
85K
29 октября 2012 года
dosha1302
3 / / 27.10.2012
спасибо,большое.А вот количество элементов я определяю не для чего-то,а просто так в задании указано.Что нужно такую функцию написать.А вот то что функция не закрыта,видимо из-за невнимательности

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог