Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ошибка(недопонимание) при работе со списком  (Прочитано 7007 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
anshelika
Новенький

by
Offline Offline

« : 14-04-2014 13:16 » 

Здравствуйте... пытаюсь разобраться и написать программу, связанную с работой со списком. Была сделана попытка оформить каждое действие(добавление, удаление, печать и ввод, вот только редактирование элемента списка ума не приложу как сделать) в виде структуры... да столкнулась с проблемами... помогите пожалуйста исправить. И не судите код строго... я все-таки только учусь Жаль


Код: (C++)
#include<iostream>
#include<conio.h>
#include<fstream>
 
using namespace std;
 
struct mebel
{
    int n_nakl;
    char izgotovitel[15];
    char tovar[10];
    int kolvo;
    mebel *next;//
    mebel *prev; //
};
 
//--ВВОД--//
void vvod(mebel *ukazatel_na_tek, int n)
{
    //заполнение 1-го элемента//
    cout<<"Введите номер накладной\t"; cin>>ukazatel_na_tek->n_nakl;
    cout<<"Введите поставщика\t"; cin>>ukazatel_na_tek->izgotovitel;
    cout<<"Введите наименование мебели\t"; cin>>ukazatel_na_tek->tovar;
    cout<<"Введите количество мебели\t"; cin>>ukazatel_na_tek->kolvo;
    //конец заполнения 1-го элемента//
 
   
    for(int i=1; i<n; i++)
    {
        ukazatel_na_tek->next=new mebel;
        ukazatel_na_tek=ukazatel_na_tek->next;
        //заполнение оставшихся элементов//
        cout<<"Введите номер накладной\t"; cin>>ukazatel_na_tek->n_nakl;
        cout<<"Введите поставщика\t"; cin>>ukazatel_na_tek->izgotovitel;
        cout<<"Введите наименование мебели\t"; cin>>ukazatel_na_tek->tovar;
        cout<<"Введите количество мебели\t"; cin>>ukazatel_na_tek->kolvo;
        //конец заполнения//
    }
    ukazatel_na_tek->next=0;/
}
 
//--ВЫВОД--//
void print(mebel *ukazatel_na_tek)
{
    if(!ukazatel_na_tek)
    cout<<"\n В списке отсутствуют элементы";
    else
        while(ukazatel_na_tek)
        {
            cout<<"Данные о поставщике: "<<ukazatel_na_tek->n_nakl<<"\t"<<ukazatel_na_tek->izgotovitel<<"\t"<<ukazatel_na_tek->tovar<<"\t"<<ukazatel_na_tek->kolvo<<endl;
            ukazatel_na_tek=ukazatel_na_tek->next;
        }
}
 
//--СОРТИРОВКА ПУЗЫРЬКОМ--//
void sort(mebel *ukazatel_na_tek, mebel *first, int n)
{
    for(int i=0; i<n; i++)
    {
        ukazatel_na_tek=first;
        for(int j=0; j<n-i-1; j++)
        {
            if(strcmp(ukazatel_na_tek->izgotovitel, ukazatel_na_tek->next->izgotovitel)==1)
            {
                //-меняем местами содержимое элементов-//
                mebel tmp=*ukazatel_na_tek;
                ukazatel_na_tek->n_nakl=ukazatel_na_tek->next->n_nakl;
                strcpy_s(ukazatel_na_tek->izgotovitel, ukazatel_na_tek->next->izgotovitel);
                strcpy_s(ukazatel_na_tek->tovar, ukazatel_na_tek->next->tovar);
                ukazatel_na_tek->kolvo=ukazatel_na_tek->next->kolvo;
 
                ukazatel_na_tek=ukazatel_na_tek->next;
 
                ukazatel_na_tek->n_nakl=tmp.n_nakl;
                ukazatel_na_tek->kolvo=tmp.kolvo;
                strcpy_s(ukazatel_na_tek->izgotovitel, tmp.izgotovitel);
                strcpy_s(ukazatel_na_tek->tovar, tmp.tovar);
                //-end-//
            }
            else ukazatel_na_tek=ukazatel_na_tek->next;
        }
    }
}
 
//--УДАЛЕНИЕ--//
void delet(mebel  *first)
{
    int max_kol;
    mebel *ukazatel_na_tek, *del;
    //-поиск максимально количества товара-//
    max_kol=first->kolvo;/
    ukazatel_na_tek=first->next;
    while(ukazatel_na_tek)
    {
        if(max_kol==ukazatel_na_tek->kolvo)
            max_kol=ukazatel_na_tek->kolvo;
            ukazatel_na_tek=ukazatel_na_tek->next;
    }
    cout<<"\nМаксимальное количество мебели="<<max_kol;
    //-endl-//
    ukazatel_na_tek=first;
    while(ukazatel_na_tek)
    {
        if(max_kol==ukazatel_na_tek->kolvo)
        {
            del=ukazatel_na_tek;
            ukazatel_na_tek=ukazatel_na_tek->next;
 
            //-перенаправление указателей в соседних элементах-//
            if(del->next && del->prev)
            {
                ukazatel_na_tek->prev=del->prev;
                del->prev->next=ukazatel_na_tek;
            }
            else if(del->next && !del->prev)
            {
                ukazatel_na_tek->prev=0;
                first=ukazatel_na_tek;
            }
            else if(!del->next && del->prev)
                del->prev->next=0;
            else first=0;
            //-endl-//
 
            delete del;
        }
        else ukazatel_na_tek=ukazatel_na_tek->next;
    }
}
 
 
//--ДОБАВЛЕНИЕ НОВЫХ ЗАПИСЕЙ--//
void novaya(mebel *first, mebel *ukazatel_na_tek, int n)
{
    int n2, i;
    mebel *tmp2;
    bool f;
    cout<<"\n Введите желаемое количество новых записей:\t";
    cin>>n2;
    i=0;
    if(!first && i<n2)//если список пуст
    {
        i++;
        ukazatel_na_tek=new mebel;  
        first=ukazatel_na_tek;
        ukazatel_na_tek=ukazatel_na_tek->next=0;
        cout<<"\nВведите номер накладной, поставщика, товар и его количество:\n";
        cin>>ukazatel_na_tek->n_nakl>>ukazatel_na_tek->izgotovitel>>ukazatel_na_tek->tovar>>ukazatel_na_tek->kolvo;
    }
    if(!first->next && i<n2)
    {
        i++;
        tmp2=new mebel;
        cout<<"\nВведите номер накладной, поставщика, товар и его количество:\n";
        cin>>tmp2->n_nakl>>tmp2->izgotovitel>>tmp2->tovar>>tmp2->kolvo;
        if(strcmp(first->izgotovitel, tmp2->izgotovitel)==1)
        {
            first->prev=tmp2;
            tmp2->prev=0;
            tmp2->next=first;
            first=tmp2;
        }
        else
        {
            first->next=tmp2;
            tmp2->prev=first;
            tmp2->next=0;
        }
    }
    for(;i<n;i++);
    {
        f=1;/
        tmp2=new mebel;
        cout<<"\nВведите номер накладной, поставщика, товар и его количество:\n";
        cin>>ukazatel_na_tek->n_nakl>>ukazatel_na_tek->izgotovitel>>ukazatel_na_tek->tovar>>ukazatel_na_tek->kolvo;
        if(strcmp(first->izgotovitel, tmp2->izgotovitel)==1)
        {
            first->prev=tmp2;
            tmp2->prev=0;
            tmp2->next=first;
            first=tmp2;
            f=0;
        }
        else
        {
            ukazatel_na_tek=first;
            while(ukazatel_na_tek->next)
            {
                if(strcmp(ukazatel_na_tek->izgotovitel, tmp2->izgotovitel)==1)
                {
                    tmp2->next=ukazatel_na_tek;
                    tmp2->prev=ukazatel_na_tek->prev;
                    ukazatel_na_tek->prev=tmp2;
                    f=0;
                    break;
                }
                else ukazatel_na_tek=ukazatel_na_tek->next;
            }
            if(f)
            {
                tmp2->next=0;
                ukazatel_na_tek->next=tmp2;
                tmp2->prev=ukazatel_na_tek;
            }
        }
    }
}
 
 
void main()
{
    int n;
    setlocale(LC_ALL, "Rus");
    mebel *ukazatel_na_tek, *first;
    ukazatel_na_tek=new mebel;
    first=ukazatel_na_tek;
 
    cout<<"Введите количество поставщиков мебели: "; cin>>n;
 
    vvod(first, n);
    cout<<endl<<endl;
    cout<<"ТЕКУЩИЙ СПИСОК"<<endl;
    print(first);
    cout<<endl<<endl;
 
    sort(first, first, n);
    cout<<"ОТСОРТИРОВАННЫЙ СПИСОК"<<endl;
    print(first);
    cout<<endl<<endl;
   
    novaya(first, first, n);
    cout<<"СПИСОК ПОСЛЕ ДОБАВЛЕНИЯ\n";
    print(first);
    cout<<endl<<endl;
   
    delet(first);
    cout<<"СПИСОК ПОСЛЕ УДАЛЕНИЯ\n";
    print(first);
    cout<<endl;
    _getch();
}
« Последнее редактирование: 14-04-2014 13:35 от Джон » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 14-04-2014 13:31 » 

У тебя задание подрузомевает какую либо интерактивность?
Задание я так понял учебное. Двухсвязанные списки это обязательное условие?

PS Кстати, не знаю точно как в Windows. Но setlocale(LC_ALL, "Rus"); Тут требуется указывать конкретную кодировку.
« Последнее редактирование: 14-04-2014 13:34 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #2 : 14-04-2014 13:46 » 

У тебя задание подрузомевает какую либо интерактивность?
Задание я так понял учебное. Двухсвязанные списки это обязательное условие?

PS Кстати, не знаю точно как в Windows. Но setlocale(LC_ALL, "Rus"); Тут требуется указывать конкретную кодировку.
Не требуется.LC_ALL означает что все кодировки русские.Пока программа не использует несколько кодировок одновременно и так сойдет.

Добавлено через 20 минут и 40 секунд:
вот только редактирование элемента списка ума не приложу как сделать)
А в чем проблема редактирование по сути тоже самое что и добавление элемента.Тебе всего лишь нужно создать еще один элемент
типа struct mebel и "переподключить соседние элементы".
« Последнее редактирование: 14-04-2014 14:07 от LemmonRus » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-04-2014 16:19 » 

