簡體   English   中英

C 中的鏈表不打印

[英]Linked list in C is not printing

我認為它沒有打印,因為我沒有正確插入列表。 我看到大多數人在循環外分配空間,但我不確定情況是否如此。

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

typedef struct intList {
    int number;
    struct intList *next;
} INT_LIST;

int main() {
    INT_LIST *start = NULL, *temp;
    INT_LIST *trvPtr = start;
    /* Insert into list */
    while (temp->number != 0) {
        temp = malloc(sizeof(INT_LIST));
        printf("Enter your integer: ");
        scanf("%d", &(temp->number));
        temp->next = start;
        start = temp;
    }
    printf("List is: \n");
    while (trvPtr != NULL) {
        printf("%d", trvPtr->number);
        trvPtr = trvPtr->next;
    }
    return 0;
}

temp未初始化並指向垃圾。 檢查temp->number != 0是未定義的行為。

您可以使用 do/while 循環解決此問題。 循環將始終運行一次。 分配temp ,設置它,然后檢查。

    INT_LIST *start = NULL, *temp;
    do {
        temp = malloc(sizeof(INT_LIST));
        printf("Enter your integer: ");
        scanf("%d", &(temp->number));
        temp->next = start;
        start = temp;
    } while(temp->number != 0);

請注意,您的列表將始終以 0 值開頭。為避免這種情況,請在執行任何其他操作之前檢查輸入。 使用while(1)進行無限循環,使用break結束循環。

    INT_LIST *start = NULL;
    while(1) {
        int input;
        printf("Enter your integer: ");
        scanf("%d", &input);
        if(input == 0) {
            break;
        }

        INT_LIST *temp = malloc(sizeof(INT_LIST));
        temp->number = input;
        temp->next = start;

        start = temp;
    }

打印時, trvPtr永遠是 NULL; 它不會跟蹤更改以start 您必須將其分配給start的新值。

    printf("List is: ");
    INT_LIST *trvPtr = start;
    while (trvPtr != NULL) {
        printf("%d ", trvPtr->number);
        trvPtr = trvPtr->next;
    }
    puts("");

請注意,您不限於在 function 的開頭聲明所有變量。

我對您的代碼進行了一些修改/更正,以下應該有效 -

正確的代碼 -

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

typedef struct intList {
    int number;
    struct intList *next;
} INT_LIST;

int main() {
    INT_LIST *start = NULL, *temp;
    temp = (INT_LIST*)malloc(sizeof(INT_LIST));
    INT_LIST *trvPtr = temp;
    /* Insert into list */
    do {
        
        printf("Enter your integer: ");
        scanf("%d", &(temp->number));
        start = temp;
        temp->next = (INT_LIST*)malloc(sizeof(INT_LIST));
        temp = temp->next;
        
    }while (start->number != 0);
    temp->next=NULL;

    printf("List is: \n");
    while (trvPtr->next != NULL) {
        printf("%d", trvPtr->number);
        trvPtr = trvPtr->next;
    }
    return 0;
}

樣本 OUTPUT:

Enter your integer: 1
Enter your integer: 2
Enter your integer: 3
Enter your integer: 0
List is:
1230

如果您不想打印 0,請在第一個 while 循環結束后立即包含temp = start


解釋:

  1. 首先,在您的代碼中,您沒有為temp分配任何東西。 它應該已經分配了空間並首先分配了一些東西,否則語句temp->number != 0只是未定義的行為。

  2. 接下來,我使用start來檢查用戶輸入的最后一個值。 如果為 0,循環將中斷。 請注意,我已將循環轉換為do-while循環,因為start是 NULL。

  3. 最后,一旦循環結束,我將 next of temp 設置為 null 以便打印循環正確執行。 在您的代碼中,這部分也有錯誤,因為您已將 NULL 分配給trvPtr但從未更改該值。 因此,在您的情況下,循環永遠不會執行。

注意:在使用 malloc 時,最好明確提及轉換類型。某些編譯器會給出警告/錯誤。 所以,無論你在哪里使用malloc() ,我都修改了它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM