C 一个简单链表的头

C 一个简单链表的头,c,linked-list,dynamic-memory-allocation,C,Linked List,Dynamic Memory Allocation,大家好,我正在尝试用C语言实现链表 我在我的linked_list.h文件中这样做 struct Node{ void *data; struct Node *next; }; struct LinkedList{ struct Node* head; }; 以及它的实现 struct LinkedList* Create_linked_list(){ struct LinkedList* linked_list = (struct LinkedList*)ma

大家好,我正在尝试用C语言实现链表

我在我的linked_list.h文件中这样做

struct Node{
    void *data;
    struct Node *next;
};
struct LinkedList{
    struct Node* head;
};
以及它的实现

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);
}

或仅
免费(链接列表)足够了吗?

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

首先,您的
create
函数应该如下所示:

struct LinkedList* Create_linked_list(){
    struct LinkedList* linked_list = malloc(sizeof(struct LinkedList));
    return linked_list;
}
看看我改变了什么。您不希望为指针分配内存,而是为整个结构分配内存,因此,它应该是
malloc(sizeof(struct LinkedList))

如果您想让函数插入节点(我认为您是在使用append进行插入),则应在头部插入如下内容:

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);
    }
}

输出是11,因为您将相同的指针插入到每个节点中,并且它们都指向
&i
,在for循环之后的值为
11
。如果要将整数1..10存储到链表中,则需要取消引用传入的指针,而不仅仅是存储指针。@JS1我没有得到此行,需要取消引用传入的指针,但我不仅要存储
int
谢谢,但是我得到了这样一个警告:从不同大小的整数转换到指针
@Goutam我修改了我的转换,以包括一个额外的转换到
intptr\t
,它总是与指针大小相同。请使用新代码重试。
struct LinkedList* Create_linked_list(){
    struct LinkedList* linked_list = malloc(sizeof(struct LinkedList));
    return linked_list;
}
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);
    }
}