我是C的新手,我正在尝试编写一个链表,其中每个节点只包含一个int。结构的定义是好的,但我也想编写方法来更新这个链表(在尾部添加元素并删除head元素)。 (我希望能够阅读最近添加的元素)
我写了下面的函数,但我不知道应该在哪里进行免费以及如何实现它。任何人都可以帮我这个吗?
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);
}
答案 0 :(得分:1)
我以这种方式重命名您的数据结构:
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;
}
}
}
答案 1 :(得分:0)
尝试更改*LL = LL->next;
的{{1}}。
然后,您可以拨打Node *nextNode = LL->next;
,然后拨打free(LL)
。
LL = nextNode
然后释放头部的void delete_head(Node *LL){
Node *nextNode = LL->next;
free(LL);
LL = nextNode;
}
并将指针移动到链接列表中的下一个。
答案 2 :(得分:0)
可能是此问题的副本LinkedList - How to free the memory allocated using malloc
基本上你必须将指针存储到你想要删除的节点,否则你会泄漏那个内存,因为代码中的任何地方都没有对该内存位置的引用。
在你的delete_head函数中尝试这个:
节点* temp = LL;
* LL = LL-&gt; next;
自由(LL);
希望这有帮助!
答案 3 :(得分:0)
您需要将链接保存到删除当前节点之前的下一个节点。否则,您将无法引用链接列表的任何节点。现在,当您备份到下一个节点的链接时,可以释放LL指向的当前节点,然后将LL指针指向您之前在临时指针中备份的下一个节点。
Node *temp = LL->next;
free(LL);
LL = temp;