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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2017, 22:44   #1
amastudent
 
Регистрация: 17.09.2017
Сообщений: 6
По умолчанию Не добавляется следующий элемент в список

Надо по названию цвета упорядочить элементы списка и при добавлении сохранять упорядоченность.
В имеющейся программе добавляется только первый элемент. В чем проблем, подскажите, пожалуйста))

Код:
#include "stdafx.h"
#include <iostream>
#include <string>
#include <stdlib.h>
#include <locale.h>
using namespace std;
 
struct LnSp {
    string name;
    string x;
    LnSp *Next;
    LnSp *Prev;
};
 
LnSp *PHead;
void add(string name, string x, LnSp **Head);
void add_zn();
void print(LnSp *Head);
void printcall();
void delete_el(LnSp **Head);
void delete_elcall();
void delete_sp(LnSp **Head);
void delete_spcall();
int main()
{
    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] = add_zn;
    mas[1] = printcall;
    mas[2] = delete_elcall;
    mas[3] = delete_spcall;
    int m = 0;
    while (m < 5)
    {
        cout << endl << endl << "Выберите пункт меню:";
        cin >> m;
        if (m < 5) mas[m - 1]();
    }
    system("pause");
    return 0;
}
 
void add(string name, string x, LnSp **Head) {
    LnSp *p, *p1;
    p = new LnSp;
    p->name = name;  //имя
    p->x = x;        //код
    p->Next = NULL;
    p->Prev = NULL;
    if (*Head == NULL) // список пуст
    {
        *Head = p;
    }
    else if (p->name > (*Head)->name) //список не пуст
    {
        p->Next = p;
        p->Prev = (*Head);
        (*Head) = p;
    }
    else
    {
        p1 = (*Head);
        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 add_zn()
{
    string name;
    string k = " ";
    cout << "Добавьте цвета в список" << endl;
    cout << "Имя: ";
    cin >> name;
    cout << "Код: ";
    cin >> k;
    add(name, k, &PHead); //вызов функции добавления
    cout << "Добавлено." << endl;
}
 
void print(LnSp *Head)
{
    LnSp *p;
    p = Head;
    if (p == NULL) {
        cout << "Список пуст." << endl;
    }
    else
        while (p != NULL)
        {
            cout << p->name << ": "; //вывод имени
            cout << p->x << endl; //вывод кода
            p = p->Prev;
        }
}
 
void printcall()
{
    print(PHead);
}
 
void delete_el(LnSp **Head)
{
    LnSp *p;
    LnSp *p1;
    p = (*Head);
    string str;
    cout << "Введите название удаляемого цвета: " << endl;
    cin >> str;
    cout << endl;
    bool b = false;
    while (p != NULL)
    {
        if (p->name == str) {   //если цвет найден
            b = true;
            if (p == (*Head)) {   //если элемент один в списке
                delete (*Head);
                *Head = NULL;
                cout << "Удалено!" << endl;
                break;
            }
            else if (p == (*Head)) //если найденный элемент первый в писке
            {
                (*Head) = p->Prev;
                (*Head)->Next = NULL;
                delete (p);
                cout << "Удалено!" << endl;
                break;
            }
        }
        p = p->Prev;
    }
    if (!b) cout << "Неверно введен цвет!" << endl;
}
 
void delete_elcall()
{
    delete_el(&PHead);
}
void delete_sp(LnSp **Head)
{
    LnSp *p;
    p = (*Head);
    while (p != NULL)
    {
        delete (*Head);
        delete (*Head);
        *Head = NULL;
        cout << "Удалено!" << endl;
        break;
    }
}
 
void delete_spcall()
{
    delete_sp(&PHead);
}
amastudent вне форума Ответить с цитированием
Старый 17.10.2017, 23:17   #2
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Самый верный метод (но не самый быстрый) - сделать 2 базовых операции:
1. Добавление в список В КОНЕЦ.
2. Сортировка ЛЮБОГО списка.

Т.о. при вводе новых данных, вы добавляете в конец, сколько нужно, и сортируете, после окончания добавления.
Нужны и другие операции типа удаления, но они не влияют на задачу, т.е. не меняют сортированость.

Для сортировки нужно определить промежуточную операцию - обменять местами 2 элемента, с учетом, что 1 из элементов может отсутствовать (случаи с 1 и посл. эл. списка). Далее сортировка выполняется любым доступным способом.

В такой реализации вас совершенно не будет волновать как добавлены элементы в список, главное потом, отсортировать. + блоки (функции) логично закончены и самодостаточны, можно применять в других задачах.

ПыСы, у вас там С++ по видимому, а в С++ struct = class, с тем отличием, что по умолчанию члены public. Сделайте операции (добавить, удалить, сортировать) - членами класса. Учите ООП. Т.е. "список сам себя сортирует", а не как сейчас "программа сортирует список".

Последний раз редактировалось alexzk; 17.10.2017 в 23:28.
alexzk вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не добавляется элемент в конец односвязного списка AggReex Общие вопросы C/C++ 3 15.08.2016 23:15
Указатель на следующий элемент в двусвязном списке с++ Вероника99 Помощь студентам 1 07.05.2016 21:04
Бегущая строка из фотографий, каждый следующий элемент - новый Sn0wSky JavaScript, Ajax 1 27.10.2012 19:05
Не добавляется элемент в map -LeV- Общие вопросы C/C++ 3 22.02.2011 19:36
Не добавляется элемент в очередь Дырдин Общие вопросы C/C++ 2 22.04.2010 07:31