c - 在第 n 个位置插入节点


node* insertnth(struct node_q* list,int ndex,struct node_q* qtemp){//temp is the node to be inserted at the back of ndex
    struct node_q* temp;
    struct node_q* curr;
    int i;
    temp = list;
    curr = temp;
    for(i=0;i<=ndex;i++){
        if(temp!=NULL)
        temp = temp->pnext;
    }
        curr = temp;
        temp = temp->pnext;
        curr->pnext = NULL;
        curr->pnext = qtemp;
        qtemp->pnext = temp;
        return list;
}

我不知道它为什么崩溃。 此函数应在索引的后面或索引之后插入节点 temp 并将其重新连接到列表 结构的所有指针在作为参数传递之前都设置为 null,除了它已经有节点的列表。

如果你真的想在正常意义上的第n个位置插入,你就差了一个。 插入位置 n 通常意味着新项目在插入位于第 n 个位置。 在 C 中,n从零开始。因此,在第 0 个位置插入会将新项目放在列表的顶部。 插入第 L 个,其中 L 是原始列表长度,将其放在最后。

即使您修复了 off-by-1 错误,代码也是混乱和丑陋的。

如果您考虑将两个指针向下推进列表:"领先"和"跟踪"指针,则此问题会变得更容易。 跟踪以 NULL 开始,引线指向列表头。 将货币对推进n倍。

迭代引导和跟踪指针可以通过一个不错的for循环习惯法来实现:

int i;
struct node *lead, *trail;
for (i = 0, trail = NULL, lead = list; 
     i < n && lead != NULL; 
     ++i, trail = lead, lead = lead->next)

完成后,有两种情况。最常见的是leadtrail分别指向第 n 和第 n-1 个列表项,其中潜在客户可能为 NULL(即您已到达列表末尾)。在这种情况下,插入新节点只是:

new_node->next = lead;
trail->next = new_node;
return list;

另一种情况是trail仍然指向 NULL。这意味着n为零。 在这种情况下,上面的代码将不起作用。 第二行将失败。 在这里,您只想使新节点成为新的列表头:

new_node->next = lead; 
return new_node;

我会让你把碎片放在一起。你应该得到一些小而美丽的东西。

curr = temp;
        temp = temp->pnext;
        curr->pnext = NULL;
        curr->pnext = qtemp;
        qtemp->pnext = temp;

即使在此代码中,您也可以访问temp->pnext因此它不应该为 NULL。

    if(temp!=NULL)
    {
    curr = temp;
    temp = temp->pnext;
    curr->pnext = NULL;
    curr->pnext = qtemp;
    qtemp->pnext = temp;
    }
    else
    {
       printf("wrong index");
    }

如果你从 1 开始索引,那么最好更改循环条件以在索引位置插入节点,

for(i=0;i<ndex;i++){

如果为 ndex 提供的值大于或等于(列表中的当前节点数)-1,您将尝试取消引用空指针并获取段错误。 考虑一个包含 3 个节点的列表,并且函数的 ndex 值为 2 个输入:

列表-->节点 0-->节点 1-->节点 2-->NULL

  • 启动条件:
    • 温度 = 节点 0
    • curr = 节点 0
    • NDEX = 2
  • for 循环的第一次迭代:
      i = 0
    • , 0 <= 2
    • temp != 空,分配 temp = 节点 0->下一个(节点 1)
  • 第二次迭代:
      i = 1
    • , 1 <= 2
    • temp != 空,分配 temp = 节点 1->下一个(节点 2)
  • 第三次迭代:
      i = 2
    • , 2 <= 2
    • temp != 空,分配 temp = 节点 2->下一个 (空)
  • 后循环操作:
    • 分配 curr = 温度 (空)
    • 分配 temp = 临时>下一个(取消引用空指针并崩溃)

所以你的代码确实有两个问题:

  • 插入未在正确的位置进行,因为您混合了索引约定。 函数的索引值输入和 for 循环中的条件就像列表从 1 开始索引一样,但 for 循环的起始条件就像列表从 0 开始索引
  • 一样
  • 在尝试插入之前,代码不会检查迭代是否已到达列表末尾。
Public void Insert (Type object, int k, bool flag) 
{ 
      Flag = false; 
      ListNode<Type> current = head; 
      bool found = false; 
       while ((current.next != null)&&(found == false)) 
     { 
    if(current.data == obiect) 
        found = true;   else 
        current = current.next; 
     } 
    If (found) 
            System.out.println(“The object already in the List”);    else 
        { 
            if (k > n) 
    { 
        ListNode<Type> newNode = new ListNode<Type>(); 
        newNode.data = object;          newNode.next = null; 
        current.next = newNode;         tail =newNode 
              } 
    else if(k <= 1) 
    { 
        ListNode<Type> newNode = new ListNode<Type>(); 
        newNode.data = object; 
        newNode.next = head.next;       head =newNode 
    } 
    else  
    { 
        int i = 1; 
        current = head; 
        while((I == k)&&(current.next != null)) 
        { 
            current = current.next; 
            i++; 
        } `enter code here`
list-->node 0-->node 1-->node 2-->NULL
Starting condition:
temp = node 0
curr = node 0
ndex = 2
First iteration of the for loop:
i = 0, 0 <= 2
temp != NULL, assign temp = node 0->next (node 1)
Second iteration:
i = 1, 1 <= 2
temp != NULL, assign temp = node 1->next (node 2)
Third iteration:
i = 2, 2 <= 2
temp != NULL, assign temp = node 2->next (NULL)
Post-loop operations:
assign curr = temp (NULL)
assign temp = temp->next (dereferences NULL pointer and crashes)
public void InsertAtNth(int data, int position){
            NodeS newNode = new NodeS(data);
            NodeS temp = head1;
            NodeS prev = null;
            if(head1 == null ){
                head1 = newNode;
            }
            else if(position == 0){
                  newNode.next = head1;
                  head1 = newNode;
              }
            else{
                for(int i = 0;i < position; i++){
                    prev = temp;
                    temp = temp.next;
                }
                prev.next = newNode;
                newNode.next = temp;
            }
        }

相关内容

  • 没有找到相关文章

最新更新