2013-09-08 3 views
1

Моего входного файлаперебрать связанный список и распечатать каждое значение на экране C

1 

2 

3 

4 

5 

И мой вывод должен выглядеть

1 -> NULL 

2 -> 1 -> NULL 

3 -> 2 -> 1 -> NULL 

4 -> 3 -> 2 -> 1 -> NULL 

5 -> 2 -> 3 -> 2 -> 1 -> NULL 

Это моя функция

void printList(Node* first) 
{ 
    Node *temp; 
    temp=first; 

    printf("elements in linked list are\n"); 
    while(temp!=NULL) 
    { 
     printf("%d -> NULL\n",temp->value); 
     temp=temp->next; 
    } 
} 

И это полная программа

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

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

Node* createNode(int data); 
Node* insertFront(Node* first, Node* newNode); 
void printList(Node* first); 
void deleteList(Node* first); 

int main(int argc, const char **argv) 
{ 
    int numItems, ch; 
    FILE *fp; 

    numItems = 0; 

    fp = fopen(argv[1], "r"); 
if(fp == NULL) 
{ 
    fclose(fp); 
    return -1; 
} 

    while ((ch = getc(fp)) != EOF) 
    { 
     if (ch = '\n') numItems++; 
    } 
    fclose(fp); 

    Node *first = NULL; 
    Node *newNode; 
    Node *Next; 

    int i; 

    for(i = 1; i <= numItems; i++) 
    { 
     newNode = createNode(i); 
     first = insertFront(first, newNode); 
    } 

    printList(first); 
    deleteList(first); 

    return 1; 
} 

Node* createNode(int data) 
{ 
    Node *newNode; 

    newNode = malloc(sizeof(Node)); 

    newNode -> value = data; 

    newNode -> next = NULL; 

    return newNode; 
} 

Node* insertFront(Node* first, Node* newNode) 
{ 
    if (newNode == NULL) { 
     /* handle oom */ 
    } 

    newNode->next=NULL; 

    if (first == NULL) { 
     first = newNode; 
    } 

    else { 
     Node *temp=first; 

     while(temp->next!=NULL) 
     { 
      temp = temp->next; 
     } 

     temp->next=newNode; 

     first = newNode; 
    } 

    return first; 
} 

void printList(Node* first) 
{ 
    Node *temp; 
    temp=first; 

    printf("elements in linked list are\n"); 
    while(temp!=NULL) 
    { 
     printf("%d -> NULL\n",temp->value); 
     temp=temp->next; 
    } 
} 

void deleteList(Node* first) 
{ 
    Node *temp; 
    temp=first; 
    first=first->next; 
    temp->next=NULL; 
    free(temp); 
} 

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

+2

Итак, что ошибки вы получаете? –

+0

Поскольку вы испытываете трудности с чтением этого файла (который никогда не проверяется на наличие открытого успеха), возможно, сохранение его содержимого в вашем списке было бы возможно. – WhozCraig

+0

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

ответ

1

У вас есть несколько ошибок. Поскольку это учебное задание, я бы описал ошибки, а не исправлял ваш код:

  • Вы печатаете -> NULL для каждого элемента; вы должны печатать его только после завершения цикла. Другими словами, отдельные строки должны использовать формат "%d -> ", а затем после цикла вы должны напечатать "NULL\n".
  • Ваш deleteList неправилен: вам нужен цикл там, похоже на то, что у вас есть в printList
  • Ваш способ создания списка выглядит подозрительно: вместо чтения файла, вы считать строки, а затем создать список 0 , 1, 2, ... на основе строки счет. Вы должны прочитать данные из файла в свой список; вы можете сделать это в том же цикле, который делает подсчет, потому что связанным спискам не нужно знать их длину вверх.
0

Если вы хотите распечатать, чтобы выглядеть, как, например, вы показали, вы должны изменить void printList(Node* first) на что-то вроде этого:

while(temp!=NULL) 
{ 
    if(temp->next) 
     printf("%d ->",temp->value); 
    else 
     printf("%d -> NULL\n",temp->value); 
    temp=temp->next; 
} 
0

Для того, чтобы сформировать стек правильно и обеспечить надлежащее удаление при необходимости, необходимо устранить проблемы, упомянутые в ответе dasblinkenlight. Как только это будет сделано, ваш конкретный вопрос, как печатать на выходе по желанию:

1->NULL 
2->1->NULL 

и так далее, лучше всего решать с помощью рекурсивного вызова:

void printList (Node* stack) { 

    Node* pCur = stack; // you could just use stack, you don't have to have pCur 

    if (pCur) {   
     printList (pCur->next);    
     while (pCur->next) { 
      printf ("%d->", pCur->value) 
      pCur = pCur->next; 
     } 
     printf ("%d->NULL\n", pCur->value); 
    } 
    return; 
}