Цитата: LemonRus
Тебе всего лишь нужно создать еще один элемент
типа struct mebel и "переподключить соседние элементы".
?

Редактирование записи - это:
1) Пройти по списку до нужной (наверно, их стоит пронумеровать и предложить пользователю указать номер записи)
2) Затем в нужной записи поменять значения полей (то же самое, что делает ввод).

Или же комбинацию:
1) Удалить старую.
2) Добавить новую.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 15-04-2014 04:16 » 

У тебя задание подрузомевает какую либо интерактивность?
Задание я так понял учебное. Двухсвязанные списки это обязательное условие?

PS Кстати, не знаю точно как в Windows. Но setlocale(LC_ALL, "Rus"); Тут требуется указывать конкретную кодировку.
Не требуется.LC_ALL означает что все кодировки русские.Пока программа не использует несколько кодировок одновременно и так сойдет.


Я не могу сейчас проверить в Windows. Текст как правило набирается в кодировке Win-1251 (или как альтернатива в Unicode). Консоль по умолчанию работает с CP866.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #5 : 16-04-2014 11:01 » new

Цитата: LemonRus
Тебе всего лишь нужно создать еще один элемент
типа struct mebel и "переподключить соседние элементы".
?

Редактирование записи - это:
1) Пройти по списку до нужной (наверно, их стоит пронумеровать и предложить пользователю указать номер записи)
2) Затем в нужной записи поменять значения полей (то же самое, что делает ввод).

Или же комбинацию:
1) Удалить старую.
2) Добавить новую.
Я бы сначала ввел новую,а потом удалил старую.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines