创建链接列表以实现队列

时间:2014-10-07 15:53:11

标签: c linked-list

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

4 个答案:

答案 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;