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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> односвязный cспиок, помогите понять что тут не так 
:(
    Опции темы
Djaconda
Дата 28.2.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 2.9.2007
Где: Краматорск

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



Вот написал код по созданию односвязного списка но что то он неправильно работает. А что понять не могу. Толь при добавлении нового элемента удаляет все предыдушие только вывод неправильно происходит. да и с удалением тоже что то неладное. Подскажите в чем ощибка.

Код

#include <conio.h>
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>

const
    col1 = 1,
    col2 = 11,
    col3 = 11,
    col4 = 1,
    colblack = 15;

typedef char st[10];
st a[5] = {"Add", "Delete", "List", "Search", "Exit"};
int flag = 1, l, k;

struct Element
{
    int data;
    Element *next;
};

class List
{
    Element *pHead;
    Element *pPrev;
    int countElem;
public:
    List();
    ~List();

    void addToList(int data);
    void printList();
    void delAllList();
    void searchList(int index);
};

List::List()
{
    pHead = NULL;
    countElem = 0;
}

List::~List()
{
    delAllList();
}

void List::addToList(int data)
{
    Element *temp = new Element;
    if(pHead == NULL) {pHead = temp; cprintf("eeeeeeeeeee");}
    else pPrev->next = temp;
    temp->data = data;
    temp->next = NULL;
    pPrev = temp;
    countElem++;
}

void List::printList()
{
    cout <<endl <<"___Spisok___" <<endl;
    Element *pTemp = pHead;
    while(pTemp != NULL)
    {
    cout << pTemp->data<<endl;
    pTemp = pTemp->next;
    }
    cout << "Kolvo elementov " <<countElem << endl;
}

void List::searchList(int index)
{
    cout <<endl <<"___Search___"<<endl;
    Element *pTemp = pHead;
    int i = 0;
    while(pTemp != NULL)
    {
    i++;
    if (i==index) cout << "Znachenie iskomogo elementa " << pTemp->data <<endl;
    pTemp = pTemp->next;

    }
}


void List::delAllList()
{
    while(pHead != NULL)
    {
    Element *pTemp = pHead;
    pHead = pHead->next;
    delete pTemp;
    }
}

int ExitProts() {
    clrscr();
    window (27, 10, 52, 14);
    textbackground (4);
    exit('0');
    return 0;
}

int main () {
    window(1,1,80,25);
    clrscr();
    List MyList;
    while (1) {
        clrscr();
        flag=1; k=1;
        textbackground(8);
        window(1,1,80,1);
        clrscr();
        textcolor(14);
        gotoxy(2,1);
        cprintf("Menu");
        gotoxy(73,1);
        cprintf("ver 1.0");
        textbackground (11);
        textcolor(col2);
        window(2,23,79,23);
        cprintf("                                    rrrrrrrrrr                               ");
        window(1,2,80,2);
        textbackground(col1);
        textcolor(col2);
        clrscr();
        gotoxy(15,1);
        cprintf("%s",a[0]);
        gotoxy(25,1);
        cprintf("%s",a[1]);
        gotoxy(35,1);
        printf("%s",a[2]);
        gotoxy(45,1);
        printf("%s",a[3]);
        gotoxy(55,1);
        cprintf("%s",a[4]);
        textbackground(col3);
        textcolor(col4);
        gotoxy(5+10*(k),1);
        cprintf("%s",a[k-1]);
        while (flag == 1) {
               window(1,2,80,2);
               char button = getch();
               if (button==0)  button = getch();
               switch  (button) {
                case 75 : { l=k; k--; break; }
                case 77 : { l=k; k++; break; }
                case 13 : { flag = 0; break; }
               }
               if (k<1) k=5;
               if (k>5) k=1;
               if (k!=l)
               {
                textbackground(col1);
                textcolor(col2);
                gotoxy(5+10*(l),1);
                cprintf("%s",a[l-1]);
                textbackground(col3);
                textcolor(col4);
                gotoxy(5+10*(k),1);
                cprintf("%s",a[k-1]);
               }
        }

        switch (k) {
             case 1: {MyList.addToList(5); break;}
             case 2: {MyList.delAllList(); break;}
             case 3: {MyList.printList(); break;}
             case 4: {MyList.searchList(3); break;}
             case 5: {ExitProts(); break;}
        }
    }
    getch();
    return 0;
}




Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  MenuSpisok.cpp 3,28 Kb
PM MAIL ICQ   Вверх
pan2004
Дата 28.2.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



гдето в одной книжке видел рекомендацию не смешивать в одной программе сишные функции ввода/вывода с cin/cout классами. А так в куске связанным с самим связанным списком серьезных ошибок не вижу.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
vinick
Дата 28.2.2009, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я тоже в работе со списком криминала не увидел.
Только немного косметики:
1. в searchList нет необходимости продолжать цикл после того как элемент найден. Либо return, либо break.
2. В delAllList надо добавить обнуление countElem.


PM MAIL ICQ Jabber   Вверх
zim22
Дата 28.2.2009, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Код

int ExitProts() {
    clrscr();
    window (27, 10, 52, 14);
    textbackground (4);
    exit('0');
    return 0;
}

до return 0; код никогда в жизни не дойдёт.

если функция void List::searchList(int index) ищет не значение элемента, а есть ли элемент под номером index, то она работает правильно.
Код

if (i==index) 
        cout << "Znachenie iskomogo elementa " << pTemp->data <<endl;
 

Это сообщение отредактировал(а) zim22 - 28.2.2009, 16:08


--------------------
PM MAIL   Вверх
Djaconda
Дата 28.2.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 2.9.2007
Где: Краматорск

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



Цитата(zim22 @ 28.2.2009,  13:57)
Код

int ExitProts() {
    clrscr();
    window (27, 10, 52, 14);
    textbackground (4);
    exit('0');
    return 0;
}

до return 0; код никогда в жизни не дойдёт.


это понятно но от этого роли нет никакой.  Элемент index существует и как раз поиск единственное что работает нормально.
PM MAIL ICQ   Вверх
0xDX
Дата 1.3.2009, 08:37 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



За организацию списка 2.

 - Во первых не шаблонный.
 - Во вторых ужасный алгоритм.(для примера можешь посмотреть STL, немного проще в QT)
 - 
PM MAIL   Вверх
mes
Дата 1.3.2009, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(0xDX @  1.3.2009,  07:37 Найти цитируемый пост)
 - Во первых не шаблонный.

ну за это не стоило "оценку" снижать, и тем более помечать как "во-первых". smile 

Это сообщение отредактировал(а) mes - 1.3.2009, 10:42


--------------------
PM MAIL WWW   Вверх
pan2004
Дата 1.3.2009, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(0xDX @  1.3.2009,  08:37 Найти цитируемый пост)
Во первых не шаблонный.

А во первых он пишется под BC++ 3.1. Сомневаюсь, что тот компилятор особо поддерживал шаблоны, кроме того в нем нет STL. Как и Qt на нем тоже запустить не получится.


--------------------
Qt4/C++ fan
WinXP SP3: MSVC++2005 Qt4.5.1 Boost1.39
сыграем в дурака?
PM MAIL   Вверх
vinick
Дата 1.3.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Djaconda @  28.2.2009,  20:12 Найти цитируемый пост)
Элемент index существует и как раз поиск единственное что работает нормально. 

