这是我如何将元素添加到链表的头部
//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来将元素添加到链表的尾部
答案 0 :(得分:1)
在addelementfromback
的末尾,temp
是指向列表中最后一个元素的指针。如果您要说temp = element
,这不会更改列表,因为您只是给本地指针一个新值。
temp->next
是存储在对象next
内的temp
变量(即列表中的最后一个元素),您需要将此值更改为指向新元素。
对于Addelement
,temp
是指向新元素的指针,指定指针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;
};