簡體   English   中英

更改簡單鏈表的頭

[英]Head of a simple linked list changing

大家好,我正在嘗試用C語言實現鏈表

我這樣做是在我的linked_list.h文件中

struct Node{
    void *data;
    struct Node *next;
};
struct LinkedList{
    struct Node* head;
};

和它的執行linked_list.c

struct LinkedList* Create_linked_list(){
    struct LinkedList* linked_list = (struct LinkedList*)malloc(sizeof(struct LinkedList));
    return linked_list;
}

struct Node* Get_last_node(struct LinkedList* linked_list){
    struct Node *temp = linked_list->head;
    while(temp->next != NULL){
        temp = temp->next; 
    }

    return temp;
}

struct Node* Get_node_at(struct LinkedList* linked_list,int position){
    if(position >= get_size(linked_list)){
        return NULL;
    }else{
        struct Node *temp = linked_list->head;
        int i;
        for(i=0;i< position;i++){
            temp = temp->next;
        }
        return temp;
    }
}

void Append_node(struct LinkedList* linked_list,void *data){
    struct Node *new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = data;
    new_node->next = NULL;
    if(linked_list->head == NULL){
        linked_list->head = new_node;
    }else{
        struct Node *last_node = Get_last_node(linked_list);
        last_node->next = new_node;
    }   
}

int get_size(struct LinkedList* linked_list){
    struct Node* temp = linked_list->head;
    int length;
    while(temp != NULL){
        length++;
        temp = temp->next;
    }
    return length;
}


void Delete_linked_list(struct LinkedList* linked_list){
    free(linked_list->head);
    free(linked_list);
}

在我的main.c中

int main(int argc,char *argv[]){
    struct LinkedList *linked_list = Create_linked_list();

    int i;
    for(i=1;i<=10;i++){
        Append_node(linked_list,(void*)&i);
    }
    struct Node *node_n = Get_node_at(linked_list,1);
    printf("%d\n",*(int*)node_n->data);

    Delete_linked_list(linked_list);
    return 0;
}

我有兩個問題:

1)我得到的輸出為11
這意味着在遞歸中頭部正在改變。
這是什么原因呢?

2)是否有必要通過以下方式釋放內存

free(linked_list->head);
  free(linked_list);

或僅free(linked_list); 足夠了?

輸出為11,因為要在每個節點中插入相同的指針,並且它們都指向&i,而后者在for循環后最終到達值11。 如果要將整數1..10存儲到鏈表中,則需要將整數轉換為void *。 這是重寫您的main()函數以執行此操作:

#include <stdint.h>

int main(int argc,char *argv[]){
    struct LinkedList *linked_list = Create_linked_list();

    int i;
    for(i=1;i<=10;i++){
        // Notice: store integer casted to void *
        Append_node(linked_list,(void*)(intptr_t) i);
    }
    struct Node *node_n = Get_node_at(linked_list,1);
    // Notice: cast the void * back to integer.
    printf("%d\n", (int)(intptr_t) node_n->data);

    Delete_linked_list(linked_list);
    return 0;
}

至於刪除問題,不僅需要釋放linked_listlinked_list->head ,還需要釋放鏈表中的每個節點,否則會linked_list->head內存。

void Delete_linked_list(struct LinkedList* linked_list){
    struct Node *p = linked_list->head;

    while (p != NULL) {
        struct Node *next = p->next;
        free(p);
        p = next;
    }

    free(linked_list);
}

首先,您的create函數應類似於:

struct LinkedList* Create_linked_list(){
    struct LinkedList* linked_list = malloc(sizeof(struct LinkedList));
    return linked_list;
}

看看我已經改變了。 您不想為一個指針分配內存,而是為整個結構分配內存,因此它應該是malloc(sizeof(struct LinkedList));

而且,如果您希望函數插入節點(我認為您正在使用自己的追加對象來完成),則應像下面這樣插入頭部:

void insertnode (struct LinkedList* linked_list, void *data){
    struct Node *new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = data;
    new_node->next = linked_list->head;
    linked_list->head = new_node;
}

對於您的刪除功能:

void Delete_linked_list(struct LinkedList* linked_list){
    if(linked_list->head->next){
        Delete_linked_list(linked_list->next);
    }
    else{
       free(linked_list->head);
    }
}

暫無
暫無

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

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