在第n个位置插入一个节点

时间:2014-04-02 17:08:43

标签: c linked-list

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,或者在索引之后插入节点temp并将它重新连接到列表中结构的所有指针都被设置为null,然后作为参数传递,除了它已经有节点的列表。

6 个答案:

答案 0 :(得分:1)

如果你真的试图以正常意义插入n位置,那么你就是一个人。在n位置插入通常意味着新项目在插入后位于n位置。在C中,n从零开始。因此,在0位置插入会将新项目放在列表的开头。在L处插入L是原始列表长度,将其放在最后。

即使您修正了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分别指向nn-1个列表项,其中潜在客户可能为NULL(即您已到达终点列表)。在这种情况下,插入新节点只是:

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

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

new_node->next = lead; 
return new_node;

我会让你把各个部分放在一起。你应该得到一些小而美的东西。

答案 1 :(得分:0)

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++){

答案 2 :(得分:0)

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

列表 - &gt;节点0 - &gt;节点1 - &gt;节点2 - &gt; NULL

  • 开始条件:
    • temp = node 0
    • curr = node 0
    • ndex = 2
  • for循环的第一次迭代:
    • i = 0,0 <= 2
    • temp!= NULL,指定temp = node 0-&gt; next(node 1)
  • 第二次迭代:
    • i = 1,1 <= 2
    • temp!= NULL,指定temp =节点1-&gt; next(节点2)
  • 第三次迭代:
    • i = 2,2 <= 2
    • temp!= NULL,指定temp =节点2-&gt; next(NULL)
  • 循环后操作:
    • 指定curr = temp(NULL)
    • assign temp = temp-&gt; next(取消引用NULL指针和崩溃)

您的代码确实存在两个问题:

  • 插入不会发生在正确的位置,因为您正在混合索引约定。您输入到函数的索引值和for循环中的条件就好像列表从1索引,但for循环的起始条件就像列表从0索引一样
  • 在尝试插入之前,代码没有检查迭代是否已到达列表的末尾。

答案 3 :(得分: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`

答案 4 :(得分:0)

     var result = await authContext.AcquireTokenSilentAsync(AzureAdGraphResourceURL, clientCredential, userIdentifier);

答案 5 :(得分:0)

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;

            }
        }