6 / 3 / 0
Регистрация: 15.12.2020
Сообщений: 219
1

Написать функцию добавления элемента в заданную позицию списка

08.06.2022, 16:33. Показов 177. Ответов 3
Метки нет (Все метки)

3. Написать функцию добавления элемента в заданную позицию списка
(прилагается один целый параметр – номер необходимой позиции; 0 – вставка в
начало списка, 1 – после первого элемента, и т.д.): а) для списка целых чисел;
б) для списка из любого типа элементов.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream>
#include <clocale>
 
struct node {
    char data;
    node* next;
};
 
typedef node* lst;
 
void push_front(lst& l, char data) {
    node* n = new node;
    n->data = data;
    n->next = l;
    l = n;
}
 
void push_back(lst& l, char data) {
    node* n = new node;
    n->data = data;
    n->next = 0;
    if (l) {
        lst c = l;
        while (c->next) c = c->next;
        c->next = n;
    }
    else {
        l = n;
    }
}
 
void insert_after_first(lst l, char data) {
    if (l) {
        node* n = new node;
        n->data = data;
        n->next = l->next;
        l->next = n;
    }
}
 
using namespace std;
 
char get_ins_data() {
    char data;
    cout << "Введите символ для вставки: ";
    cin >> data;
    return data;
}
 
int main() {
    setlocale(LC_ALL, "Rus");
    lst l = 0;
    bool run = true;
    while (run) {
        cout << "0) Показать список\n1) Вставить в начало\n2) Вставить в конец\n"
            "3) Вставить после первого\n4) Выход\nВведите номер: ";
        char c; cin >> c;
        switch (c) {
        case '0':
            for (lst c = l; c; c = c->next) cout << c->data << ' ';
            break;
        case '1':
            push_front(l, get_ins_data());
            break;
        case '2':
            push_back(l, get_ins_data());
            break;
        case '3':
            insert_after_first(l, get_ins_data());
            break;
        case '4':
            run = false;
            break;
        default:
            cout << "Ошибка: неверный выбор\n";
            break;
        }
        cout << endl << endl;
    }
    return 0;
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2022, 16:33
Ответы с готовыми решениями:

Написать функцию добавления значения в определенную позицию списка, заданную пользователем
class.h #include&lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; class LinkedList {...

Написать функцию добавления элемента в N позицию
Написать функцию добавления элемента в N позицию. в массиве. #include &lt;stdio.h&gt; int a, i, j,...

Создать процедуру для добавления элемента в заданную позицию списка и вывода списка на экран
Вот у меня есть готовая программа.Объясните мне пожалуйста каждую строчку чтоб я понял.Желательно...

Добавление элемента в заданную позицию списка.
Здравствуйте. Помогите написать процедуру добавления элемента в заданную позицию динамического...

3
3988 / 2037 / 734
Регистрация: 29.11.2010
Сообщений: 4,373
08.06.2022, 18:33 2
Как-то геморно написано. Да ещё и освобождения памяти выделенной под список нет.
Предлагаю немного усложнить и сразу же сильно упростить.
Давайте введём концепцию "базового элемента" списка.
В нём не будет данных, будет только ссылка на следующий элемент.
Так же на него будет указывать последний элемент.
А вот уже следующие в цепочке элементы могут содержать данные.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
 
// введем понятие базовой ноды -- ноды без данных
struct node_base {
    // собственно, только указатель на слдеюущий элемент
    node_base *next;
 
    // когда мы её без параметров вызовем -- она будет указывать на себя
    node_base() : next(this) {}
 
    // для красоты -- пусть сама вставляет себя, зная своего предшественника
    node_base(node_base *after) : next(after->next) {
        after->next = this;
    }
 
    // это нужно, чтоб дочерний класс можно было приводить к родительскому
    virtual ~node_base() = default;
};
 
// а это -- та же самая нода, но уже с данными
struct node : public node_base {
    char data;
 
    // тут будет вызван конструктор базовой ноды и она тоже сама себя вставлять будет после переданного элемента
    node(char data, node_base *after) : data(data), node_base(after) {}
};
 
// функция вставки элемента в список после определённого получается довольно тривиальная
void insert_after(node_base *position, char data) {
    // просто создаём ноду, передавая в конструктор параметром её предшественника
    // и она (в конструкторе) сама себя добавит в список
    new node(data, position);
}
 
// освобождение памяти, выделенной под список
void clear(node_base &base) {
    while (base.next != &base) {
        node_base *next = base.next->next;
        delete base.next;
        base.next = next;
    }
}
 
// поиск предыдущего элемента
node_base *previous(node_base *base) {
    node_base *result = base->next;
    while (result->next != base) {
        result = result->next;
    }
    return result;
}
 
int main() {
    // "базовый" элемент списка. не содержит данных. только указатель
    // при создании указатель указывает на себя самого
    node_base base; // элемент перед первым и он же элемент после последнего
 
    insert_after(&base, 'c'); // перед первым (push_front)
    insert_after(&base, 'a'); // перед первым (push_front)
    insert_after(base.next, 'b'); // после первого (???)
    insert_after(previous(&base), 'd'); // после последнего (push_back)
 
    for (node_base *i = base.next; i != &base; i = i->next) {
        // для доступа к элеметну ноду нужно привести из базового типа к типу ноды
        // по-сиплюсплюсному -- через dynamic_cast, который именно для этого и сделан
        std::cout << dynamic_cast<node *>(i)->data << " ";
    }
 
    clear(base);
    return 0;
}
0
6 / 3 / 0
Регистрация: 15.12.2020
Сообщений: 219
08.06.2022, 21:27  [ТС] 3
0 – вставка в начало списка, 1 – после первого элемента, и т.д.).Я щас задумался на счет этих условии может это имели сделати через switch и case тоби ж case 0: вставка а case 1: вставка после первого элемента.
0
3988 / 2037 / 734
Регистрация: 29.11.2010
Сообщений: 4,373
08.06.2022, 21:39 4
Цитата Сообщение от VictorVAlduin Посмотреть сообщение
0 – вставка в начало списка, 1 – после первого элемента, и т.д.).Я щас задумался на счет этих условии может это имели сделати через switch и case тоби ж case 0: вставка а case 1: вставка после первого элемента.
Может вставка элемента на позицию с заданным индексом?
Это не сложно реализовать. Нужно лишь добавить функцию, которая будет "отсчитывать" ноду.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
 
