Консультация № 189140
09.04.2016, 11:04
0.00 руб.
0 3 1
Здравствуйте! У меня возникли сложности с таким вопросом:
Подскажите,как удалить конкретный элемент и добавить К элементов, после введенного(по номеру элемента)

Код:
#include <iostream>
#include <stdlib.h>
#include <ctime>
#include <cstdio>
#include <fstream>
using namespace std;
 
//структура динамического списка
struct LIST
{
    int young; // элементы списка
    LIST *next;
};
LIST *head = NULL;
LIST *rear = NULL;
 
//функция формирования списка
void make(char a)
{
   
    LIST *ptr;
    ptr = new LIST;
    if (!head) head = ptr;
    else rear->next = ptr;
    ptr->young = a;
    rear = ptr;
    rear->next = NULL;
}
 
//функция вывода на экран элементов списка
void print(void)
{
    LIST *ptr = head;
    while (ptr)
    {
        cout << ptr->young << " ";
        ptr = ptr->next;
        сout << index;
    }
    cout << endl;
}
 
//функция удаления первого элемента
void deletenhead(void)
{
    //указатель ptr устанавливаем на первый элемент
    LIST *ptr = head;
    //указатель head устанавливает на второй элемент
    head = ptr->next;
    //первый элемент удаляем
    delete ptr;
}
 
//функция удаления последнего элемента
void deletenrear(void)
{
    //указатель ptr устанавливаем на начало списка
    LIST *ptr = head;
    //Если в списке один элемент
    if (ptr == rear)
    {
        //то его удаляем
        delete ptr;
        //указатели rear и head обнуляем
        head = rear = NULL;
    }
    //Если в списке 2 и более элементов
    else
    {
        //указатель ptr устанавливаем на предпоследний элемент
        while (ptr->next != rear) ptr = ptr->next;
        //последний элемент удаляем
        delete rear;
        // Теперь последний элемент - это тот,
        //на который указывает ptr
        rear = ptr;
        //у последнего элемента поле next содержит NULL
        rear->next = NULL;
    }
}
 
int main()
{
    setlocale(0, "RUS");
    int n, i, b;
 
    cout << "Введите количество элементов списка: ";
    cin >> n;
    cout << "Введите  элементы списка: " << endl;
    for (i = 0; i<n; i++)
    {
        cin >> b;
        make(b);
    }
    cout << "Введенный список: ";
    print();
    deletenhead();
    cout << "Список после удаления первого элемента: ";
    print();
    deletenrear();
    cout << "Список после удаления последнего элемента: ";
    print();
    /*ofstream text("text.txt");
        LIST*ptr;
        ptr = rear;*/
    /*while (ptr != 0)
    {
        text << ptr->young << "\n";
        ptr->next;
    }*/
    system("pause");
    return(0);
}


Обсуждение

давно
Посетитель
7438
7205
12.04.2016, 18:10
общий
Адресаты:
Список должен быть двунаправленный? Или хватит однонаправленного?
Другими словами, вполне можно обойтись и без указателя rear
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
400153
18
12.04.2016, 18:20
общий
Адресаты:
Добрый вечер! Хватит и однонаправленного списка.
давно
Посетитель
7438
7205
13.04.2016, 01:00
общий
это ответ
Здравствуйте, User194586!
Держите программу. Мне чего-то кажется, что Вы и без комментариев прекрасно разберетесь...
Удачи!
[code h=200]
#include <windows.h>
#include <iostream>
#include <stdlib.h>
#include <ctime>
#include <cstdio>
#include <fstream>
using namespace std;

//структура динамического списка
struct LIST
{
int young; // элементы списка
LIST *next;
};
LIST *head = NULL;

//функция формирования списка
void make(int a)
{
LIST *ptr, *x;

ptr = new LIST;
ptr->young = a;
ptr->next = NULL;

if (!head)
head = ptr;
else
{
for(x=head; x->next; x=x->next);

x->next = ptr;
}
}

void erase(void)
{
LIST *x;
while (head)
{
x = head->next;
delete head;
head = x;
}
}

//функция вывода на экран элементов списка
void print(void)
{
LIST *ptr = head;
while (ptr)
{
cout << ptr->young << " ";
ptr = ptr->next;
}
cout << endl;
}

bool delete_idx(int idx)
{
LIST *ptr, *prev;
int num;

if (head != NULL)
{
for(ptr=head,num=0; num<idx && ptr; num++,prev=ptr,ptr=ptr->next);

if (ptr && (num == idx))
{
if (num == 0)
head = ptr->next;
else
prev->next = ptr->next;
delete ptr;
return true;
}
else
return false;
}
else
return false;
}

bool insert_idx_k(int idx, int k)
{
LIST *ptr, *next, *x;
int i, num, b;

if (head != NULL)
{
for(ptr=head,num=0; num<idx && ptr->next; num++,ptr=ptr->next);

next = ptr->next;

cout << "Введите вставляемые элементы: " << endl;
for(i=0; i<k; i++)
{
cin >> b;
x = new LIST;
x->young = b;
ptr->next = x;
ptr = x;
}
ptr->next = next;
return true;
}
else
return false;
}

int main()
{
int n, i, k, b;

SetConsoleCP(1251);
SetConsoleOutputCP(1251);

cout << "Введите количество элементов списка: ";
cin >> n;
cout << "Введите элементы списка: " << endl;
for (i = 0; i<n; i++)
{
cin >> b;
make(b);
}
cout << "Введенный список: ";
print();

cout << "Введите номер удаляемого элемента списка: ";
cin >> i;

if (delete_idx(i))
{
cout << "Список после удаления элемента: ";
print();
cout << endl;
}
else
cout << "Элемента с таким номером нет!" << endl;

cout << "Введите номер элемента, после которого вставить новые єлементы: ";
cin >> i;
cout << "Введите количество вставляемых элементов: ";
cin >> k;

if(insert_idx_k(i, k))
{
cout << "Результирующий список: ";
print();
cout << endl;
}
else
cout << "Список пуст!" << endl;
erase();
system("pause");
return(0);
}
[/code]
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа