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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка удаления элемента в односвязном списке 
:(
    Опции темы
sanyok52
Дата 16.11.2012, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем доброго времени суток. Задача состоит в том, чтобы удалить из списка указанный элемент. Первый элемент удаляется нормально, а когда нужно удалить элемент из середины списка выдаёт ошибку в функции LIST_ODN :: DeleteEl(int val) на строчке while(cur->next != NULL). Помогите пожалуйста понять в чём же дело
Исходники проги: http://rusfolder.com/33651321
PM MAIL   Вверх
volatile
Дата 17.11.2012, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



там надо рекламу смотреть...
сюда кидайте, понемногу
PM MAIL   Вверх
sanyok52
Дата 17.11.2012, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

#include "Cl_list_odn.h"
#include <stdio.h>
#include <conio.h>

int main()
{
    int k;
    LIST_ODN a;
    a.PrintSp();

    printf("\n\nVvedite udalyaemiy element "); scanf("%d",&k);
    a.DeleteEl(k);
    a.PrintSp();
    
    getch();
    return 0;
}



Код

#ifndef CL_LIST_ODN_H
#define CL_LIST_ODN_H
#include <stdio.h>

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

class LIST_ODN
{
    private:

        int *a, n;
        void AddFirst(int val);
    public:
        int IsEmpty(void);
        void AddAfterCur(int val);
        LIST_ODN();
        ~LIST_ODN();
        int IsEnd(void);
        void Move();
        void GoToFirst();
        int GetElem(void);
        void DeleteFirst(void);
        void GoToPrev(void);
        void DeleteCur(void);
        void PrintSp();
        void FindMin();
        void FindElem(int val);
        void DeleteEl(int val);
        void PrintCur();

};
#endif


Код

#include "Cl_list_odn.h"
#include <stdio.h>
#include <conio.h>

LIST *first = NULL;
LIST *cur = NULL;
int LIST_ODN :: IsEmpty(void) {return first==NULL;}

void LIST_ODN :: AddFirst(int val)
{
    LIST *tmp = new LIST;
    tmp->data = val;
    tmp->next = first;
    first = cur = tmp;
}
void LIST_ODN :: AddAfterCur(int val)
{
    if(IsEmpty()) {AddFirst(val); return;}
    LIST *tmp = new LIST;
    tmp->data = val;
    tmp->next = cur->next;
    cur->next = tmp;
    cur = tmp;
}
LIST_ODN :: LIST_ODN()
{
    int i;
    do{
        printf("Vvedite chislo elementov spiska "); scanf("%d",&n);
    }while(n<=0);
    a = new int [n];
    if(a == NULL) {printf("Pamyat pod a ne videlena"); return;}
    printf("Vvedite elementi spiska\n");
    for(i=0;i<n;i++) scanf("%d",&a[i]);
    for(i=0;i<n;i++) AddAfterCur(a[i]);
}
LIST_ODN :: ~LIST_ODN()
{
    if(a != NULL) {delete[] a; a = NULL;}
}
int LIST_ODN :: IsEnd(void) {return cur->next==NULL;}

void LIST_ODN :: Move()
{
    if(IsEnd()) {printf("\nDostignut konec spiska"); return;}
    cur = cur->next;
}
void LIST_ODN :: GoToFirst() {cur = first;}

int LIST_ODN :: GetElem(void) {return cur->data;}

void LIST_ODN :: DeleteFirst(void)
{
    LIST *tmp = first->next;
    delete first;
    first = tmp;
}
void LIST_ODN :: GoToPrev(void)
{
    if(IsEmpty()) {printf("\nSpisok pust"); return;}
    if(cur == first) return;
    LIST *tmp = first;
    while(tmp->next != cur->next)
    {
        tmp = tmp->next;
        cur = tmp;
    }
}
void LIST_ODN :: DeleteCur(void)
{
    if(IsEmpty()) {printf("\nSpisok pust"); return;}
    LIST *tmp;
    if(cur == first) {DeleteFirst(); return;}
    else
    {
        tmp = cur;
        GoToPrev();
        cur->next = tmp->next;
        delete tmp;
    }
}
void LIST_ODN :: PrintSp()
{
    if(IsEmpty()) {printf("\nSpisok pust"); return;}
    GoToFirst();
    printf("\n");
    printf("%d ",cur->data);
    while(cur->next != NULL)
    {
        cur = cur->next;
        printf("%d ",cur->data);
    }
}
void LIST_ODN :: FindMin()
{
    if(IsEmpty()) {printf("\nSpisok pust"); return;}
    int min;
    GoToFirst();
    min = cur->data;
    while(cur->next != NULL)
    {
        if(cur->data < min) min = cur->data;
        Move();
    }
    printf("\nmin=%d",min);
}
void LIST_ODN :: FindElem(int val)
{
    if(IsEmpty()) {printf("\nSpisok pust"); return;}
    int ind;
    ind=0;
    GoToFirst();
    while(cur->next != NULL)
    {
        if(cur->data == val) printf("\nElement %d naiden pod nomerom %d",val,ind);
        ind++;
        Move();
    }
    if(cur->data == val) printf("\nElement %d naiden pod nomerom %d",val,ind);
}
void LIST_ODN :: DeleteEl(int val)
{
    if(IsEmpty()) {printf("\nSpisok pust"); return;}
    GoToFirst();
    if(first->data == val) {DeleteFirst(); return;}
    while(cur->next != NULL)
    {
        if(cur->data == val) 
        {
            DeleteCur();
        }
        Move();
    }
    if(cur->next == NULL) printf("\nElement %d ne nayden",val);
}
void LIST_ODN :: PrintCur()
{
    printf("\ncur=%d",cur->data);
}

PM MAIL   Вверх
volatile
Дата 17.11.2012, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



sanyok52,  smile 
Цитата(sanyok52 @  17.11.2012,  12:07 Найти цитируемый пост)
void LIST_ODN :: AddFirst(int val)
{
    LIST *tmp = new LIST;
    tmp->data = val;
    tmp->next = first 0;
    first = cur = tmp;
}
}


Цитата(sanyok52 @  17.11.2012,  12:07 Найти цитируемый пост)
LIST *first = NULL;
LIST *cur = NULL;

Это еще что за? почему глобальные?

дальше смотреть не стал..


Это сообщение отредактировал(а) volatile - 17.11.2012, 19:26
PM MAIL   Вверх
volatile
Дата 17.11.2012, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(sanyok52 @  17.11.2012,  12:07 Найти цитируемый пост)
  while(cur->next != NULL)
    {
        if(cur->data == val) 
        {
            DeleteCur();
        }
        Move();
    }
    if(cur->next == NULL) printf("\nElement %d ne nayden",val);
}

последний принтф будет напечатан в любом случае.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1033 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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