Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/120: Рейтинг темы: голосов - 120, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 07.02.2017
Сообщений: 11
1

Односвязный список: добавление элемента в конец списка

14.01.2018, 00:34. Показов 21802. Ответов 4
Метки нет (Все метки)

Здравствуйте, учу списки, стояла задача - добавить в готовый список элементы в начале/середине/конце. На добавлении в конец возникла проблема. Не получалось присвоить значение, методом тыка нашел "ошибку". Нужно было убрать 41ю строку кода. Собственно вопрос. Почему? Мы ведь добавили один элемент, следовательно указатель "end" должен указывать на предпоследнюю ячейку. Но судя по тому что без 41й строки все работает - это не так. Почему он поменялся? Я ведь менял только ячейку которая была после той на которую указывает "end" с "NULL" на адресс новой ячейки

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
#include <iostream>
 
using namespace std;
 
struct Data
{
    int data;
};
 
struct List
{
    Data a;
    List* next;
};
 
void Print(List* a)
{
    while(!(a->next == NULL))
    {
        cout << a->a.data << " -- ";
        a = a->next;
    }
    cout << "NULL\n";
    return;
}
 
void Addfirst(List** a, int n)
{
   List* temp = new List;
   temp->next = (*a);
   (*a) = temp;
   (*a)->a.data = n;
   return;
}
 
void Addlast(List** a, int n)
{
    List* temp = new List;
    temp->next = NULL;
    (*a)->next = temp;
  //  (*a) = temp;
    (*a)->a.data = n;
 
 
    return;
}
 
int main()
{
    Data a[8]={10,20,30,40,50,60,70,80};
    List* begin = new List;
    begin->a.data = 0;
    begin->next = NULL;
    List* end = NULL;
    end = begin;
 
    for(int i=0; i<9; i++)
    {
    end->next = new List;
    end = end->next;
    end->next = NULL;
    end->a = a[i];
    }
    Print(begin);
 //   Addfirst(&begin, 15);
    Addlast(&end, 124);
    Print(begin);
    return 0;
}
Миниатюры
Односвязный список: добавление элемента в конец списка  
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.01.2018, 00:34
Ответы с готовыми решениями:

Односвязный список с добавлением нового элемента в конец.
Здраствуйте. Мне нужна ваша помощь. Есть программа которая строит список из k элементов выводит его...

Добавление элемента в односвязный список
Здравствуйте, делаю односвязный список, возник такой вопрос в следующем методе: void Add(int a)...

Односвязный список. Подсчитать сумму N первых элементов. Удалить эти элементы и вставить в конец списка
Помогите, плиз доработать функцию summ - она должна подсчитать сумму N первых элементов. Удалить...

Односвязный список, добавление элемента вслед указанному
Создаю список, вывожу его, затем нужно по введенному элементу x найти такой же в списке и после...

4
0 / 0 / 0
Регистрация: 07.02.2017
Сообщений: 11
14.01.2018, 14:51  [ТС] 2
Попробовал добавить элемент тем же принципом каким добавлял их в цикле for (строки 57-63). Тоже не работает

Добавлено через 14 часов 3 минуты
методом тыка нашел ошибку. end указывает не на последний элемент списка. Но стоит нам добавить новый элемент как end начинает указывать на него. Выходит что изначально он указывал на следующий, еще не созданный? Как это возможно если в 60 стоке мы присваиваем end адрес только что созданной ячейки (последней в списке)
0
2229 / 1732 / 865
Регистрация: 21.12.2010
Сообщений: 3,074
Записей в блоге: 11
14.01.2018, 16:23 3
Лучший ответ Сообщение было отмечено dmitriyv501 как решение

Решение

примерно так, проверяй
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
#include <iostream>
using namespace std;
 
struct Data
{
    int data;
};
 
struct List
{
    List() : next(NULL){}
    List(int n) : next(NULL)
    {
        num.data = n;
    }
    Data num;
    List* next;
};
 
void Print(List* a)
{
    while (a)
    {
        cout << a->num.data << " -- ";
        a = a->next;
    }
    cout << "NULL\n";
    return;
}
 
void Addfirst(List** a, int n)
{
    if (*a)
    {
        List* temp = new List();
        temp->next = (*a)->next;
        temp->num.data = (*a)->num.data;
        (*a)->num.data = n;
        (*a)->next = temp;
    }
    else
    {
        (*a) = new List(n);
    }
    
    return;
}
 
void Addlast(List** a, int n)
{
    List* tmp = *a;
    if (*a)
    {
        while (tmp->next)
        {
            tmp = tmp->next;
        }
        tmp->next = new List(n);
    }
    else
    {
        (*a) = new List(n);
    }
    
    return;
}
 
int main()
{
    Data a[8] = { 10,20,30,40,50,60,70,80 };
    List* begin = new List(0);
    List* end = begin;
 
    for (int i = 0; i < 8; i++)
    {
        end->next = new List(a[i].data);
        end = end->next;
    }
    Print(begin);
    Addfirst(&begin, 15);
    Addlast(&end, 124);
    Print(begin);
    return 0;
}
1
0 / 0 / 0
Регистрация: 07.02.2017
Сообщений: 11
14.01.2018, 16:44  [ТС] 4
я в шоке) работает)) добавил 53 строку, по ней видно что end ссылается именно на последний элемент. У себя так же заметил что цикл проходится на 1 раз больше чем нужно так как последняя ячейка почему-то не выводилась функцией Print... В этом и была моя проблема. Была лишняя ячейка которая по до сих пор неизвестным мне причинам не выводилась... Пошел изучать код и искать ошибку) спасибо)
Миниатюры
Односвязный список: добавление элемента в конец списка   Односвязный список: добавление элемента в конец списка  
0
0 / 0 / 0
Регистрация: 07.02.2017
Сообщений: 11
14.01.2018, 17:49  [ТС] 5
нашел. как всегда ошибка там где я её не искал. условие цикла while не правильное
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2018, 17:49

Односвязный список, распечатка, добавление элемента в начало
Вечер добрый. Пытаюсь вывести структуру, но ничего не получается. пишет Head was not declared in...

Добавление элемента в конец списка
Сначала добавляет первый элемент, а далее не хочет? Посмотрите свежим глазом, а то я лагаю! void...

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

Добавление элемента в конец односвязного списка
Добрый день. Помогите решить проблему с ошибкой в функции AddItem. CPP файл #include &quot;stdafx.h&quot;...


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

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

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