我已经实现了如下链接列表,
struct node
{
int data;
node* next;
};
void initNode(node* head, int data)
{
head->data = data;
head->next = NULL;
}
void addNode(node* linkList, int data)
{
node* newnode = new node;
newnode->data = data;
newnode->next = NULL;
while (linkList)
{
if (linkList->next == NULL)
{
linkList->next = newnode;
return;
}
linkList = linkList->next;
}
}
void insertFrontNode(node* linkList, int data)
{
node* newnode = new node;
newnode->data = data;
newnode->next = linkList;
linkList = newnode;
}
void DisplayLinkList(struct node* linkList)
{
int i = 1;
while (linkList)
{
cout << "Linklist(" << i << ") " << linkList->data << endl;
linkList = linkList->next;
i++;
}
}
int main()
{
node* linkList =new node;
initNode(linkList, 5);
addNode(linkList, 10);
addNode(linkList, 30);
insertFrontNode(linkList, 12);
DisplayLinkList(linkList);
cin.get();
return 0;
}
我的问题是,当我在initNode中初始化linklist或在addNode中添加节点时,更改会反映在我通过参数传递的linkst指针中。但如果我在insertFrontNode中添加节点infront,则更改不会反映在linklist指针中。
为什么呢?有什么区别?
答案 0 :(得分:1)
您可能会发现在列表周围添加列表(slist,单链表)结构会有所帮助(并使两者都添加到头部并添加尾部O(1)操作)。
struct node
{
int data;
node* next;
};
struct slist
{
node* head;
node* tail;
};
void addHead(slist* linkList, int data)
{
//new list node
node* newnode = new node;
newnode->data = data;
newnode->next = NULL;
newnode->next = linkList->head;
linklist->head = newnode->next;
}
void addTail(slist* list, int data)
{
//new list node
node* newnode = new node;
newnode->data = data;
newnode->next = NULL;
if( list->tail ) {
list->tail->next = newnode;
}
list->tail = newnode;
}
void DisplayLinkList(struct slist* linkList)
{
int i = 1;
node* link = linklist->head;
while (link)
{
cout << "Linklist(" << i << ") " << link->data << endl;
link = link->next;
i++;
}
}
int main()
{
slist* linkList=new slist;
addTail(linkList, 5);
addTail(linkList, 10);
addTail(linkList, 30);
addHead(linkList, 12);
DisplayLinkList(linkList);
return 0;
}
答案 1 :(得分:1)
你做得很好。你正在修改链表的头部,但是没有将它更新到你的外部世界。因此,当你调用DisplayLinkList时,它会被旧的头指针调用,这就是改变没有反映的原因。检查以下代码:
void insertFrontNode(node** linkList, int data)
{
node* newnode = new node;
newnode->data = data;
newnode->next = *linkList;
*linkList = newnode;
}
int main()
{
node* linkList = new node;
initNode(linkList, 5);
addNode(linkList, 10);
addNode(linkList, 30);
insertFrontNode(&linkList, 12);
DisplayLinkList(linkList);
cin.get();
return 0;
}
上面的代码,不仅添加前面的节点,还更新头指针,使显示功能获得新的更新头指针。