链接列表插入&选择

时间:2012-02-24 13:06:04

标签: c data-structures linked-list

我按照常用的方式定义链接​​列表,即使用数据部分和

自引用指针。我的插入逻辑如下:

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)每次插入节点时,节点都以正确的顺序插入。

此代码导致运行时错误...... ???

3 个答案:

答案 0 :(得分:2)

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;

答案 1 :(得分:2)

无视答案,因为它是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

在这种情况下,我们可以使用对指针的引用而不是双指针,因为我们不需要修改它

答案 2 :(得分:2)

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;
}