Глава простого связанного списка изменение
Здравствуйте, ребята, я пытаюсь реализовать связанный список на языке Си
Я делаю так в моем 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);
}
И в моем основном.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("%dn",*(int*)node_n->data);
Delete_linked_list(linked_list);
return 0;
}
У меня есть два вопроса:
1) я получаю результат в виде 11
Это означает, что голова меняется в рекурсии.
В чем причина этого?
2) Необходимо ли освободить память с помощью
free(linked_list->head);
free(linked_list);
Или только free(linked_list);
является достаточно?
2 ответа:
Вывод 11, потому что вы вставляете один и тот же указатель в каждый узел, и все они указывают на &i, который заканчивается значением 11 после цикла for. Если вы хотите хранить целые числа 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); } }