2016-11-06 4 views
-4

Как изменить мой список?Как отменить мой список на C?

Моя функция печати: перечень печати 0,1,2,3,4,5,6,7,8,9

Но, я хочу: 9,8,7,6,5,4,3 , 2,1,0.

struct Node 
{ 
    TElement Element; 
    Position Next; 
}; 

Position Header(List L) 
{ 
    return L; 
} 

Position Advance(Position P) 
{ 
    return P->Next; 
} 

void PrintList(const List L){ 

    Position P = Header(L); 
    if(IsEmpty(L)) 
     printf("Empty list\n"); 
    else 
    { 
     do 
     { 
      P = Advance(P); 
      printf("%d ", Retrieve(P)); 
     } while(!IsLast(P, L)); 
     printf("\n"); 
    } 
} 

int main() 
{ 
    List L1; 
    Position P; 
    int i; 

    P = Header(L1); 
    for(i = 0; i < 10; i++){ 
     Insert(i, L1, P); 
     P = Advance(P); 
    } 
    printf(" List L1: "); 
    PrintList(L1); 
} 
+1

Что такое 'Header'? Что такое «Advance»? .... –

+0

Подвеска положения (лист L) { возвращение L; } – Henrix

+0

Возможно, вопрос будет лучше: –

ответ

-2
int main() 
{ 
    List L1; 
    Position P; 
    int i; 

    P = Header(L1); 
    for(i = 0; i < 10; i++){ 
     Insert(i, L1, P); 
     P = Advance(P); 
    } 
    printf(" List L1: "); 
    PrintList(L1); 
} 
+0

Этот ответ бессмысленен –

+0

@EdHeal, я не верю, что это ответ, а скорее OP, чтобы предоставить больше его исходного кода. Я добавил его к исходнику в исходном вопросе и переформатировал все. – cdlane

0

Короткий ответ:, так как у вас есть односвязный список и хотите напечатать его в обратном направлении, вам необходимо пройти список сбора элементов в другую структуру (один из приведенных ниже массив), а затем пешком, что назад:

#define LARGE_ENOUGH 1024 

void PrintList(const List L) { 

    if (IsEmpty(L)) { 
     printf("Empty list\n"); 
     return; 
    } 

    Position P = Header(L); 
    TElement Elements[LARGE_ENOUGH]; 
    int i = 0; 

    do { 
     P = Advance(P); 
     Elements[i++] = Retrieve(P); 
    } while (!IsLast(P, L)); 

    while (--i >= 0) { 
     printf("%d ", Elements[i]); 
    } 

    printf("\n"); 
} 

ПРОИЗВОДИТ

> ./a.out 
List L1: 9 8 7 6 5 4 3 2 1 0 
> 

Длинный ответ: я кусочкам недостающие части кода из этого list.h & list.c и сделал несколько изменений по пути:

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

typedef int TElement; 

typedef struct Node *PtrToNode; 
typedef PtrToNode List; 
typedef PtrToNode Position; 

struct Node { 
    TElement Element; 
    Position Next; 
}; 

Position Header(List L) 
{ 
    return L; 
} 

int IsLast(Position P, List L) 
{ 
    return P->Next == NULL; 
} 

int IsEmpty(List L) 
{ 
    return L->Next == NULL; 
} 

Position Advance(Position P) 
{ 
    return P->Next; 
} 

TElement Retrieve(Position P) { 
    return P->Element; 
} 

int FatalError (char *ErrorMessage) { 
    fprintf(stderr, "%s\n", ErrorMessage); 
    exit(1); 
} 

void Insert(TElement X, List L, Position P) { 
    Position TmpCell = malloc(sizeof(struct Node)); 

    if (TmpCell == NULL) { 
     FatalError("Out of space!"); 
    } 

    TmpCell->Element = X; 
    TmpCell->Next = P->Next; 
    P->Next = TmpCell; 
} 

#define LARGE_ENOUGH 1024 

void PrintList(const List L) { 

    if (IsEmpty(L)) { 
     printf("Empty list\n"); 
     return; 
    } 

    Position P = Header(L); 
    TElement Elements[LARGE_ENOUGH]; 
    int i = 0; 

    do { 
     P = Advance(P); 
     Elements[i++] = Retrieve(P); 
    } while (!IsLast(P, L)); 

    while (--i >= 0) { 
     printf("%d ", Elements[i]); 
    } 

    printf("\n"); 
} 

int main() { 
    List L1 = calloc(1, sizeof(struct Node)); 

    Position P = Header(L1); 

    for (int i = 0; i < 10; i++) { 
     Insert(i, L1, P); 
     P = Advance(P); 
    } 

    printf(" List L1: "); 
    PrintList(L1); 
} 

Выше на благо других людей, которые могли бы хотели взломать ответ на свой вопрос.