【问题标题】:Head of a simple linked list changing一个简单的链表头变化
【发布时间】:2015-06-27 18:12:50
【问题描述】:

大家好,我正在尝试用 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,因为您将相同的指针插入到每个节点中,并且它们都指向 &amp;i,在 for 循环之后最终值 11。如果要将整数 1..10 存储到链表中,则需要取消引用传入的指针,而不仅仅是存储指针。
  • @JS1 我没有得到这一行需要取消引用你传入的指针
  • 但我不仅要存储int

标签: c linked-list dynamic-memory-allocation


【解决方案1】:

输出为 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-&gt;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);
}

【讨论】:

  • 谢谢,但是我收到了这个警告warning: cast to pointer from integer of different size
  • @Goutam 我修改了我的演员表以包括一个额外的演员表intptr_t,它总是与指针大小相同。使用新代码重试。
【解决方案2】:

首先,你的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);
    }
}

【讨论】:

    猜你喜欢
    • 2013-09-09
    • 2011-09-17
    • 2022-01-01
    • 2011-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多