2017-10-01 15 views
1

deleteList()機能を使用してリストを削除しても、 のリンクリストを練習していましたが、私のコードではprintList()の機能が残ります。削除関数宣言や関数呼び出しで問題がありますか?main()printList()関数に何かエラーがありますか?リンクされたリストを削除した後もまだ印刷中です

私はインターネットを検索し、チュートリアルサイトからもコードを試しました。

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

typedef struct node { 
    int data; 
    struct node *next; 
} node; 

void deleteList(node **head); 
void printList(node *head); 

int main(void) { 
    node *prev, *head, *p; 
    head = NULL; 

    for (int i = 0; i < 5; i++) { 
     p = malloc(sizeof(node)); 
     printf("Enter number\n"); 
     scanf("%i", &p->data); 
     p->next = NULL; 
     if (head == NULL) 
      head = p; 
     else 
      prev->next = p; 
     prev = p; 
    } 
    deleteList(&head); 
    printList(head); 
    free(p); 
    return 0; 
} 

void printList(node *head) { 
    if (head == NULL) { 
     printf("\nNULL\n"); 
    } else { 
     printf("\n%i", head->data); 
     printList(head->next); 
    }   
} 

void deleteList(node **head) { 
    node *cur = *head; 
    node *nxt; 

    while (cur != NULL) { 
     nxt = cur->next; 
     free(cur); 
     cur = nxt; 
    } 
    *head = NULL;  
} 
+2

:ここ

は改良版ですか?それは私のためにnullを表示しています –

+0

deleteListeを追加した後にコードを再度コンパイルしましたか? –

+1

'free(p);'は空き(最後に割り当てられた 'p'値がリストの一部として格納されているように)倍に見え、UBを引き起こします。 'p'をローカルにしてループさせるべきです。 – VTT

答えて

0

あなたのコードほとんどが正しいです:

  • ノードがすでにdeleteList()によって解放されるため、未定義の動作を引き起こしmain()の最後に余分なfree(p);があります。
  • 戻り値がmalloc()およびscanf()であることを確認して、メモリの割り当てが失敗した場合、または入力ストリームから整数を変換できない場合の未定義の動作を回避する必要があります。

これらの問題とは別に、コードは常にリストを解放した後にNULLを出力する必要があります。あなたは必ず

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

typedef struct node { 
    int data; 
    struct node *next; 
} node; 

void deleteList(node **head); 
void printList(const node *head); 

int main(void) { 
    node *head = NULL; 
    node *prev = NULL; 

    for (int i = 0; i < 5; i++) { 
     node *p = malloc(sizeof(node)); 
     if (p == NULL) 
      return 1; 
     printf("Enter number\n"); 
     if (scanf("%i", &p->data) != 1) 
      return 1; 
     p->next = NULL; 
     if (head == NULL) 
      head = p; 
     else 
      prev->next = p; 
     prev = p; 
    } 
    deleteList(&head); 
    printList(head); 
    return 0; 
} 

void printList(const node *head) { 
    if (head == NULL) { 
     printf("NULL\n\n"); 
    } else { 
     printf("%i\n", head->data); 
     printList(head->next); 
    } 
} 

void deleteList(node **head) { 
    node *cur = *head; 

    while (cur != NULL) { 
     node *nxt = cur->next; 
     free(cur); 
     cur = nxt; 
    } 
    *head = NULL;  
} 
関連する問題