Написал программу для создания односвязного списка
Меню:
Добавление элемента(по номеру позиции добавляем в начало,между элементами,конец)
Вывод списка
Удаление элемента Есть проблема в добавлении между элементами(идея,что-бы если на позиции добавляемого элемента уже есть элемент, то что-бы позиции остальных элементов до следующей пустой позиции увеличивались на 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;
}
Чтобы позиции изменялись, надо дописать соответствующий код в конце функций, который будет пробегать до конца списка и изменять эти позиции.
Для добавления:
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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Кто-нибудь когда-то встречался с подобной реализацией скип списка? Рассматривал варианты реализации с помощью vector и setНо возникают затруднения...
Как можно, не используя итератор begin() и end(), двигаться в списке? Нужно просто nextСудя по описанию, то там нет просто next() итератора
Полностью рабочий код, в котором продемонстрировано создание двухмерного массива с помощью прокси классаТолько есть вопрос
Как правильно проинсталировать на другом компьютере программу с ОС Windows, написанную на Qt C++? Проект в Qt CreatorДелаю релиз