C++ 在链接列表前面添加节点
我已经实现了如下链接列表:C++ 在链接列表前面添加节点,c++,data-structures,C++,Data Structures,我已经实现了如下链接列表: 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 = d
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中添加node时,更改会反映在我通过参数传递的linkst指针中。但是,如果我在insertFrontNode中添加前面的节点,更改不会反映在链接列表指针中
为什么??区别是什么?您可能会发现,在列表周围添加一个列表列表、单链链表结构将有助于执行“头添加”和“尾添加”操作
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;
}
您做得很好。您正在修改链接列表的标题,但没有将其更新到外部世界。因此,当您调用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;
}
在上面的代码中,不仅在前面添加节点,还更新头指针,以便显示函数获得新的更新头指针。不同之处在于,在insertFrontNode中执行的更改本质上不会反映在列表的原始头节点中。整个问题是,列表将有一个新的头节点,但是您不提供新的头节点指针返回给调用方的方法。您应该添加C++ TAG。C++不一定。但是在C中,所有引用节点都应该是结构节点,以避免引发错误未知类型名称NOD.所发布的代码包含关键字CIN和新的和CUT和EnDL,这些代码只在C++中被识别,所以请删除“C”标签并添加“C++ TAGIN C”,参数通过值传递,因此,更改参数对调用方的变量没有影响。需要传递参数的地址,并且由于参数已经是指针,因此在函数参数列表中的被调用函数use**中。在C++中,通过引用传递参数,而不是通过“谢谢”的地址来传递参数。但是,我也不会在addNode函数中返回linklist。但在主要情况下,当我调用addNode时,我会在链接列表中添加新节点。那么为什么它没有进入insertFrontNode呢因为您没有在addNode中修改链接列表的标题,所以它起了作用。。