Почему связанный список не печатается в основной функции? - PullRequest
0 голосов
/ 13 апреля 2019

Здесь, в основной функции, функция CreateList создает связанный список, а функция Printlist печатает список.

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

struct Node{
int Element;
struct Node *Next;
};
typedef struct Node *PtrToNode;

void PrintList( PtrToNode L ) {
PtrToNode P = L->Next;
printf("head -> ");

while( P != NULL ) {
printf("%d -> ", P->Element);
P = P->Next;
}
printf("NULL\n");
}

void Insert( int X, PtrToNode P ){
PtrToNode TmpCell = malloc( sizeof( struct Node ) );
TmpCell->Element = X;
TmpCell->Next = P->Next;
P->Next = TmpCell;
}

PtrToNode CreateList(int a[], int n){
int i;
PtrToNode header = malloc( sizeof( struct Node ) );
PtrToNode P= header;
header->Element = -1;
header->Next = NULL;

for(i=0; i<n; i++){
Insert(a[i], P);
P = P->Next;
}

return header;
}

void ReverseList( PtrToNode L1);

void main(){
int data1[]={3,18,7,21,4,14,10,8,12,17};

PtrToNode list = CreateList(data1, 10);

printf("original list: ");PrintList(list);
ReverseList(list);

printf("revsered list: ");PrintList(list);
}


void ReverseList( PtrToNode L1){
int i;
int array[10];

for(i=9; L1->Next != NULL; i--){
L1=L1->Next;
array[i]=L1->Element;
}

L1 = CreateList(array, 10);
printf("revsered list: ");PrintList(L1);

}

Чтобы перевернуть список, я скопировал элементы в массив и перевернул его. Затем создал новый связанный список, вызывающий функцию Createlist. Нет проблем там. Он выводит правильно. Но предполагается напечатать новый список в функции Void main (). Почему это не печать?

1 Ответ

1 голос
/ 13 апреля 2019

Чтобы понять причину, давайте разберем проблему.

основная функция

void main(){
        ...     
        PtrToNode list = CreateList(data1, 10); // this will create the linked list and list will point to the list, let's say ** list contains the address x **.

        ...
        ReverseList(list);// list is passed to the function, ** list has address x **

        printf("revsered list: ");PrintList(list); // list is being printed again, ** what would list contains, ofcourse, x **.
}

обратная функция

   void ReverseList( PtrToNode L1){ // L1 is pointing to list, so far so good.
            ...

            L1 = CreateList(array, 10); // L1 is overitten with address of new list. Now L1 and list in main() are not same anymore.

            printf("revsered list: ");PrintList(L1); // since L1 is new list i.e. a list created with reverse data,  hence it gave the correct output. Thing to note here is that new reverse list L1 and old list(create in main()) has no link and they are independent list.
    }

Как получить желаемый результат?

необходимые изменения в основной функции

void main(){
        ...
        PtrToNode list = CreateList(data1, 10);

        ...
        list  = ReverseList(list); // Update the list pointer with the reverse list.
}

Требуются изменения в функции реверса

PtrToNode  ReverseList( PtrToNode L1); // change funtion to return a list pointer instead of being void.

PtrToNode ReverseList( PtrToNode L1){
       ...
        L1 = CreateList(array, 10);
        ...
        return L1; // return reverse list pointer

}

Предупреждение о спойлере!

Приведенный выше код подвержен утечкам памяти !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...