Как да се придвижите назад в свързан списък?

Да кажем, че имам низа „Лампи“, той се предава в моята програма и всеки символ се съхранява във възел в свързан списък.

Трябва да копирам този списък в обратен ред, като използвам друг свързан списък, как да направя това, стигнах доста далеч, но как да се придвижа назад в свързания списък?

Ще видите реда, коментиран какво трябва да поставя там, за да се придвижа назад в свързания списък.

#include <stdlib.h>
#include <stdio.h>

struct NODE {
    struct NODE *next;  
    char data;

};


int main(int argc, char *argv[]) {

int i;

struct NODE *head;
struct NODE *current;
struct NODE *head2;
struct NODE *current2;
struct NODE *finger;


for(i = 0; i < argc; i++)
    printf("arg %d: %s\n", i, argv[i]);

head = (struct NODE*)malloc(sizeof(struct NODE));
    current = head;


    for ( i = 0; i < sizeof(argv[1]) - 1; i++ ) {

    current -> data = argv[1][i];
    current -> next = (struct node*)malloc(sizeof(struct NODE));
    current = current -> next;
    current -> next = NULL;

}


head2 = (struct NODE*)malloc(sizeof(struct NODE));
    current2 = head2;

    while ( current != head) {

        finger = head;


    while (finger -> next != current) 

        finger = finger -> next;
        current2 -> data = current -> data;
        current2 -> next = (struct node*)malloc(sizeof(struct NODE));
        current2 = current2 -> next;    
        // move backwards



    } // ends loop



}






return 0;

}

person Anthony Paliseno    schedule 28.02.2013    source източник


Отговори (2)


Как да се върна назад в (единично) свързания списък?

Вие не го правите. Номерът за обръщане на един списък в друг е вмъкването в началото, а не в задната част на целевия списък. Трябва да преминете през първоначалния си списък по обичайния начин, като следвате указателите next, но вместо да добавяте елементи в края на целевия списък, създайте нов възел и заменете заглавката на целта с него.

Ето илюстрация стъпка по стъпка:

sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer   ^
targetHead -> NULL

sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer          ^
targetHead -> "A" -> NULL

sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer                 ^
targetHead -> "B" -> "A" -> NULL

sourceHead -> "A" -> "B" -> "C" -> NULL
your pointer                        ^
targetHead -> "C" -> "B" -> "A" -> NULL
person Sergey Kalinichenko    schedule 28.02.2013

Кратката версия е да разширите структурата си с предишна променлива, когато създавате дете, вие присвоявате себе си на неговата родителска променлива и по този начин можете по-късно, от детето да прочетете неговата родителска променлива, за да преместите една назад - и рекурсивно, за да получите всички път към върха.

person silentcoder    schedule 28.02.2013