Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Проекты > Проекты C++

Ответ
 
Опции темы
Старый 18.04.2008, 19:58   #1
Fla
ПроЭктировщик
 
Регистрация: 22.12.2007
Сообщений: 107
Написано 15 полезных сообщений
(для 15 пользователей)
Сообщение TList<>

Вот было нечего делать накропал вот такую штуку(когда нечего делать всегда пишу шаблонную гадость). Вдруг кому-нибудь пригодится как пример или как простой класс листа.
Если вы собираетесь хранить указатели на дату(только так осуществляется наследование), то вместо del() rem() и clear() нужно использовать delp() remp() и clearp() соответственно.
Отстутствие утечки памяти не гарантирую.

Собственно код:
TList.h
#pragma once
#include <stdio.h>
#include <assert.h>

template <class T>
struct TListData {
    T data;
    TListData *next, *prev;
};

template <class T>
class TList {
    TListData<T> *head;
    int fcount;
public:
    TList(void);
    ~TList(void);

    void add(T);
    void ins(T, int);
    void del(int);
    void rem(T);
    void clear();

    void delp(int);
    void remp(T);
    void clearp();

    int find(T);
    TListData<T> *getp(int);

    int count();
    T& operator[](int);
};

#include "TList.inl"
TList.inl ДАДА ИМЕННО INL!!!
#include "StdAfx.h"
#include "TList.h"

template <class T> 
TList<T>::TList(void) {
    this->head = NULL;
    this->fcount = 0;
}

template <class T> 
void TList<T>::add(T data) {
    if (!fcount) {
        this->head = new TListData<T>;
        this->head->data = data;
        this->head->next = this->head;
        this->head->prev = this->head;
    } else {
        TListData<T> *nData = new TListData<T>;
        nData->data = data;
        nData->next = this->head;
        nData->prev = this->head->prev;
        this->head->prev = nData;
        nData->prev->next = nData;
    }
    this->fcount++;
}

template <class T> 
void TList<T>::ins(T data, int pos) {
    if (!fcount) {
        this->head = new TListData<T>;
        this->head->data = data;
        this->head->next = this->head;
        this->head->prev = this->head;
    } else {
        TListData<T> *p = this->getp(pos);
        TListData<T> *nData = new TListData<T>;
        nData->data = data;
        nData->next = p;
        nData->prev = p->prev;
        p->prev = nData;
        nData->prev->next = nData;
    }
    this->fcount++;
}

template <class T> 
T& TList<T>::operator [](int id) {
    assert(id<0 || id>=this->fcount || "Incorrect id in TList::operator[]!");
    TListData<T> *p = this->head;
    for (int i = 1; i <= id; i++)
        p = p->next;
    return p->data;
}

template <class T> 
int TList<T>::find(T data) {
    TListData<T> *p = this->head;
    for (int i = 0; i < this->count(); i++) {
        if (p->data == data)
            return i;
        p = p->next;
    }
    return -1;
}

template <class T> 
TListData<T> *TList<T>::getp(int id) {
    assert(id<0 || id>=this->fcount || "Incorrect id in TList::find(int)!");
    TListData<T> *p = this->head;
    for (int i=0; i<id; i++)
        p = p->next;
    return p;
}

template <class T>
void TList<T>::del(int id) {
    assert(id<0 || id>=this->fcount || "Incorrect id in TList::del!");
    TListData<T> *p = this->getp(id);
    p->prev->next = p->next;
    p->next->prev = p->prev;
    if (p == this->head)
        if (this->fcount)
            this->head = p->next;
        else
            this->head = NULL;
    delete p;
    this->fcount--;
}

template <class T>
void TList<T>::rem(T t) {
    TListData<T> *p = this->getp(this->find(t));
    p->prev->next = p->next;
    p->next->prev = p->prev;
    if (p == this->head)
        if (this->fcount)
            this->head = p->next;
        else
            this->head = NULL;
    delete p;
    this->fcount--;
}

template <class T> 
void TList<T>::clear() {
    while(this->fcount)
        this->del(0);
}

template <class T>
void TList<T>::delp(int id) {
    assert(id<0 || id>=this->fcount || "Incorrect id in TList::del!");
    TListData<T> *p = this->getp(id);
    p->prev->next = p->next;
    p->next->prev = p->prev;
    if (p == this->head)
        if (this->fcount)
            this->head = p->next;
        else
            this->head = NULL;
    delete p->data;
    delete p;
    this->fcount--;
}

template <class T>
void TList<T>::remp(T t) {
    TListData<T> *p = this->getp(this->find(t));
    p->prev->next = p->next;
    p->next->prev = p->prev;
    if (p == this->head)
        if (this->fcount)
            this->head = p->next;
        else
            this->head = NULL;
    delete p->data;
    delete p;
    this->fcount--;
}

template <class T> 
void TList<T>::clearp() {
    while(this->fcount)
        this->delp(0);
}

template <class T> 
int TList<T>::count() {
    return this->fcount;
}

template <class T> 
TList<T>::~TList(void) {
    
}
(Offline)
 
Ответить с цитированием
Старый 23.04.2008, 17:31   #2
Fla
ПроЭктировщик
 
Регистрация: 22.12.2007
Сообщений: 107
Написано 15 полезных сообщений
(для 15 пользователей)
Ответ: TList<>

Неужто никому не пригодилось?
(Offline)
 
Ответить с цитированием
Старый 23.04.2008, 17:43   #3
dimanche13
Мастер
 
Регистрация: 19.03.2007
Сообщений: 1,039
Написано 153 полезных сообщений
(для 252 пользователей)
Ответ: TList<>

поздравляю! ты изобрел велосипед.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Horror (23.04.2008)
Старый 23.04.2008, 21:27   #4
Horror
Бывалый
 
Регистрация: 09.09.2006
Сообщений: 656
Написано 54 полезных сообщений
(для 110 пользователей)
Ответ: TList<>

Практически обычный линейный список (
в книжках все время его пишут
правда местами можно попонятней напсать)
(Offline)
 
Ответить с цитированием
Старый 24.04.2008, 01:34   #5
Fla
ПроЭктировщик
 
Регистрация: 22.12.2007
Сообщений: 107
Написано 15 полезных сообщений
(для 15 пользователей)
Ответ: TList<>

Во-первых, не изобрел, а сделал(что тут изобретать?)
Во-вторых, у меня этих велосипедов на весь stl=)
В-третьих, это не рабочий класс(нет, он работает, но практического применения я не вижу), а пример

Короче читайте то, что написано перед листингом.

*Что тут можно попонятней написать?
(Offline)
 
Ответить с цитированием
Старый 25.04.2008, 14:34   #6
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: TList<>

где ForEach<T>?
(Offline)
 
Ответить с цитированием
Старый 25.04.2008, 23:07   #7
Fla
ПроЭктировщик
 
Регистрация: 22.12.2007
Сообщений: 107
Написано 15 полезных сообщений
(для 15 пользователей)
Ответ: TList<>

Пишите запросы, сделаю до понедельника =)
(Offline)
 
Ответить с цитированием
Старый 25.04.2008, 23:42   #8
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: TList<>

кстати, еще неплохо быдло бы обзавестись
ForEachSafe<T>(...)
чтобы вызываемя ф-ия могда удалить текущий элемент.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какой объект в TList сейчас обрабатывается? Trilliput BlitzMax 7 04.12.2007 20:12
Help:::TList zheland 2D-программирование 1 28.10.2007 18:15


Часовой пояс GMT +4, время: 21:15.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com