Ну ты тогда приведи пример что не рабоатет. Какие значения вводишь, что ожидаешь и что получается.
PM MAIL ICQ Jabber   Вверх
math64
Дата 1.3.2009, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(pan2004 @  1.3.2009,  11:29 Найти цитируемый пост)
Сомневаюсь, что тот компилятор особо поддерживал шаблоны, кроме того в нем нет STL. Как и Qt на нем тоже запустить не получится

Несмотря на это, можно посмотреть код STL или Qt и сделать как там. Вместо шаблонов можно использовать #define
PM   Вверх
baldina
Дата 2.3.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Djaconda, в принципе всё правильно с маленькими оговорками:
 - в delAllList() не сбрасывается значение countElem.
 - searchList() индексирует элементы начиная с 1 а не с 0
 - интерфейс пользователя у тебя ...ммм.... неочевидный ;) сделай попроще, а то сам поди запутался куда жать и чё должно происходить. вот пример простейшего интерфейса:

Код

int printMenu ()
{
  cout << "1  Add" << endl
       << "2  Search" << endl
       << "3  Clear" << endl
       << "4  Exit" << endl
       << endl
       << "Your choice: ";

  char c;
  cin >> c;
  return c;
}

int main () {

        List MyList;
        int c;
        while ((c = printMenu ()) != '4')
        {
          switch (c)
          {
            case '1':
                cout << "Value to add: ";
                cin >> c;
                MyList.addToList(c);
                break;
            case '2':
                cout << "Search index: ";
                cin >> c;
                MyList.searchList(c);
                break;
            case '3':
                MyList.delAllList();
                break;
          }
          MyList.printList ();
        }

        return 0;
}


2all: с шаблонами в BC3.1 достаточно хорошо, что бы класс Djaconda сделать параметризованным. Боле того, в BC3.1 имелся BIDS - библиотека шаблонных ADT
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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