c语言 - 链表插入和选择



我用通常使用的方式定义链表,即用数据部分和

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

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;

相关内容

  • 没有找到相关文章

最新更新