我是C语言的新手,我正在尝试写一个链表,其中每个节点只包含一个int。结构的定义是可以的,但我也想写一些方法来更新这个链表(在尾部添加元素,删除头部元素)。(我想能够阅读最近添加的元素)
我写了下面的函数,但我不知道免费应该在哪里发生,也不知道如何实现。有人能帮我吗?
typedef struct Node{
Node next = NULL;
int number;
} Node;
void add_node(Node *LL,int val){
// add node to the end of the linked list
new_node = (struct Node *)malloc(1*sizeof(struct Node));
new_node->number = val;
Node n = *LL;
while (n.next != NULL){
n = n.next;
}
n.next = new_node;
}
void delete_head(Node *LL){
// update the head
*LL = LL->next;
//free?
}
void update_LL(*LL,int val){
add_node(*LL,val);
delete_head(*LL);
}
我以这种方式重命名您的数据结构:
struct pointer
{
int field;
struct pointer *link;
};
typedef struct pointer cell;
然后我们可以根据您的需要使用此功能:
void ad_an_element_at_the_end_of_the_list()
{
cell *p=NULL;
cell *ptr=head;
int value;
cout<<" Integer number to insert at the end of the list: ";
cin>>value;
p=(cell*)malloc(sizeof(cell));
p->field=value;
p->link=NULL;
if(ptr==NULL)
{
ptr=p;
head=ptr;
}else
{
if(ptr->link==NULL) t
{
ptr->link=p;
head=ptr;
}else
{
while(ptr->link!=NULL)
{
ptr=ptr->link;
}
ptr->link=p;
}
}
}
尝试将*LL = LL->next;
更改为Node *nextNode = LL->next;
。然后您可以调用free(LL)
,然后再调用LL = nextNode
。
void delete_head(Node *LL){
Node *nextNode = LL->next;
free(LL);
LL = nextNode;
}
然后释放头部的Node
,并将指针移动到链表中的下一个。
在删除当前节点之前,您需要保存到下一个节点的链接。否则,您将无法引用链接列表中的任何节点。现在,当您将链接备份到下一个节点时,您可以释放LL指向的当前节点,然后将LL指针分配给您之前在临时指针中备份的下一个结点。
Node *temp = LL->next;
free(LL);
LL = temp;
可能是这个问题的重复LinkedList-如何使用malloc 释放分配的内存
基本上,您必须存储指向要删除的节点的指针,否则您将泄漏该内存,因为代码中的任何位置都没有对该内存位置的引用。
在delete_head函数中试试这个:
节点*temp=LL;
*LL=LL->next;
自由(LL);
希望这能有所帮助!