Форум программистов, компьютерный форум CyberForum.ru

Объединение (конкатенация) двух односвязных списков - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как перенести все отрицательные элементы из одного массива в другой. http://www.cyberforum.ru/cpp-beginners/thread367495.html
Здравствуйте, уважаемые форумчане. Большая просьба помочь: Как из одномерного массива целых чисел все отрицательные элементы перенести в новый массив ?
C++ Разработать алгоритм решения задачи обработки одномерного массива. Помогите пожалуйста с написанием кода: Лабораторная работа № 4 Разработать алгоритм решения задачи обработки одномерного массива. Реализовать алгоритм на языке С++ двумя способами: 1) с помощью цикла с параметром for; 2) с помощью цикла с предусловием while или с постусловием do while. Предусмотреть ввод данных массива с клавиатуры и вывод результатов на экран.... http://www.cyberforum.ru/cpp-beginners/thread367493.html
C++ друзья помогите пожалуйста с задачками))
Перенесено из раздела CyberBlogger.ru Друзья, помогите пожалуйста с задачками )) в одномерном массиве, состоящем из n вещественных элементов вычислить: а)сумму элементов массива с нечетными номерами; б)сумму элементов массива, расположенных между первым и последним отрицательными элементами; в)сжать массив, удалив из нее все элементы, модуль которых не превышает 1. Освободившиеся в конце...
C++ Как найти сумму в массиве
дан массив А(50).найти сумму и кол-во нечетных положительных элементов,следующих за первым по порядку нулевым элементом.
C++ шашки C++ http://www.cyberforum.ru/cpp-beginners/thread367477.html
О великие гуру,я взываю вашей помощи. Хочу написать шашки на C++,но пока не особо представляю,что к чему. А именно: как сделать искусственный интеллект? как сделать выбор определенной шашки и как комп будет определять более удачный ход? у меня есть пара набросков,но они касаемы самого поля(массив 8*8,в котором 0 - пустые клетки,1 - белые шашки,2 - черные) и хода шашек( для белых это: board и...
C++ Форматирование поток ввода\вывода Здравствуйте, прощу объяснить и помочь дописать небольшой кусочек программы. 3адание: Определить структуру, елементами которой есть данные про студента (фамилия, стедний бал, стипендия). Ввести данные с клавиатуры, записать в текстовый и бинарный файл.Во время запись в текстовый файл отформатировать данные с помощью параметризованных манипуляторов (точность, ширина поля, заполнители), простих... подробнее

Показать сообщение отдельно
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,301
17.10.2011, 02:20     Объединение (конкатенация) двух односвязных списков
silentnuke, дядя, я спрашивал за ПОСЛЕДНИЙ указатель. Куда бы он указывал у меня , я знаю. Куда он должен указывать у ТС- один Бог ведает. может у него закольцованный список.

Но как бы то ни было.

Введём:
C++
1
2
3
4
5
6
Введите 1й список
q
0
Введите 2й список
w
0
И пронализируем поведение программы. Для этого в функцию конкантекации добавим такие
надписи:
C++
1
2
3
4
5
6
7
8
9
10
         printf ("top2= %x\n", top2);
        temp=pop(*&top2);
        node *pv=first(temp);
 
        printf ("top2= %x\n", top2);
 
        while (top2){
                printf ("wwwwwwwwww\n");
                char temp2=pop(*&top2);
                printf ("rrrrrrrrrrrrr\n");
Теперь внимательно меня слушаем.
По запуску программы мы не увидим
C++
1
                printf ("rrrrrrrrrrrrr\n");
Делаем вывод, что сбой где-то во втором вызове pop. Действительно, первый вызов pop, вот этот
C++
1
2
3
4
5
        printf ("top2= %x\n", top2);
        temp=pop(*&top2);
        node *pv=first(temp);
 
        printf ("top2= %x\n", top2);
не вызвал сбоя, wwwwwwwwwww напечаталось
Но вызовы pop совершенно одинаковы! И даже передаются одинаковые адреса! Почему первый pop отрабатывает нормально, а второй даёт сбой?

Делаем предположение: Значит, между вызовами pop меняется СОДЕРЖАНИЕ адресов. Причём меняется АВАРИЙНО так, что второй pop не может сработать.
Где находится участок кода, в котором могло бы аварийно поменяться содержание адресов? (И этот участок должен находиться МЕЖДУ вызовами pop)

Правильно. Этот участок- сама функция pop. При её первом вызове что-то там нехорошее происходит.

Смотрим на функцию pop. Она принимает параметр top, равный top2, проверяем это, пишем так:
C++
1
2
char pop(node **top){
        printf ("top= %x\n", top);
Запускаем прогу и видим:
C++
1
2
3
4
5
6
7
8
9
10
11
Введите 1й список
q
0
Введите 2й список
w
0
top2= 22ff54
top= 22ff54
top2= 22ff54
wwwwwwwwww
top= 22ff54
ага, функция pop вызвалась 2 действительно, top==top2, адреса не меняются, значит меняется то, что лежит по этим адресам; при втором вызове pop даёт крах

Обращаю твоё внимание на одну очень важную вещь: мы убедились, что pop даёт крах при ВТОРОМ вызове, но исследовать будем ПЕРВЫЙ ВЫЗОВ, ибо, как мы поняли, именно в первый раз аварийно меняется содержимое top! (или top2, что то же самое)

Итак, пошли в функцию смотреть, что такого происходит с этим адресом:
C++
1
2
3
        char temp=(*top)->d;
//Тут вроде всё нормально, даже можем посмотреть чему равно становится temp 
//        printf ("temp= %c\n", temp);
////////////////////////////////////////////////////////
C++
1
        node *pv=*top;
Это уже интереснее. Содержимое top куда-то кладётся- а мы уже помним, что нас интересует именно содержимое этого адреса! Держим в уме переменную pv!


C++
1
        *top=(*top)->p;
Ага, *top это адрес объекта и он меняется! На корректное ли значение? Нет! Ведь (*top)->p указывает на ноль! ПРоверяем:
C++
1
2
3
4
5
6
7
8
9
10
char pop(node **top){
        printf ("top= %x\n", top);
        char temp=(*top)->d;
//        printf ("temp= %c\n", temp);
        node *pv=*top;
        *top=(*top)->p;
        printf ("__*top= %d\n", *top);
        delete pv;
        return temp;
}

Введите 1й список
q
0
Введите 2й список
w
0
top2= 22ff54
top= 22ff54
__*top= 0
top2= 22ff54
wwwwwwwwww
top= 22ff54


Ноль! А в следующий вызов pop мы также вызовем её со значением 22ff54. разыменуем и получим 0, с котрого безуспешно будем пытаться взять вот это:
C++
1
char temp=(*top)->d;
И вот тут-то и будет самый настоящий крах.
Ввыод: при первом вызове pop НЕПРАВИЛЬНО писать это:
C++
1
        *top=(*top)->p;
- читай: класть ноль в переменную p, ибо будет второй вызов, который обратится по адресу p, равному 0 и потерпит крах!

Добавлено через 16 минут
В обшем, я с самого начал хотел написать, что нужна функция вывода списка- щас бы проверили.
Короче, размышляя так. приходим к выводу, что эти условия неверны:
C++
1
2
while (top2)
while (top){
а надо так:

C++
1
2
while ((*top2))
while ((*top))
Запускаем, прога сбоев не даёт. Но и проверить конкантекацию возможности нет- ведь нет соответсвующей функции. Пиши. Пивет!

Добавлено через 3 минуты
НУ то есть мы делаем неправильно одно из двух: это
C++
1
        *top=(*top)->p;
или это

C++
1
while (top2)
ибо если условие не выполнялось, то ы бы и в функцию не вошли и краха бы не было.
Ну а дальше уж сам сообразишь что менять.
 
Текущее время: 02:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru