Объединить два отсортированных списка ссылок

Я хотел объединить два отсортированных списка ссылок с помощью манипуляции указателем, но застрял на этом этапе. не могу найти ошибку. Помоги мне, пожалуйста. Я думаю, что проблема в то время как цикл. Я хочу сделать это эффективным и не хочу делать еще один список.

#include
#include
using namespace std;
struct s
{
   int info;
   s *next;
};

int main()
{
    int i;
    char choice = 'y';
    s *ptr1, *ptr2, *start1, *start2, *reversedHead, *temp;
    ptr1= new s;
    start1=ptr1;
    coutnext;
                                 ptr2->next=temp;
                             }
                         }
    }
    if(ptr1->next==NULL)
                    ptr1->next=ptr2;
    else
        ptr2->next=ptr1;
    coutstart2->info)
    {
                             ptr2=start2;
                             while(ptr2!=NULL){
                                              cout
 cheeseRoot12 нояб. 2012 г., 15:35
Я хочу сделать так, чтобы списки объединялись таким образом, чтобы, если в списке содержалось 3 и 5, а во втором - 4 и 6, то если во втором списке встречалось 4, то его следует вставить в первом списке между 3 и 5. и, следовательно, результат должен выглядеть как 3->4->5->6->NULL (без использования дополнительной памяти узла).
 cheeseRoot12 нояб. 2012 г., 15:29
я не использовал std :: list :: merge (), потому что мне нужно было узнать о слиянии и указателях.
 cheeseRoot12 нояб. 2012 г., 15:27
ВХОДЫ> 3,5 в первом списке, 4,6 во втором списке. OUTPUT (ожидается) ->3,4,5,6 Но исполнение просто внезапно заканчивается.
 Rook12 нояб. 2012 г., 15:17
Было бы полезно, если бы вы предоставилимы попробовали в вашем приложении, результат, который вы получили, и результат, который вы ожидали. Кроме того, есть ли какая-то конкретная причина, по которой вы не используете?std::list
 Gorpik12 нояб. 2012 г., 15:22
Если вы просто пытаетесь получить работающий код, используйтеstd::list а затем использовать методstd::list::merge(); быстро и просто. Если у вас есть другая причина для этого (например, обучение), у вас будет более конкретный, чем простоэто нет работа.
 Luchian Grigore12 нояб. 2012 г., 15:15
Какие'проблема именно? Вы пробовали отладку?

Ответы на вопрос(2)

Решение Вопроса

Ваше условие цикла while не совсем верно.

while(ptr1->next!=NULL || ptr2->next!=NULL)

хорошо, нотолько когда оба списка имеют одинаковую длину!. Когда списки имеют разную длину, либоptr1->next или жеptr2->next будетNULL, и ты'Я получу ошибку сегментации. Меняется на&& это не правильно, потому что выпотеряю конец одного из ваших списков!

Использовать этот:

while((ptr1 != NULL && ptr2 != NULL) && (ptr1->next!=NULL || ptr2->next!=NULL))

Теперь внутри вашего цикла у вас есть такие тесты:

if(ptr1->next->info < ptr2->info)

замени это

if(ptr1 != NULL && ptr1->next->info < ptr2->info)

так что неравные списки длины нене заканчивать рано и неСегфо внутри.

Затем, внутри ваших операций вставки, вы делаете такие вещи, как

ptr1=temp;
ptr1=ptr1->next

а также

ptr2=temp;
ptr2=ptr2->next;

Это плохо, потому чтоtemp не определено, так как вы никогда не записываете в него действительные данные! Ошибка здесь в том, что ваши задания неверны. Вы должны были сделатьtemp=ptr1 а такжеtemp=ptr2 соответственно.

Наконец, ваша операция очистки для исправления списков ввода одинаковой длины должна учитывать тот факт, что списки ввода неравной длины могут привести кptr1 или жеptr2 быть:NULL

if(ptr1 != NULL && ptr1->next==NULL)
    ptr1->next=ptr2;
else if (ptr2 != NULL)
    ptr2->next=ptr1;

И все вроде бы хорошо. Я'мы проверили полученный код,1 3 52 4 6 а также ,1 32 а также ,1 42 3 а также ,1 32 3 и все работают как яЯ ожидал их.

 cheeseRoot12 нояб. 2012 г., 20:08
Спасибо. :) помощь оценена.
 cheeseRoot12 нояб. 2012 г., 15:39
Дерьмо. Как я мог не заметить такую ошибку. спасибо @ рук :) :п
 Rook12 нояб. 2012 г., 16:37
@SudhanshuSingh сделано. Были еще 3 проблемы, которые я нашел ;-)
 cheeseRoot12 нояб. 2012 г., 15:39
ПЕРВЫЙ СПИСОК-> 3,5 ВТОРОЙ СПИСОК-> 4,6 Теперь выходной 3->4->5 (не 6) :( :(

Не проверял все это, но давайте начнем здесь:

 while(ptr1->next!=NULL || ptr2->next!=NULL)

Так должно быть&& и не|| поскольку вы не хотите продолжать сравнение, когда следующая запись в одном из списков равна нулю (вы используете ее содержимое в одном из if в цикле while)

 cheeseRoot12 нояб. 2012 г., 15:31
о да Благодарю. Но казнь все равно резко останавливается.
 giorashc12 нояб. 2012 г., 15:39
я посоветую вам использовать отладчик, а также посмотреть на @Rook 'ответ

Ваш ответ на вопрос