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

Поиск:

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


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



Прошу помощи! У меня есть двусвязный список, мне нужно организовать ввод данных, вывод их, удаление отдельных звеньев, сортировку методом выбора по году издания. Вот у меня программа, в ней работает все, кроме удаления. Компилится все без проблем, ввожу результаты тоже без проблем, вывожу их же.. а вот при удалении звена выскакивают ошибки.. Работаю в Microsoft Visual Studio 2008.
Помогите найти ошибки, а также подкиньте, пожалуйста, идею как отсортировать список..
Код

#include <iostream>
using namespace std;

struct Book
{
    char name[20], author[15];
    int pages, year;
    char place[20];
};

struct elem
{
    Book data;
    elem*pnext;
    elem*prev;
};

elem* pfirst = NULL;
elem* plist = NULL;

void show ()
{
    elem*tmp=pfirst;
    cout<<"Struct:"<<endl;
    while (tmp)
    {
        std::cout<<tmp->data.name<<"  "<<tmp->data.author<<"  "<<tmp->data.pages<<"  "<<tmp->data.year<<"  "<<
            tmp->data.place<<endl;
        tmp=tmp->pnext;
    }
}

void addend ()
{
    elem*tmp=new elem;
    std::cout<<"Input name book"<<endl;
    std::cin>>tmp->data.name;
    std::cout<<"Input author name"<<endl;
    std::cin>>tmp->data.author;
    std::cout<<"Input number of pages"<<endl;
    std::cin>>tmp->data.pages;
    std::cout<<"Input year"<<endl;
    std::cin>>tmp->data.year;
    std::cout<<"Input place of publish"<<endl;
    std::cin>>tmp->data.place;
    if (!plist)
    {
        tmp->pnext=NULL;
        plist=tmp;
        pfirst=plist;
    }
    else
    {
        plist->pnext=tmp;
        tmp->pnext=NULL;
        plist=tmp;
    }
    plist=tmp;
}

elem*find (char* d)
{
    elem *prev = pfirst;
    while (prev)
    {
        if(strcmp(prev->data.name, d)==0) break;
        prev = prev->pnext;
    }
return prev;
}

elem*pkey=NULL;
elem*pend=NULL;

bool remove(char* key)
{
    if(elem*pkey = find(key))
    {
        if (pkey == pfirst)
        { // Удаление из начала списка
            pfirst = pfirst->pnext;
            pfirst->prev = 0;
        }
        else if (pkey == pend)
        { // Удаление из конца списка
            pend = pend->prev;
            pend->pnext = 0;
        }
        else 
        { // Удаление из середины списка
            (pkey->prev)->pnext = pkey->pnext;
            (pkey->pnext)->prev = pkey->prev;
        }
        delete pkey;
        return true;
    }
return false;
}

int main ()
{
    int n;
    std::cout<<"Vvedite kol-vo knig"<<endl;
    std::cin>>n;
    for (int i=0; i<n; i++)
        addend();

    show();
    int m;
    std::cout<<"Ydalit zveno? 1 - Da, 0 - Net."<<endl;
    std::cin>>m;
    if (m==1)
    {
        char* k;
        std::cout<<"Vvedite imya knigi, kotoryy xotite ydalit"<<endl;
        std::cin>>k;
        std::cout<<remove (k);
    }
system ("Pause");
return 0;
}


Добавлено через 59 секунд
хм.. по ходу мне нужно было в центр помощи писать,  там бы быстрее ответили. Модеры, если захотите, переместите тему


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
mes
Дата 11.2.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Metalex @  11.2.2010,  18:04 Найти цитируемый пост)
по ходу мне нужно было в центр помощи писать,  там бы быстрее ответили

ну а если б воспользовались поиском, то вероятность получения быстрого ответа была бы выше, так как тема неоднократно разбиралась smile



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Если вы не идёте в центр помощи, то центр помощи идёт к вам! smile
Посмотрите на 114 строку. Вы объявляете указатель на строку и всё. А память кто будет выделять? В общем замените char *k на char k[20] и всё у вас заработает. smile


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Metalex
Дата 12.2.2010, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 635
Регистрация: 22.10.2008
Где: Украина-ZPсity

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



t_gran, действительно smile Благодарю за помощь! Теперь осталась сортировка..


--------------------
Don't let the system get you down.
PM WWW ICQ Skype   Вверх
bilbobagginz
Дата 12.2.2010, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



единый стиль:
Metalex, если ты указал 
Код

using namespace std;

то все вызовы из этого именного пространства можно использовать без указания именного пространства, т.е. вместо 
Код

    std::cout << "Vvedite kol-vo knig" << endl; 
// кстати endl - тоже надо было писать как std::endl  :)
    std::cin >> n;

так:
Код

    cout << "Vvedite kol-vo knig" << endl;
    cin >> n;


(все со сноской - если нет идентичных вызовов в твоем именном пространстве, т.е. если ты уже сам не реализовал cout, cin, endl, etc.)



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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