Добавление и удаление элемента в двунаправленном списке
Немогу вставить елемент после каждого отрецательного елемента в двунаправленом списке
class Program
{
//структура даних для організації роботи з двозв'язним списком
public unsafe struct Double_List
{
public int Data; //інформаційне поле
public Double_List* Next; //адресне поле для зв'язку с наступним елементом
public Double_List* Prev; //адресне поле для зв'язку с попереднімелементом
}
static unsafe void Main(string[] args)
{
//покажчик на перший елемент списку
Double_List* Head = null;
//покажчик на останній элемент списку (за необхідностю)
Double_List* Last = null;
//Введення першого елемента списку
Console.WriteLine("Признак кінця послідовності - 0.\n ВВедіть елемент: ");
int n = int.Parse(Console.ReadLine());
int count = 0; //Лічильник елементів списку
while (n != 0) //Поки не введено признака кінця послідовності
{
//Створюємо новий елемент списку
Double_List* Current = stackalloc Double_List[sizeof(Double_List)];
Current->Data = n; //Заносимо значення в інформаційне поле
Current->Next = null; //В адресне поле заносимо 0
Current->Prev = null;
if (Head == null) //якщо елемент перший,
{ //він становиться головою та хвостом списку
Head = Last = Current;
}
else
{
//Додавання елемента на початок списку
Current->Next = Head;
Head->Prev = Current;
Head = Current;
}
//Введення нового елемента
Console.WriteLine("Признак кінця послідовності - 0.\n ВВедіть елемент: ");
n = int.Parse(Console.ReadLine());
count++;
}
Console.WriteLine("Кількість елементів в списку: {0}", count);
Console.WriteLine("Виведення елементів з початку списку");
//Виведення елементів з початку списку
Double_List* Cur = Head;
while (Cur != null) //Поки не кінець списку
{
Console.WriteLine(Cur->Data); //Виведення значення інформаційного поля
Cur = Cur->Next; //Перехід до наступного елемента
}
Console.WriteLine("Виведення елементів з кінця списку");
//Виведення елементів з кінця списку
Cur = Last;
while (Cur != null) //Поки не кінець списку
{
Console.WriteLine(Cur->Data); //Виведення значення інформаційного поля
Cur = Cur->Prev; //Перехід до наступного елемента
}
Double_List* NewItem = stackalloc Double_List[sizeof(Double_List)];
NewItem->Next = null; //В адресне поле заносимо 0
NewItem->Data = 66;
Double_List* Curr = Head;
for (int i = 0; i < count - 1 && Curr != null; i++)
{
Cur = Curr->Next;
if (Curr->Next != null && Curr->Next->Data == 3)
{
Curr->Next->Prev = NewItem;
NewItem->Next = Curr->Next;
Curr->Next = NewItem;
NewItem->Prev = Curr;
}
}
Cur = Head;
while (Cur != null) //Поки не кінець списку
{
Console.WriteLine(Cur->Data); //Виведення значення інформаційного поля
Cur = Cur->Next; //Перехід до наступного елемента
}
Console.WriteLine("ВВедіть номер елемента для виключення: ");
// Place = int.Parse(Console.ReadLine());
Double_List* Curr1 = Head;
Console.WriteLine("Пiсля видалення елементiв:");
// Single_List* Curr1 = Head;
if (Curr1->Data == 2 && Curr1 == Head)
{
Head = Head->Next;
Head->Prev = null;
}
Curr1 = Head;
while (Curr1->Next != null)
{
if (Curr1->Data == 2)
{
Curr1->Prev->Next = Curr1->Next;
Curr1->Next->Prev = Curr1->Prev;
}
Curr1 = Curr1->Next;
}
//виключення останнього елемента
if (Curr1->Next == null && Curr1->Data == 2)
{
Curr1->Prev->Next = null;
Last = Curr1->Prev->Next;
}
//Виведення елементів списку
Cur = Head;
while (Cur != null) //Поки не кінець списку
{
Console.WriteLine(Cur->Data); //Виведення значення інформаційного поля
Cur = Cur->Next; //Перехід до наступного елемента
}
Console.ReadLine();
}
}
У меня вставляеться элемент перед ПЕРВЫМ ОТРЕЦАТЕЛЬНИМ элементом, а нужно чтоб ПОСЛЕ КАЖДОГО, помогите пожалуйста