#include <iostream>
#include <cstdlib>
using namespace std;
typedef struct node{
int size;
char* name;
node* next;
}node;
void insertnodes( node** arrayhead , int index , node* ptr){
index = index - 1 ;
while ( index--){
*arrayhead = (*arrayhead)->next;
}
(*arrayhead)->next = new node;
(*arrayhead)->next = ptr;
}
int main(){
int n = 4;
node *A[n] ;
for ( int i = 0 ; i < n ; i++){
A[i] = NULL ;
}
A[0] = new node;
A[0]->size = 10;
A[0]->name = new char;
A[0]->name = "gunna";
A[0]->next = NULL;
//cout << A[0]->name << endl;
node* ptr = new node ;
ptr->size = 10;
ptr->name = new char;
ptr->name = "param";
ptr->next = NULL;
insertnodes(&A[0] , 1 , ptr);
node* ptrr = new node ;
ptrr->size = 10;
ptrr->name = new char;
ptrr->name = "sidd";
ptrr->next = NULL;
insertnodes(&A[0] , 2 , ptrr);
cout << A[0]->name << endl;
cout << A[0]->next->name;
}
应该打印"gunna"one_answers"param"。
,但它给出"param"one_answers"sidd"作为输出。
我不知道我哪里做错了。我试了很多方法,但还是很困惑请帮忙……我正在使用代码块来编译这个程序。在您的insertnodes()
中,您正在传递双指针 node** arrayhead
,因此,通过稍后对其解引用,您正在覆盖next
指针的当前值,这将稍后导致程序中的内存泄漏。
您应该做的是创建一个临时变量node* tmp
,您将在index
减少时更改它。然后,您不需要为下一个指针分配新节点,因为您已经有一个想要附加为next
的指针。
固定的代码看起来像这样:
void insertnodes(node** arrayhead, int index, node* ptr) {
index = index - 1;
node* tmp = *arrayhead;
while (index--) {
tmp = tmp->next;
}
tmp->next = ptr;
}
编辑:这是完全无用的:
int n = 4;
node *A[n] ;
for ( int i = 0 ; i < n ; i++){
A[i] = NULL ;
}
创建一个链表只需要一个节点(例如list的头)。
但是因为这是一个链表,你不需要传递index。你所需要的是一个head
,你可以在上面迭代,直到你找到node->next
,这将是NULL
-这是你需要插入你的新节点的地方(这是它通常是如何完成的)。