我用通常使用的方式定义链表,即用数据部分和
自引用指针。我的插入逻辑如下:
struct node
{
int data; //or any type.
struct node *nextPtr;
}*start = NULL;
//main
struct *newPtr = (struct node *)malloc(sizeof(struct node *));
scanf("%d", newPtr->data); //or cout
newPtr->nextPtr = NULL;
if(start == NULL)
start = newPtr;
else
{
while(tempPtr->nextPtr != NULL)
{
tempPtr = tempPtr->nextPtr;
}
tempPtr->nextPtr = newPtr;
}
i) 这个逻辑正确吗?
ii)a)当我(在一个系统中)插入两个节点或三个节点(在另一个系统)时,我可能会得到运行时错误。b) 每次插入节点时,都会按正确的顺序插入节点。
运行时错误是否是此代码导致的。。。???
struct node
{
int data; //or any type.
struct node *nextPtr;
}*start = NULL;
//main
struct *newPtr = (struct node *)malloc(sizeof(struct node));// You dont need * here
scanf("%d", newPtr->data); //or cout
newPtr->nextPtr = NULL;
if(start == NULL)
start = newPtr;
else
{
tempPtr = start; // you missed this.
while(tempPtr->nextPtr != NULL)
{
tempPtr = tempPtr->nextPtr;
}
tempPtr->nextPtr = newPtr;
}
忽略答案,因为它是c++,原始问题标记为c++
一旦小问题得到解决(节点的实际分配、值的设置、临时指针的定义以帮助遍历列表),原始代码应该会起作用。但是,你可以采取其他方法来简化代码(好吧,并不是说它非常复杂),这基本上意味着在创建之前先找到插入点,然后再创建新元素:
Node** insertPoint = &start;
while (*insertionPoint)
insertionPoint = &((*insertionPoint)->next);
*insertionPoint = new Node(value);
使用指针对指针遍历列表,用头指针的地址初始化,将其移动,直到它指向将附加新元素的Node*
(注意,已附加,未插入)。然后在该位置创建新节点。这假设Node
构造函数负责复制值并初始化next
指针。
或者,你可以递归地写这篇文章,让编译器为你执行尾部优化(读起来可能会简单一点,有些人觉得递归更简单,有些人则不然):
void append( Node*& tail, Value value ) {
if ( tail==NULL )
list = new Node(value);
else
append( list->next, value );
}
呼叫代码:
append( start, 100 ); // assuming nits contained in the list
在这种情况下,我们可以使用对指针的引用,而不是双指针,因为我们不需要修改它
struct node *newPtr, **hnd;
newPtr = malloc(sizeof *newPtr);
if (!newPtr) barf();
scanf("%d", &newPtr->data);
newPtr->nextPtr = NULL;
for(hnd = &start; *hnd; hnd = &(*hnd)->next) {;}
*hnd = newPtr;