[英]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_list
和linked_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.