c-创建一个链表来实现一个队列



我是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);

希望这能有所帮助!

相关内容

  • 没有找到相关文章

最新更新