Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2014, 20:43   #1
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию Удалить весь список в С++

Организовать линейный список цветов: хранить название цвета и его числовой код.
Упорядочивать по первой букве названия, если первые буквы совпадают, то по второй и т.д.
При добавлении нового цвета в список сохранять упорядоченность.

Пытаемся учится программировать сами,но пока без успехов.

Попросили добавить удаление всего списка.....Я помню что делаем цикл до конца линейного списка и удаляем с помощью delete,реализовал эту функцию но там ошибка при работе.

Это процедура delAl4(удаление всего списка) она удаляет или зависает и вылетает сообщение(прикреплено внизу)...Что я там мог пропустить,программа рабочая просто с удалением всего списка проблемы.

Код:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <string>
 
using namespace std;
 
struct LnSp
{
    string name;
    int x;
    LnSp *Next;
    LnSp *prev;
};
 
LnSp *PLast4,*PFirst4;
void dobavz4(string name, int x, LnSp **Last, LnSp **First)
{
    LnSp *p,*p1;
    p=new LnSp;
    p->name=name;
    p->x=x;
    p->Next=NULL;
    p->prev=NULL;
    if ((*Last==NULL)&&(*First==NULL))
    {
        *Last=p;
        *First=p;
    }
    else if (p->name > (*Last)->name)
        {
            p->Next=(*Last);
            (*Last)->prev=p;
            (*Last)=p;
        }
    else if (p->name < (*First)->name)
        {
            p->Next=p;
            p->prev=(*First);
            (*First)=p;
        }
    else
    {
        p1=(*Last);
        while (p1!=NULL)
        {
            if ((p1->name > p->name)&&(p1->Next->name < p->name))
            {
                p->Next=p1->Next;
                p->prev=p1;
                p1->Next->prev=p;
                p1->Next=p;
                break;
            }
            p1=p1->Next;
        }
    }
}
void dobz4()
{
    string name;
    int k=0;
    cout<<"добавьте цвета в список "<<endl;
        cout<<"имя: ";
        cin>>name;
        cout<<"код: ";
        cin>>k;
        dobavz4(name,k,&PLast4,&PFirst4);
    cout<<"добавлено! "<<endl;
}
 
void Printz4(LnSp *First)
{
    LnSp *p;
    p=First;
    if (p==NULL)
    {
        cout<<"список пуст! "<<endl;
    }
    else
        while (p!=NULL)
        {
            {
                cout<<p->name<<": ";
                cout<<p->x<<endl;
                p=p->prev;
            }
        }
}
void ALLz4()
{
    Printz4(PFirst4);
}
 
void dellz4(LnSp **First,LnSp **Last)
{
    LnSp *p,*p1;
    p=(*First);
    string str;
    cout<<"Введите название удаляемого цвета: "<<endl;
    cin>>str;
    cout<<endl;
    bool b=false;
    while (p!=NULL)
        {
            if (p->name==str)
            {
                b=true;
                if ((p==(*Last))&&(p==(*First)))
                {
                    delete(*First);
                    *First=NULL;
                    *Last=NULL;
                    cout<<"удалено! "<<endl;
                    break;
                }
                else if (p==(*First))
                {
                    (*First)=p->prev;
                    (*First)->Next=NULL;
                    delete (p);
                    cout<<"удалено! "<<endl;
                    break;
                }
                else if (p==(*Last))
                {
                    (*Last)=p->Next;
                    (*Last)->prev=NULL;
                    delete (p);
                    cout<<"удалено! "<<endl;
                    break;
                }
                else if ((p!=(*Last))&&(p!=(*First)))
                {
                    p->Next->prev=p->prev;
                    p->prev->Next=p->Next;
                    delete(p);
                    cout<<"удалено! "<<endl;
                    break;
                }
            
            }
            
            p=p->prev;
        }
    if (!b)
            {
                cout<<"неверно введен цвет! "<<endl;
            }
}
 
void delz4()
{
    dellz4(&PFirst4,&PLast4);
}
 
void delAll4(LnSp **First,LnSp **Last)
{
    LnSp *p,*p1;
    p=(*First);
    while (p!=NULL)
    {
       LnSp *next=p->Next;
       delete p;
       p=next;
    }
    
    cout<<"Удалено";
}
 
