一个简单链表的头改变
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
表示递归中head在变化
这是什么原因?
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_list
和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);
}
}
大家好我正在尝试用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
表示递归中head在变化
这是什么原因?
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_list
和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);
}
}