0

这就是我将元素添加到链表头部的方式

 //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。我不明白为什么我们不能使用 while temp=next 将元素添加到链表的尾部

4

2 回答 2

1

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

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

因为Addelement,temp是一个指向新元素的指针,你将指针赋给指向head同一个元素的指针,并将next这个指向元素内部的变量更改为指向原来的头。

于 2013-02-03T18:49:25.537 回答
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;
};
于 2013-02-03T18:57:55.120 回答