向链表添加元素的区别

时间:2013-02-03 17:46:35

标签: c++ pointers linked-list

这是我如何将元素添加到链表的头部

 //typedef void* VoidPtr
 //typedef node* NodePtr
 struct Node
   {
       NodePtr next
       VoidPtr data
   };


void LinkedList::Addelement(VoidPtr horoscope)
{
    if(head == NULL)
  {

    head = new Node;
    head->data = horoscope;
     head->next = NULL;

  }

NodePtr temp = new Node;

temp -> data = horoscope;
temp -> next = head;

head = temp;
}

这是我如何将元素添加到链表的尾部

void LinkedList::addelementfromback(VoidPtr horoscope)
{
   NodePtr temp=head;

   if(head == NULL)
   {

    head = new Node;
    head->data = horoscope;
    head->next = NULL;

   }

   while( temp->next != NULL)
   {
      temp=temp->next

   }

   NodePtr element=New Node;
   element->data=horoscope;
   element->next=NULL;

    temp->next=element;



}

我不明白为什么我们使用temp = element来添加到链表的头部 但是为了添加到链表的尾部,我们使用temp-> next = element。我不明白为什么我们不能使用temp = next来将元素添加到链表的尾部

2 个答案:

答案 0 :(得分:1)

addelementfromback的末尾,temp是指向列表中最后一个元素的指针。如果您要说temp = element,这不会更改列表,因为您只是给本地指针一个新值。

然而,

temp->next是存储在对象next内的temp变量(即列表中的最后一个元素),您需要将此值更改为指向新元素。

对于Addelementtemp是指向新元素的指针,指定指针head指向同一元素,并更改此内的next变量指向原始头部的指向元素。

答案 1 :(得分:1)

Addelement方法中,您需要else子句,因为如果列表为空(head == NULL),则只需将head指向新节点。没有别的,列表中没有其他节点。

此外,请考虑使用模板,而不是使用 void指针。模板非常适用于数据类型发生变化的数据结构和算法,而不是结构或算法,例如堆栈和链接列表。

我建议您考虑将节点指针与数据项分离为两个单独的结构。这将帮助您在单个链接列表和双向链接列表之间使用公共代码。当您不想使用模板时,这也是一个很好的帮助。

struct Node_Link
{
    Node_Link * next;
};

struct Node_Integer
: public Node_Link
{
    int data;
};

struct Node_Double
: public Node_Link
{
   double data;
};

struct Node_String
: public Node_Link
{
    std::string data;
};