1 / 1 / 0
Регистрация: 16.10.2011
Сообщений: 69
|
||||||
1 | ||||||
Объединение (конкатенация) двух односвязных списков17.10.2011, 00:15. Показов 13522. Ответов 16
Метки нет (Все метки)
Задача: Построить стек (односвязный список). Показать реализацию стека на следующем примере: сцепить два связанных списка данных символьного типа, через функцию concatenate.
Списки ввожу до того момента, пока не введется '0'. Вот то, что получилось:
0
|
17.10.2011, 00:15 | |
Ответы с готовыми решениями:
16
Объединение двух списков Найти объединение двух списков Объединение двух связанных списков (нужен совет) Объединение двух списков в один без повтора элементов (С++) |
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
17.10.2011, 00:51 | 2 |
Допустим, первый список (схематично) из двух элементов
a->b второй c->e У меня несколько вопросов: на что должен указывать b.p (и соответственно c.d) и каков должен быть конечный список (a->b->c->e или как? И если да, то на что должен указывать в таком случае e.d? )
0
|
1 / 1 / 0
Регистрация: 16.10.2011
Сообщений: 69
|
|
17.10.2011, 00:57 [ТС] | 3 |
kravam, список должен состоять из a,b,c,e, что за b.p и c.d?
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
17.10.2011, 01:01 | 4 |
a->b->c->e?
Ну поля, ё. У тебя же d это указатель, на что он указывать должен?: Добавлено через 1 минуту struct node{ char d; node *p; }; а, ошибся я; p указатель на что должен указывать?
0
|
silentnuke
|
17.10.2011, 01:03
#5
|
0
|
1 / 1 / 0
Регистрация: 16.10.2011
Сообщений: 69
|
|
17.10.2011, 01:07 [ТС] | 6 |
kravam,
silentnuke, да, p - это следующий элемент Добавлено через 3 минуты именно это и не получается реализовать в функции concatenate
0
|
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
|
|
17.10.2011, 01:17 | 7 |
ну дык, у вас там вечный цикл, кто за вас будет смещать указатель на следующий элемент списка, Страуструп?
0
|
1 / 1 / 0
Регистрация: 16.10.2011
Сообщений: 69
|
|
17.10.2011, 01:24 [ТС] | 8 |
silentnuke, не совсем пойму, где бесконечный цикл, я pop'ом достаю поочередно элементы из списков и push'ем помещаю в новый
0
|
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
|
||||||
17.10.2011, 01:38 | 9 | |||||
да, мой косяк, не обратил что так делаете=)
Добавлено через 8 минут
1
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
17.10.2011, 02:20 | 10 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
silentnuke, дядя, я спрашивал за ПОСЛЕДНИЙ указатель. Куда бы он указывал у меня , я знаю. Куда он должен указывать у ТС- один Бог ведает. может у него закольцованный список.
Но как бы то ни было. Введём:
надписи:
По запуску программы мы не увидим
Но вызовы pop совершенно одинаковы! И даже передаются одинаковые адреса! Почему первый pop отрабатывает нормально, а второй даёт сбой? Делаем предположение: Значит, между вызовами pop меняется СОДЕРЖАНИЕ адресов. Причём меняется АВАРИЙНО так, что второй pop не может сработать. Где находится участок кода, в котором могло бы аварийно поменяться содержание адресов? (И этот участок должен находиться МЕЖДУ вызовами pop) Правильно. Этот участок- сама функция pop. При её первом вызове что-то там нехорошее происходит. Смотрим на функцию pop. Она принимает параметр top, равный top2, проверяем это, пишем так:
Обращаю твоё внимание на одну очень важную вещь: мы убедились, что pop даёт крах при ВТОРОМ вызове, но исследовать будем ПЕРВЫЙ ВЫЗОВ, ибо, как мы поняли, именно в первый раз аварийно меняется содержимое top! (или top2, что то же самое) Итак, пошли в функцию смотреть, что такого происходит с этим адресом:
Введите 1й список q 0 Введите 2й список w 0 top2= 22ff54 top= 22ff54 __*top= 0 top2= 22ff54 wwwwwwwwww top= 22ff54 Ноль! А в следующий вызов pop мы также вызовем её со значением 22ff54. разыменуем и получим 0, с котрого безуспешно будем пытаться взять вот это:
Ввыод: при первом вызове pop НЕПРАВИЛЬНО писать это:
Добавлено через 16 минут В обшем, я с самого начал хотел написать, что нужна функция вывода списка- щас бы проверили. Короче, размышляя так. приходим к выводу, что эти условия неверны:
Добавлено через 3 минуты НУ то есть мы делаем неправильно одно из двух: это
Ну а дальше уж сам сообразишь что менять.
1
|
Android Programmer
141 / 142 / 10
Регистрация: 08.12.2010
Сообщений: 421
|
|
17.10.2011, 03:03 | 11 |
kravam, ошибка была в проверке, выше уже выложил решение.
0
|
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 3
|
||||||
03.11.2011, 17:59 | 12 | |||||
у меня похожая задача, но на Си: напишите программу, выполняющую конкатенацию двух связанных списков символов. программа должна включать функцию concatenate, которой в качестве аргументов передаются указатели на оба списка и она присоединяет второй список к первому.
Вот что я написал:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
03.11.2011, 19:25 | 13 |
Правило перое:
1) ты должен найти данные, на которых твоя программа спотыкается. Правило второе: 2) ты должен упростить их до минимума То есть, допустим программа спотыкается на списках (грубо говоря 2->3->4 3->5 В данном контектсе упростить- значит уменьшить списки до минимума- до одного или двух (естессно, программа должна продолжать виснуть) И потом, если не найдушь ошибку говорить: вот у меня список 1->2 и 1->NULL, не присоединяется ни фига. Согласись, гораздо проще работаь с маленькими данными, нежели с большими? И не говори, что программа всегда не присоединяет. Тут конкретика нужна. Иначе всю эту подготовительную работу дожен будет проделать отвечающий (напрример, я), а меня с некоторых пор стало ломать это делать.
0
|
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 3
|
|
03.11.2011, 19:59 | 14 |
Ок! я просто не знал, только что буквально зарегистрировался на форуме.
В программе все работает, но проблема, мне кажется в функции объединения списков concatenate. функция получает два указателя на начало первого списка (startPtr)и на начало второго списка (startPtr2). Дальше в while я дохожу до конца первого списка, т.е. до указателя последнего узла первого списка, который равен NULL и в if присваиваю ему указатель на начало второго списка: curPtr->nextPtr=startPtr2; Присваивание происходит, т.к.проверял, распечатывается второй список. Т.е., если я правильно понимаю, связывание двух списков произошло. Потом в main запускаю функцию печати списка с параметром указателем на начало списка printList(startPtr) - печатается только первый список, а второй присоединенный -нет! вот в этом и загвоздка. не могу понять почему.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
03.11.2011, 20:07 | 15 |
Чё надо делать, я сказал.
0
|
0 / 0 / 0
Регистрация: 03.11.2011
Сообщений: 3
|
|
04.11.2011, 01:48 | 16 |
хмм.. че то не понятно, что от меня требуется
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
|
|
04.11.2011, 05:45 | 17 |
Правило перое:
1) ты должен найти данные, на которых твоя программа спотыкается. Правило второе: 2) ты должен упростить их до минимума ...А я пока в упор не вижу чё надо вводить чтобы убедиться- да, вот конкантекации не происходит.
0
|
04.11.2011, 05:45 | |
04.11.2011, 05:45 | |
Помогаю со студенческими работами здесь
17
Объединение двух связных списков с объектами одного типа Пересечение и разность односвязных списков Сортировка линейных(односвязных) списков Чем отличается сортировка односвязных списков от сортировки двусвязных? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |