Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> список, проблема... 
:(
    Опции темы
kleks
Дата 24.10.2005, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.10.2005

Репутация: нет
Всего: нет



Отыскал в интернете несколько шаблонов для работы со списками (создание, добавление, удаление т.д.), слегка переделал под конкретную задачку, и вот что у меня из этого получилось:
Код

#include "stdafx.h"
#include "iostream.h"

// Класс данных.
class CData
{
public:
    char *a;
    char *b;
    // Указатель на след. элемент.
    CData * m_pNext;
    
    // Конструктор.
    CData(char *a1, char *b1)
    {
        a = a1;
        b = b1;
        m_pNext = NULL;
    }
};
//Класс списка.
class CList
{
public:
    // Указатель на первый элемент.
    CData * m_pFirst;
    CList();
    // Добавление данных.
    void Add(CData * pNext);
    // Поиск последнего элемента списка.
    CData * GetLast();
   // Просмотр списка.
    void ShowAll();
};
// Реализация методов класса.
CList::CList()
{
    m_pFirst = NULL;
}

void CList::Add(CData * pNext)
{
    if(m_pFirst!=NULL)
    {
        GetLast()->m_pNext = pNext;
    }
    else
    {
        m_pFirst = pNext;
    }
}

CData * CList::GetLast()
{
    // Указатель на очередные данные в списке
    CData * pCurr = m_pFirst;
    // Если список пуст,то возвр.ì NULL.
    if(pCurr == NULL)
    {
        return NULL;
    }
    // Пока есть след. элемент.
    while(pCurr->m_pNext!=NULL)
    {
        pCurr = pCurr->m_pNext;
    }
    return pCurr;
}
void CList::ShowAll()
{
    // Указатель на очередные данные в списке.
    CData * pCurr = m_pFirst;
    // Если список пуст, то пишемì.
    if(pCurr == NULL)
    {
        cout<<"List is empty.\n";
    }
    // Пока есть след. элемент списка.
    do{
        // Выводим очередной элемент.
        cout<<"a="<<pCurr->a<<", b="<<pCurr->b<<"\n";
        // Переводим pCurr на след. элемент в списке если он равен NULL,
       // то заканчиваемì.
    }while((pCurr = pCurr->m_pNext)!=NULL);
}

void main(){
    CList list;
    CData *pData;
    char a[10]; 
    char b[10];
    for(int i = 0; i<3; i++)
    {
        cout<<"Enter a:";
        cin>>a;
        cout<<"\n";
        cout<<"Enter b:";
        cin>>b;
        cout<<"\n";
        pData = new CData(a, b);
        list.Add(pData);
        list.ShowAll();
    }
}  


Так вот в чём вопрос: я никак не могу понять, почему элементами списка являются только те значения которые я ввёл последними, т.е если я например введу:
a=we b=rew
a=ggd b=gt
a=3f b=ret

то когда выведится список, получится:
a=3f b=ret
a=3f b=ret
a=3f b=ret
Заранее благодарен...

Это сообщение отредактировал(а) kleks - 24.10.2005, 23:02
PM MAIL   Вверх
OKaDO
Дата 24.10.2005, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 28.6.2005

Репутация: нет
Всего: нет



Извини конечно. Но зачем искать в инете шаблоны списка, если тебе все дано.
Библиотеки list.h и algorithm.h помогут решить все твои проблемы.

PM MAIL   Вверх
nikitao
Дата 25.10.2005, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



kleks
Цитата
Извини конечно. Но зачем искать в инете шаблоны списка, если тебе все дано.
Библиотеки list.h и algorithm.h помогут решить все твои проблемы.

Согласен. Другое дело что ты можешь не знать STL,но тогда весь смысл собственного написания списков в том что бы понять что это такое и набраться опыта,но дело твое.Теперь по коду:
1.В функции ShowAll() допущена ошибка. Несмотря на то что если список пуст прога выводит сообщение об этом, после этого она пытается вывести элементы а и b хотя их нет smile
2.В программе совершенно отсутствуют деструкторы ,а при этом динамическисоздаваемые объекты присутствуют>происходит утечка памяти(хотя я могу быть не прав т к внимательно код не смотрел.)
3.Собственно почему выводит одни и те жи строки 3(2) раза. Ответ прост:
В классе CData определены два указателя на строки,а в конструкторе эти указатеди приравниваются указателям на передаваемые строки. Фактически ты в каждом новом обьекте CData вместо того чтобы создать 2 новые строки приравниваешь указатели на эти строки указателям на строки a и b из main() вместо того чтобы создать новый=> После того как ты изменяешь строки a и b ты фактически не трогая все обьекты класса CData изменяешь их "показания".Лечения,надеюсь понятно. smile

ЗЫ Пишу безграмотно, сам знаю.(проверил в ворде)



--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
kleks
Дата 26.10.2005, 23:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.10.2005

Репутация: нет
Всего: нет



Цитата(nikitao @ 25.10.2005, 00:05)
3.Собственно почему выводит одни и те жи строки 3(2) раза. Ответ прост:
В классе CData определены два указателя на строки,а в конструкторе эти указатеди приравниваются указателям на передаваемые строки. Фактически ты в каждом новом обьекте CData вместо того чтобы создать 2 новые строки приравниваешь указатели на эти строки указателям на строки a и b из main() вместо того чтобы создать новый=> После того как ты изменяешь строки a и b ты фактически не трогая все обьекты класса CData изменяешь их "показания".Лечения,надеюсь понятно. smile

Что-то я пытался это исправить, но как-то всё не получаетя...туговато у меня со списками (да и с С++ в целом тоже, пока)...Вы бы могли написать непосредственно сам код, исправляющий эту ошибку для данного списка...
PM MAIL   Вверх
kleks
Дата 27.10.2005, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 6.10.2005

Репутация: нет
Всего: нет



Помогите пожалуйста, ну очень хочется разобраться!! smile smile
PM MAIL   Вверх
nikitao
Дата 27.10.2005, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



Ну смотри надо просто изменить конструктр класса CData
Код

CData(char *a1, char *b1)
    {
        a =new char[strlen(a1)];
        b =new char[strlen(b1)];
        strcpy(a,a1);
        strcpy(b,b1);
        m_pNext = NULL;
    }

Еще надо в класс CData прописать деструктор
Код

~CData()
{
   delete [] a;
   delete [] b;
}

Вот должно помочь.А вообще когда STL изучишь и со списками и со строками гемора не будет. smile

Это сообщение отредактировал(а) nikitao - 27.10.2005, 13:17


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
Neitron
Дата 27.10.2005, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 580
Регистрация: 3.10.2005
Где: Москва

Репутация: 2
Всего: 5



kleks
Как сказал бы дядя Бьерн. Юзайте STL.


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
nikitao
Дата 27.10.2005, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



Neitron ,вот в этом и состоит порочный круг.В STL все есть но пока собственные списки не напишишь и STL не поймешь(ИМХО). smile


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0778 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.