Односвязный список с++

257
15 декабря 2016, 16:14

Написал программу для создания односвязного списка

Меню:

Добавление элемента(по номеру позиции добавляем в начало,между элементами,конец)

Вывод списка

Удаление элемента Есть проблема в добавлении между элементами(идея,что-бы если на позиции добавляемого элемента уже есть элемент, то что-бы позиции остальных элементов до следующей пустой позиции увеличивались на 1),чего не происходит, при добавлении на существующую позицию элемент или пропадает или ставится после.

P.S. извиняюсь за оформление,первый раз обращаюсь,не очень понял как отделяется код от текста,вручную переводил в код.

#include "stdafx.h"
#include <iostream>
using namespace std;
struct data
{
int Pos;
int Val;
};
struct List
{
data data_of_el;
List *next;
};
int menu()
{
cout << "\n 1 : Add new element \n";
cout << " 2 : Show List \n";
cout << " 3 : Delete element \n";
cout << " 4 : Decide \n";
return 0;
}
int Add_to_beginning(int Pos, int Val, List **First)   //добавление в начало
{
List *el = new List;
el->data_of_el.Pos = Pos;
el->data_of_el.Val = Val;
el->next = *First;
*First = el;
return 0;
}
int Add_to_end(int Pos, int Val, List **First)   // добавление в конец
{
List *semisemi = *First;
List *el = new List;
el->data_of_el.Pos = Pos;
el->data_of_el.Val = Val;
while ((semisemi) && (Pos > semisemi->next->data_of_el.Pos))
{
    semisemi = semisemi->next;
}
semisemi->next = el;
return 0;
}
int Add_between(int Pos, int Val, List **First)     //добавление между элементами
{
List *semisemi = *First;
List *el = new List;
el->data_of_el.Pos = Pos;
el->data_of_el.Val = Val;
while ((semisemi) && (Pos > semisemi->data_of_el.Pos))
{
    semisemi = semisemi->next;
}
el = semisemi->next;
semisemi->next = el;
while ((Pos == semisemi->next->next->data_of_el.Pos) && (!semisemi->next->next->next))
{
    semisemi->next->next->data_of_el.Pos++;
    semisemi->next->next = semisemi->next->next->next;
}
return 0;
}
int Delete_el(int Pos, List **First)     //удалить элемент
{
if (!*First)
{
    return 0;
}
List *semi = *First;
while ((Pos > semi->data_of_el.Pos) && (!semi->next))
{
    semi = semi->next;
}
if (Pos = semi->data_of_el.Pos)
{
    if (semi == *First)         //начало
    {
        *First = semi->next;
        delete semi;
        return 0;
    }
    if (!semi->next)            //конец
    {
        semi = *First;
        while (!semi->next->next)
        {
            semi = semi->next;
        }
        delete(semi->next);
        semi->next = 0;
        return 0;
    }
    semi = *First;
    while (Pos > semi->next->data_of_el.Pos)
    {
        semi = semi->next;
    }
    semi->next = semi->next->next;
    List *semisemi = semi->next->next;
    delete (semi->next);
    semi->next = semisemi;
    return 0;
}
cout << "Element with this Position not exist\n";
return 0;
}
int ShowList(List **First)     // вывести список
{
List *show = *First;
if (!show)
{
    cout << " List is empty \n";
    return 0;
}
cout << " Position\t Value\n";
while (show)
{
    cout << show->data_of_el.Pos << "\t" << show->data_of_el.Val << "\n";
    show = show->next;
}
return 0;
}
int Add_elem(int Pos, int Val, List **First)
{
List *semi = *First;
cout << Pos;
if (!First)
{
    Add_to_beginning(Pos, Val, First);
    return 0;
}
if (Pos == 1)
{
    Add_to_beginning(Pos, Val, First);
    return 0;
}
while ((semi) && (Pos > semi->data_of_el.Pos))
{
    semi = semi->next;
}
if (!semi)
{
    Add_to_end(Pos, Val, First);
    return 0;
}
Add_between(Pos, Val, First);
return 0;
}
int main()
{
setlocale(LC_ALL, "Russian");
int ans;
int Pos, Val;
List* First = 0;
do
{
    menu();
    cout << " Enter you choice\n";
    cin.clear();
    _flushall();
    cin >> (ans);
    switch (ans)
    {
    case 1: cout << "Enter Position of new element\n";
                cin >> (Pos);
                if (Pos <= 0)
                {
                    cout << "Position can not be unpositive\n";
                    break;
                }
                cout << "Enter Value of new element\n";
                cin >> (Val);
                Add_elem(Pos, Val, &First);
        break;
    case 2:
        ShowList(&First);
        break;
    case 3:
        Delete_el(Pos, &First);
        break;
    }
}
while (ans != 0);
return 0;
}
Answer 1

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

Для добавления:

el = el->next;
while(el)
{
 el->data_of_el.Pos++;
 el = el->next;
}

Соответственно для удаления:

el = el->next;
while(el)
{
 el->data_of_el.Pos--;
 el = el->next;
}
READ ALSO
Создание Skip List, используя STL

Создание Skip List, используя STL

Кто-нибудь когда-то встречался с подобной реализацией скип списка? Рассматривал варианты реализации с помощью vector и setНо возникают затруднения...

238
Переход между элементами STL списка

Переход между элементами STL списка

Как можно, не используя итератор begin() и end(), двигаться в списке? Нужно просто nextСудя по описанию, то там нет просто next() итератора

189
Прокси класс

Прокси класс

Полностью рабочий код, в котором продемонстрировано создание двухмерного массива с помощью прокси классаТолько есть вопрос

219
Как развернуть приложение на Qt на другой Windows машине?

Как развернуть приложение на Qt на другой Windows машине?

Как правильно проинсталировать на другом компьютере программу с ОС Windows, написанную на Qt C++? Проект в Qt CreatorДелаю релиз

361