// введем понятие базовой ноды -- ноды без данных
struct node_base {
    // собственно, только указатель на слдеюущий элемент
    node_base *next;
 
    // когда мы её без параметров вызовем -- она будет указывать на себя
    node_base() : next(this) {}
 
    // для красоты -- пусть сама вставляет себя, зная своего предшественника
    node_base(node_base *after) : next(after->next) {
        after->next = this;
    }
 
    // это нужно, чтоб дочерний класс можно было приводить к родительскому
    virtual ~node_base() = default;
};
 
// а это -- та же самая нода, но уже с данными
struct node : public node_base {
    char data;
 
    // тут будет вызван конструктор базовой ноды и она тоже сама себя вставлять будет после переданного элемента
    node(char data, node_base *after) : data(data), node_base(after) {}
};
 
// функция вставки элемента в список после определённого получается довольно тривиальная
void insert_after(node_base *position, char data) {
    // просто создаём ноду, передавая в конструктор параметром её предшественника
    // и она (в конструкторе) сама себя добавит в список
    new node(data, position);
}
 
// освобождение памяти, выделенной под список
void clear(node_base &base) {
    while (base.next != &base) {
        node_base *next = base.next->next;
        delete base.next;
        base.next = next;
    }
}
 
// поиск предыдущего элемента
node_base *previous(node_base *base) {
    node_base *result = base->next;
    while (result->next != base) {
        result = result->next;
    }
    return result;
}
 
// "двигает" указатель на элемент вперёд на diff позиций
node_base *advance(node_base *node, std::size_t diff) {
    while (diff--) {
        node = node->next;
    }
    return node;
}
 
int main() {
    // "базовый" элемент списка. не содержит данных. только указатель
    // при создании указатель указывает на себя самого
    node_base base; // элемент перед первым и он же элемент после последнего
 
    insert_after(&base, 'c'); // перед первым (push_front)
    insert_after(&base, 'a'); // перед первым (push_front)
    insert_after(base.next, 'b'); // после первого (???)
    insert_after(previous(&base), 'd'); // после последнего (push_back)
 
    //вставка на позицию с определённым индексом (O(n))
    std::size_t index = 2; // индекс
    node_base *position = advance(&base, index); // вычисление позиции для вставки
    insert_after(position, '!'); // вставка в определённую позциуию
    // можно одной строкой,без промежуточных переменных:
    insert_after(advance(&base, index), '?');
 
    for (node_base *i = base.next; i != &base; i = i->next) {
        // для доступа к элеметну ноду нужно привести из базового типа к типу ноды
        // по-сиплюсплюсному -- через dynamic_cast, который именно для этого и сделан
        std::cout << dynamic_cast<node *>(i)->data << " ";
    }
 
    clear(base);
    return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2022, 21:39
Помогаю со студенческими работами здесь

Написать предикат insertBeforeLast для добавления элемента в позицию предпоследнего элемента
Написать предикат insertBeforeLast для добавления элемента в позицию предпоследнего элемента. Буду...

Вставка элемента в заданную позицию, удаление элемента по заданной позиции, поиск заданного элемента
Добавить в класс &quot;Односвязный список&quot; следующие функции: вставка элемента в заданную позицию,...

Написать класс Список с методом добавления элемента в конец списка
Возник Вопрос: а как сделать так сказать бесконечное добавление элементов, то есть за раннее не...

Написать функцию добавления элемента в динамический стек
Что-то до меня не доходит... #include &lt;conio.h&gt; #include &lt;iostream&gt; struct dstack {...

Двусвязный список, вставка элемента в заданную позицию, и удаление элемента из заданной позиции
Нужны функции для двусвязного списка, вставка элемента в заданную позицию, и удаление элемента из...

Создание списка, печать списка на экран, добавления элемента в начало списка, конец списка
Построить динамическую структуру типа список . Необходимо реализовать следующие процедуры: 1....

Вставить элемент списка на заданную позицию
Задача: вставить элемент элемент списка в прологе на заданную позицию. Реализовал вставку на первую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru