Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
#1

Добавление в конец списка

11.06.2015, 01:01. Просмотров 788. Ответов 19
Метки нет (Все метки)

Привет всем, необходимо реализовать алгоритм вставки. В общем беру элемент на нечетной позиции списка и вставляю его в конец.
3-й час сижу никак не могу понять, в чем загвоздка. Помогите пожалуйста. Вот код:
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
struct spisok {
    char s[10] ;
    char d[10];
    spisok *next;
 
};
int curpos = 1;
    
    spisok *p = *begin; // Дополнительный указатель на начало списка
    
    
    while ( p ) { // Просмотр списка
        if ((curpos % 2) > 0) {              // Если текущий элемент по порядку нечетный
            spisok *temp = new spisok;  //ссылка на spisok
            strcpy(temp->d, p->s); // Вот здесь точно не знаю - нужно в промежуточную переменную вставить содержимое p->s
            (*end)->next = temp; 
            *end = temp;   
            temp->next = NULL; 
 
}
        
        curpos++;
        if (curpos > n ) break; // если текущая позиция больше количества элементов выход
    }
Добавлено через 11 минут
В общем беру элемент на нечетной позиции дублирую и вставляю его клон в конец.
Допустим : Начальный список: 1 8 9 3 6.
Конечный список: 1 8 9 3 6 1 9 6
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2015, 01:01
Ответы с готовыми решениями:

Списки. Функции добавление списка в конец и в середину другого списка.
Всем привет!) Я вот написал две функции, 1- добавляется список2 в середину...

Добавление в конец двусвязного списка
Помогите найти ошибку в коде: не работает добавление в конец. Список...

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

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

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

19
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
11.06.2015, 01:21 #2
У тебя end и begin какого типа, что ты их разыменовываешь?
Как-то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
      spisok *p = begin; // Дополнительный указатель на начало списка
    
       while (curpos <= n) // Просмотр списка
       { 
            if ((curpos % 2) > 0) // Если текущий элемент по порядку нечетный
            {              
                spisok *temp = new spisok; 
                strcpy(temp ->d, p ->d); 
                strcpy(temp ->s, p ->s);
                end ->next = temp; 
                end = temp;   
                temp ->next = NULL;
            }
            p = p ->next;
            curpos++;
        }
0
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
11.06.2015, 01:29  [ТС] #3
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <locale>
#include <conio.h>
#include <string.h>
 
using namespace std;
 
 
struct spisok {
    char s[10] ;
    char d[10];
    spisok *next;
 
};
 
 
void Form ( spisok **begin, int n) {
    
 
    spisok *string = new spisok[n];
    for (int i = 0; i < n; i++)
    {
        cout << "Введите " << i + 1 << "й элемент: ";
        cin >> string[i].s;
        
    }   
    
    
 
    *begin = new spisok ;
    
 
strcpy ((*begin)->s,string[0].s);
(*begin)->next = NULL;
 
spisok *end = *begin;
 
for (int i = 1; i < n; i++) {
    end->next = new spisok;
    end = end->next;
    strcpy (end->s , string[i].s);
    end->next = NULL;
}
 
 
 
}
void Print(spisok *b) {
    spisok *print = b;
    while (print)
    { 
      cout << print->s << "  ";
      print = print->next;
    }
    
    
 
}
void insert (spisok **begin, spisok **end, int n) {
    spisok *Ins = new spisok;
    
    if ((*begin) == NULL) {
        Ins->next = NULL;
        *begin = Ins;
        return;
        }
 
    int curpos = 1;
    spisok *p = *begin; // Дополнительный указатель на начало списка
    
       while (curpos <= n) // Просмотр списка
       { 
            if ((curpos % 2) > 0) // Если текущий элемент по порядку нечетный
            {              
                spisok *temp = new spisok; 
                strcpy(temp ->d, p ->d); 
                strcpy(temp ->s, p ->s);
                (*end) ->next = temp; 
                *end = temp;   
                temp ->next = NULL;
            }
            p = p ->next;
            curpos++;
        }
    
 
    
 
}
 
 
 
 
int main() {
    setlocale (LC_ALL, "rus");
    spisok *begin = NULL;
    spisok *end = begin;
    int n; 
    
    cout << "Введите количество элементов списка: "; cin >> n;
    
    Form  (&begin, n) ;
    Print (begin);  
    insert (&begin, &end,n);
    Print (begin);  
    system ("pause");
    return 0;
}
Так же выбивает ошибку, вроде программа приостановлена.
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
11.06.2015, 01:36 #4
Понятно, тогда так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
      spisok *p = *begin; // Дополнительный указатель на начало списка
    
       while (curpos <= n) 
       { // Просмотр списка
            if ((curpos % 2) > 0) 
            {              // Если текущий элемент по порядку нечетный
                spisok *temp = new spisok; 
                strcpy(temp ->d, p ->d); 
                strcpy(temp ->s, p ->s);
                (*end) ->next = temp; 
                (*end) = temp;   
                temp ->next = NULL;
            }
            p = p ->next;
            curpos++;
        }
Добавлено через 1 минуту
Чтобы не морочиться с разыменованиями, можно ссылку на указатель передавать:
C++
1
void Form ( spisok *& begin, int n)
0
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
11.06.2015, 01:39  [ТС] #5
Да не, я и до этого в вашем коде звездочки скобочки поставил.
Тут не в этом дело по-моему. И да - в конце все равно if (curpos > n) break; нужен иначе зациклится же.
И можете объяснить зачем вот эти 2 строки, а не, допустим, одна??
C++
1
2
strcpy(temp ->d, p ->d); 
strcpy(temp ->s, p ->s);
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
11.06.2015, 01:44 #6
Цитата Сообщение от bordoboy363 Посмотреть сообщение
И да - в конце все равно if (curpos > n) break; нужен иначе зациклится же.
Не зациклится, потому что:
Цитата Сообщение от lss Посмотреть сообщение
while (curpos <= n)
, поэтому, как только curpos станет больше n, будет выход из цикла.
Цитата Сообщение от bordoboy363 Посмотреть сообщение
И можете объяснить зачем вот эти 2 строки, а не, допустим, одна??
У тебя, в структуре, сколько полей с данными?
0
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
11.06.2015, 01:47  [ТС] #7
Вообще все вбивается в поле s. Поле d я вот минут 10 назад добавил, думал мб как - то в нее надо копировать значение p->s.
Да, действительно, не зациклится.
Но все-таки , как корректно записать данные p->s в другую переменную??
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
11.06.2015, 01:48 #8
Цитата Сообщение от bordoboy363 Посмотреть сообщение
Поле d я вот минут 10 назад добавил,
Структуру покажи.
0
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
11.06.2015, 01:49  [ТС] #9
Я же код наверху скинул)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include <iostream>
#include <locale>
#include <conio.h>
#include <string.h>
 
using namespace std;
 
 
struct spisok {
    char s[10] ;
    char d[10];
    spisok *next;
 
};
 
 
void Form ( spisok **begin, int n) {
    
 
    spisok *string = new spisok[n];
    for (int i = 0; i < n; i++)
    {
        cout << "Введите " << i + 1 << "й элемент: ";
        cin >> string[i].s;
        
    }   
    
    
 
    *begin = new spisok ;
    
 
strcpy ((*begin)->s,string[0].s);
(*begin)->next = NULL;
 
spisok *end = *begin;
 
for (int i = 1; i < n; i++) {
    end->next = new spisok;
    end = end->next;
    strcpy (end->s , string[i].s);
    end->next = NULL;
}
 
 
 
}
void Print(spisok *b) {
    spisok *print = b;
    while (print)
    { 
      cout << print->s << "  ";
      print = print->next;
    }
    
    
 
}
void insert (spisok **begin, spisok **end, int n) {
    spisok *Ins = new spisok;
    
    if ((*begin) == NULL) {
        Ins->next = NULL;
        *begin = Ins;
        return;
        }
 
    int curpos = 1;
    spisok *p = *begin; // Дополнительный указатель на начало списка
    
       while (curpos <= n) // Просмотр списка
       { 
            if ((curpos % 2) > 0) // Если текущий элемент по порядку нечетный
            {              
                spisok *temp = new spisok; 
                strcpy(temp ->d, p ->d); 
                strcpy(temp ->s, p ->s);
                (*end) ->next = temp; 
                *end = temp;   
                temp ->next = NULL;
            }
            p = p ->next;
            curpos++;
        }
    
 
    
 
}
 
 
 
 
int main() {
    setlocale (LC_ALL, "rus");
    spisok *begin = NULL;
    spisok *end = begin;
    int n; 
    
    cout << "Введите количество элементов списка: "; cin >> n;
    
    Form  (&begin, n) ;
    Print (begin);  
    insert (&begin, &end,n);
    Print (begin);  
    system ("pause");
    return 0;
}
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
11.06.2015, 01:51 #10
Цитата Сообщение от bordoboy363 Посмотреть сообщение
Но все-таки , как корректно записать данные p->s в другую переменную??
Вот этого недостаточно?
Цитата Сообщение от lss Посмотреть сообщение
strcpy(temp ->s, p ->s);
Или о чём речь?

Добавлено через 1 минуту
Цитата Сообщение от bordoboy363 Посмотреть сообщение
Я же код наверху скинул)
Вот это тогда о чём?
Цитата Сообщение от bordoboy363 Посмотреть сообщение
Вообще все вбивается в поле s. Поле d я вот минут 10 назад добавил, думал мб как - то в нее надо копировать значение p->s.
Если у тебя два поля, то и копировать нужно два поля:
Цитата Сообщение от lss Посмотреть сообщение
strcpy(temp ->d, p ->d);
strcpy(temp ->s, p ->s);
Не пойму, что непонятно?
0
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
11.06.2015, 01:54  [ТС] #11
Вообще, я думал, что если делать strcpy (temp->s,p->s) это типа переменная в саму себя копирует.
Получается , что strcpy( temp->s, p->s) достаточно, как я понимаю. Но почему же он тогда так упорно не хочет добавлять в конец списка нужные элементы??
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
11.06.2015, 01:59 #12
Откуда видно, что не добавляет?
0
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
11.06.2015, 02:01  [ТС] #13
При компиляции выдает - завершение работы , предварительно напечатав введенные элементы
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
11.06.2015, 02:04 #14
И?...

Добавлено через 49 секунд
Ты хочешь чтобы я ясновиденьем занялся? Или как?
0
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
11.06.2015, 02:05  [ТС] #15
Ну вы спросили, я ответил. А что я должен был сказать лол)
0
lss
930 / 859 / 355
Регистрация: 10.10.2012
Сообщений: 2,705
11.06.2015, 02:08 #16
От темы отписался.
1
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
11.06.2015, 02:09  [ТС] #17
В любом случае спасибо)
0
smartpointer
69 / 63 / 39
Регистрация: 17.02.2014
Сообщений: 264
11.06.2015, 02:40 #18
Лучший ответ Сообщение было отмечено bordoboy363 как решение

Решение

У вас перед входом в функцию insert указатель end нулевой - следовательно любые действия с ним запрещены пока его не заполните. Почему не используете дебагер ? И где освобождение памяти ?
0
nord_v
329 / 177 / 80
Регистрация: 22.08.2013
Сообщений: 724
11.06.2015, 19:41 #19
Лучший ответ Сообщение было отмечено bordoboy363 как решение

Решение

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <iostream>
#include <locale>
#include <string.h>
 
using namespace std;
 
struct spisok 
{
    char s[10] ;
    char d[10];
    spisok *next;
 
};
 
void Form ( spisok *& begin, spisok *& end, int n) 
{
    for (int i = 0; i < n; i++)
    {
        spisok * temp = new spisok;
        cout << "Введите " << i + 1 << "й элемент:" << endl;
        cin >> temp ->s;
        cin >> temp ->d;
        temp ->next = NULL;
        if (begin == NULL)
        {
            begin = end = temp;
        }
        else
        {
            end ->next = temp;
            end = temp;
        }
    }   
    
}
 
void Print(spisok *begin) 
{
    cout << endl;
    while (begin)
    { 
        cout << begin ->s << ' ' << begin ->d << endl;
        begin = begin ->next;
    }
    cout << endl;
}
 
void Delete(spisok*& begin)
{
    spisok* temp;
    while (begin)
    { 
        temp = begin ->next;
        delete begin;
        begin = temp;
    }
}
 
void insert (spisok *& begin, spisok *& end, int n) 
{
    if (begin == NULL)
    {
        cout << "List is empty!" << endl;
        return;
    }
        
    int curpos = 1;
    spisok *p = begin; // Дополнительный указатель на начало списка
    
    while (curpos <= n) // Просмотр списка
    { 
        if ((curpos % 2) != 0) // Если текущий элемент по порядку нечетный
        {              
            spisok *temp = new spisok; 
            strcpy(temp ->d, p ->d); 
            strcpy(temp ->s, p ->s);
            temp ->next = NULL;
            end ->next = temp; 
            end = temp;   
        }
        p = p ->next;
        curpos++;
    }
}
 
 
int main() 
{
    setlocale (LC_ALL, "rus");
    spisok *begin = NULL;
    spisok *end = begin;
    int n; 
    
    cout << "Введите количество элементов списка: "; 
    cin >> n;
    
    Form  (begin, end, n);
    Print (begin);  
    insert (begin, end, n);
    Print (begin); 
    Delete(begin);
    
    system ("pause");
    return 0;
}
1
Миниатюры
Добавление в конец списка  
bordoboy363
2 / 2 / 1
Регистрация: 15.12.2014
Сообщений: 45
14.06.2015, 22:34  [ТС] #20
nord_v, я уже давно разобрался) Спасибо за старания)) Думаю, для вас - практика лишней не будет.
И на будущее - думается, если ответ отмечен лучшим, решение найдено))
0
14.06.2015, 22:34
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2015, 22:34

Добавление объекта в конец односвязного списка
необходимо добавить объект в конец списка. как это сделать с помощью моей...

Добавление элементов в конец связного списка
Пишу программу по добавление элементов в конец связного списка: // linklist...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru