删除链接列表中的元素

时间:2018-04-19 15:18:20

标签: c singly-linked-list

这出现在关于算法和数据结构的旧考试之一上。看起来很简单,但我需要一些帮助才能理解它的工作原理。

目标是仅使用指向头部的指针从单个链接列表中删除某些原子。

原子的结构是:

struct at {
 int element;
 struct at *next;
};
typedef struct at atom;

解决方案是:

void delete(atom **head)
{
  while((*head)){
    if((*head)->element%2){ /*just a condition for deleting*/
      (*head)=(*head)->next; /*deleting the atom*/
    } else {
       head= &(*head)->next; 
    }
   }
 }

我的理解是,在这个功能中," * head"是实际的头(指向第一个原子的指针)和"头"是指向实际头部的指针。显然,由于我实际上会改变列表的头部和内容,我需要将指针传递给头部。

我无法理解head =&(* head) - > next似乎有效。我试过把它放在纸上,但仍然无法理解它。它怎么不改变任何东西,只是跳到下一个原子?

1 个答案:

答案 0 :(得分:1)

正如你所说private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) { if (checkedListBox1.GetItemCheckState(0)==CheckState.Checked) { richTextBox1.Font = new Font(richTextBox1.Font, FontStyle.Bold); } } 是实际的头部(指向第一个原子的指针)而*head是指向实际头部的指针。声明head 我们正在使用实际头节点旁边的节点地址更新head= &(*head)->next;(其中包含实际头部的地址)。

现在head是一个指针,它将头部的地址存储到下一个节点而不是头节点,即下一个原子。

考虑一个列表 1→2→3→4-→5

在这种情况下,最初head包含地址节点1,* head是节点1本身。 现在当我们说head时,它意味着head= &(*head)->next;将存储节点2的地址。如果我们将head它将返回节点2.