void delAl4()
{
    delAll4(&PFirst4,&PLast4);
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL,"Russian");
    typedef void(*pmen)();
    pmen mas[5];
    cout<<"Меню: "<<endl;
    cout<<"1.Добавление"<<endl;
    cout<<"2.Печать"<<endl;
    cout<<"3.Удаление"<<endl;
    cout<<"4.Удаление всего списка"<<endl;
    mas[0]=dobz4;
    mas[1]=ALLz4;
    mas[2]=delz4;
    mas[3]=delAl4;
    int m=0;
    while (m<5) 
    {
        cout<<endl<<endl<<"Выберите пункт меню:";
        cin>>m;
        if (m<5) {mas[m-1]();};
    }
    system("pause");
    return 0;
}
Изображения
Тип файла: jpg нннннн.jpg (119.6 Кб, 127 просмотров)
Otar4ik вне форума Ответить с цитированием
Старый 28.09.2014, 07:35   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,327
По умолчанию

Ошибки времени выполнения лучше всего искать в пошаговом режиме. Поставьте точку останова и в пошаговом режиме смотрите, что происходит. А потом напишите, на какой строке кода вылетает ошибка.
8Observer8 вне форума Ответить с цитированием
Старый 28.09.2014, 09:25   #3
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Всё оказалось просто)))

Надо было мне сразу после начатия цикла delete вызывать и всем присваивать NULL)))

Код:
void delAll4(LnSp **First,LnSp **Last)
{
	LnSp *p;
	p=(*First);
	while (p!=NULL)
	{
       delete(*First);
					delete(*Last);
					*First=NULL;
					*Last=NULL;
					cout<<"Удалено!"<<endl;
					break;
	}
}
Otar4ik вне форума Ответить с цитированием
Старый 28.09.2014, 19:48   #4
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Столкнулся с новой проблемой...Он удаляет только 1-ый и последний элемент,элементы посередине не удаляет....при работе выкидывает ошибку при удалении на таком месте

Код:
void dellz4(LnSp **First,LnSp **Last)
{
    LnSp *p,*p1;
    p=(*First);
    string str;
    cout<<"Введите название удаляемого цвета: "<<endl;
    cin>>str;
    cout<<endl;
    bool b=false;
    while (p!=NULL)
        {
            if (p->name==str)
            {
                b=true;
                if ((p==(*Last))&&(p==(*First)))
                {
                    delete(*First);
                    *First=NULL;
                    *Last=NULL;
                    cout<<"удалено! "<<endl;
                    break;
                }
                else if (p==(*First))
                {
                    (*First)=p->prev;
                    (*First)->Next=NULL;
                    delete (p);
                    cout<<"удалено! "<<endl;
                    break;
                }
                else if (p==(*Last))
                {
                    (*Last)=p->Next;
                    (*Last)->prev=NULL;
                    delete (p);
                    cout<<"удалено! "<<endl;
                    break;
                }
                else if ((p!=(*Last))&&(p!=(*First)))
                {
                    p->Next->prev=p->prev;--------Здесь останавливается программа
                    p->prev->Next=p->Next;
                    delete(p);
                    cout<<"удалено! "<<endl;
                    break;
                }
            
            }
Otar4ik вне форума Ответить с цитированием
Старый 28.09.2014, 21:46   #5
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Ввёл 7 элементов,удалял много,а когда осталось 3 элемента и он сразу опять ошибку выкинул,да что же это такое???((((

Последний раз редактировалось Otar4ik; 29.09.2014 в 10:33.
Otar4ik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Можно ли как-нибудь удалить, а затем вставить в нужное место в текстовике текст, не копируя весь документ. Jony217 PHP 3 17.01.2013 10:11
удалить список вагонов LeonidP Помощь студентам 0 09.04.2011 10:31
как удалить двухсвязный список Saken_ Общие вопросы Delphi 0 11.10.2010 11:02
Список структур. -> определенных удалить. (подскажите) DED_moroZ Общие вопросы C/C++ 6 03.06.2009 15:56