Рекурсивная функция, которая прилагает конец связанного списка к началу другого и возвращает указатель на начало нового списка

Я испытываю затруднения при выяснении, как иметь возвращение функции "Заголовок" нового списка рекурсивно. Они прилагают очень хорошо, но рекурсивно я не могу выяснить, как "спасти мое место" так сказать.

struct node {
    int value;
    node *next;
};

node* append(node *&L1, node *L2)
{
    if(L1->next == NULL) {
        L1->next = L2;
        return L1;
    }
    else if(L2 == NULL) 
       return L1;
    else 
       return append(L1->next, L2);
}
void main()
{
    node *a, *b, *c, *d;
    a=new node;
    b=new node;
    c=new node;
    d=new node;
    a->value = 4;
    a->next = b;
    b->next = NULL;
    b->value = 7;
    c->next = d;
    c->value = 12;
    d->next = NULL;
    d->value = 8;
    append(a,c);
}
1
nl ja de
Ваше назначение должно написать внедрение связанного списка, потому что иначе необходимо использовать STL с C++ stl:: список
добавлено автор Fantastic Mr Fox, источник
Сразу, проверьте на ПУСТОЙ УКАЗАТЕЛЬ L1 перед dereference, чтобы проверить l1-> затем . Это - самая первая непосредственная ошибка.
добавлено автор WhozCraig, источник
I' m любопытный, почему вы пишете связанные списки как это?
добавлено автор Pubby, источник
Возможно, я должен перефразировать, мне нужен он, чтобы возвратить указатель на первый узел нового списка. Когда я возвращаюсь, например, L1-> стоимость, ценность узла не стоимость, которую я назначил. Я не учел, где я объявил связанный список, так как это довольно не важно. Я могу включить это.
добавлено автор Craig Smith, источник
Я думаю ваш фрагмент кода, поскольку прототип списка ссылок будет работать, поэтому что вы просите?
добавлено автор lai, источник

3 ответы

У рекурсивной функции почти всегда есть два компонента: основной случай и рекурсивный случай. Таким образом, необходимо сначала думать, что те в требовании?

For example, assuming you have two linked list: listA & listB:

  1. base case: when listA has no more element, stop
  2. recursive case: detach last element of listA, attach it to beginning of listB. Call the function again recursively

Из вышеупомянутого псевдо кода у вас должно быть достаточно, чтобы начать программировать

1
добавлено

Среди прочего необходимо объяснить L1, являющийся ПУСТЫМ на начале. К счастью составление его также составляет фактическое, прилагают также.

node *append(node *&L1, node* L2)
{
    if (!L1)
        L1 = L2;
    else
        append(L1->next, L2);
    return L1;
}

, Как Это Работает

Trivial Case (L1 = NULL, L2 = >)

  1. Enter the function; L1 = NULL and L2 = <>
  2. The if(!L1) is satisfied. We assign L2 to L1, and return L1.

Regular Case: (L1 != NULL, L2 = >)

  1. Enter the function; L1 != NULL, L2 = >
  2. The if(!L1) is not satisfied, recurse, sending L1->next, L2
  3. Continue recursing until L1 is NULL (which will be the last next in the list, and is therefore the end), then assign L2 to that L1 pointer (which again, is the last next).
  4. Always return L1 for the result. The final back-out of the recursion will return the head of the list.
1
добавлено
node* append(node *&L1, node *L2)
{
   if (L1 == NULL)
       L1 = L2;
   else if (L1->next != NULL)
       append(L1->next, L2);
   else
       L1->next = L2;

  //Return the head node of the linked list
   return L1;
}
1
добавлено
Потрясающее спасибо, который выглядит подобным тому, что у меня было просто немного щипание!
добавлено автор Craig Smith, источник
pro.cxx
pro.cxx
3 049 участник(ов)

C/C++ chat 0. Простые вопросы, лабы и о IDE — в чат новичков @supapro 1. Не хамим, не переходим на личности, не вбрасываем утверждения без доказательств 2. No Ads, offtop, flood Объявления о вакансиях и евенты - в лс @AlexFails https://t.me/ProCxx/259155

supapro.cxx
supapro.cxx
1 925 участник(ов)

Чат для тех, кто немного знает C++, простые вопросы по реализации, синтаксису и ide – сюда, а для другого есть: /Главный чат по серьезным вопросам — @ProCxx /Чат по обсуждению всего — @fludpac

C++ Russia
C++ Russia
384 участник(ов)

Сообщество разработчиков C++ в Telegram.

cxx.Дискуссионная
cxx.Дискуссионная
298 участник(ов)

это не двач, общайтесь вежливо; разговор на почти любые темы; Не согласны с баном? В лс @AlexFails, @ivario

C++ для маленьких и тупых
C++ для маленьких и тупых
105 участник(ов)

Лоу левел (по среднему IQ участников) чатик ExtremeCode @extremecode Флудилка @extremecode_rest