簡體   English   中英

C中實現LinkedList

[英]Implementing LinkedList in C

我為我的學校作業實現了一個鏈表,但是當我嘗試打印出一個節點的值時,第一個節點總是打印出 memory 地址,我不明白為什么會這樣。

我嘗試調試,當我將列表的尾部分配給新節點時,節點的值被打印為 memory 地址。

為什么會這樣?

int AppendLinkedList(LinkedListPtr list, int value) {
    LinkedListNodePtr newNode = CreateLinkedListNode(value);
    if (list->head == NULL) {
        list->head = newNode;
        list->tail = newNode;
        
        return 0;
    }
    LinkedListNodePtr tailCopy = list->tail;
    newNode->prev = tailCopy;
    tailCopy->next = newNode;
    list->tail = newNode;
    return 0;
}

LinkedListNode *CreateLinkedListNode(int data) {
    LinkedListNodePtr newNode;
    newNode = (LinkedListNodePtr)malloc(sizeof(LinkedListNode));
    newNode->data = data;
    printf("%d\n", data);
    return newNode;
}

int main() {
    LinkedListPtr list = CreateLinkedList();
    int data = 5;
    AppendLinkedList(list, data);
}

typedef struct ll_node {
    int           data;       // Data this node holds 
    struct ll_node *next;     // next node in list, or NULL
    struct ll_node *prev;     // prev node in list, or NULL
} LinkedListNode, *LinkedListNodePtr;

typedef struct ll_head {
    uint64_t          num_elements;  //  # elements in the list
    LinkedListNodePtr head;  // head of linked list, or NULL if empty
    LinkedListNodePtr tail;  // tail of linked list, or NULL if empty
} *LinkedListPtr;

LinkedListPtr CreateLinkedList() {
    LinkedListPtr list;
    list = (LinkedListPtr)malloc(sizeof(LinkedListPtr));
    if (list == NULL) {
        return NULL;
    }
    return list;
} 

您的代碼中存在多個問題:

  • 您沒有在CreateLinkedListNode()中將prevnext成員初始化為NULL

  • CreateLinkedList()中的分配大小不正確:您應該使用:

    鏈表 *list = malloc(sizeof(*list));

並且您應該將成員num_elements初始化為0並將headtail初始化為NULL

  • 定義順序不對,header文件丟失。

  • AppendLinkedList()不更新num_elements

更一般地說,將指針隱藏在 typedef 后面很容易出錯。 使用顯式指針語法,代碼更具可讀性。

這是修改后的版本:

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

typedef struct ll_node {
    int data;                // Data this node holds 
    struct ll_node *next;    // next node in list, or NULL
    struct ll_node *prev;    // prev node in list, or NULL
} LinkedListNode;

typedef struct ll_head {
    uint64_t num_elements;   // # elements in the list
    LinkedListNode *head;    // head of linked list, or NULL if empty
    LinkedListNode *tail;    // tail of linked list, or NULL if empty
} LinkedList;

LinkedList *CreateLinkedList() {
    LinkedList *list = malloc(sizeof(*list));
    if (list != NULL) {
        list->num_elements = 0;
        list->head = NULL;
        list->tail = NULL;
    }
    return list;
} 

LinkedListNode *CreateLinkedListNode(int data) {
    LinkedListNode *newNode = malloc(sizeof(*newNode));
    if (newNode != NULL) {
        newNode->data = data;
        newNode->prev = NULL;
        newNode->next = NULL;
    }
    return newNode;
}

int AppendLinkedList(LinkedList *list, int value) {
    if (list == NULL)
        return -1;

    LinkedListNode *newNode = CreateLinkedListNode(value);
    if (newNode == NULL)
        return -1;

    if (list->head == NULL) {
        list->head = newNode;
    } else {
        LinkedListNode *tail = list->tail;
        newNode->prev = tail;
        tail->next = newNode;
    }
    list->tail = newNode;
    list->num_elements += 1;
    return 0;
}

int main() {
    LinkedList *list = CreateLinkedList();
    int data = 5;
    AppendLinkedList(list, data);
}

暫無
暫無

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

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