C programming Linked Lists delete node at position N

前端 未结 5 536
猫巷女王i
猫巷女王i 2020-12-18 08:16

EDIT: Figured out the problem. Also if you found this through google or another search engine here is where I went wrong and how to fix it.

My delet

相关标签:
5条回答
  • 2020-12-18 08:46

    Figured out your for loop isn't reaching the desired position you wanted. Better use equal to sign for the constraint it will work. e.g.

    for (i=1;i<=position-1;i++)
    {
    
    }
    
    0 讨论(0)
  • 2020-12-18 08:50

    Removing a given node n from a singly-linked list can be boiled down to this operation:

    • Set the pointer that points to n to point instead to n->next.

    You can break this down into two operations:

    • Find the pointer that points to n;
    • Set that pointer to n->next.

    The complication arises because the pointer that points to n might either be the p->next field of the previous node in the list, or the head pointer (if n is the first node in the list).

    Your code does not appear to be complete - it doesn't ever set the ->next field of any node to anything, so it's hard to say what's actually wrong.

    0 讨论(0)
  • 2020-12-18 08:54

    In your code, you have the line

    newNode->next;
    

    in your for loop. That operation doesn't do anything.

    You also have

    newNode-> = NULL;
    

    which is not valid C, and I have no idea how you got that to compile.

    But really, don't use that loop. A linked list is one of the most basic recursive data structures. As a result, almost all algorithms manipulating them are most elegant as a recursive solution.

    typedef struct node node_t;
    
    node_t* delete_at_index(node_t* head, unsigned i)
    {
        node_t* next;
    
        if(head == NULL)
            return head;
    
        next = head->next;
    
        return i == 0
                 ? (free(head), next)                                 /* If i == 0, the first element needs to die. Do it. */
                 : (head->next = delete_at_index(next, i - 1), head); /* If it isn't the first element, we recursively check the rest. */
    }
    
    0 讨论(0)
  • 2020-12-18 08:55

    Your DeleteNode doesn't delete a node, it removes pos nodes from the front of the list. So you're trying to remove 9 items from a list that only contains 6, resulting of course in an empty list (NULL). Also, your code is overly complex and contains remnants of previous attempts. Please don't do that to yourself or to us; provide simple clean code and it will be easier to understand and to fix.

    0 讨论(0)
  • 2020-12-18 08:58
    // Remove list's node located at specified position.
    // Arguments:
    //  head -- list's head
    //  pos -- index of a node to be removed (1-based!!!)
    
    struct node* DeleteNode(struct node* head, int pos) 
    {
    
        struct node* node;
        struct node* prev;
        int length;
        int i;
    
        printf("DeleteNode: position = %d \nBefore: ", pos);
        PrintList(head);
    
        // Check position's lower bound. Should be >= 1
        if(pos <= 0) { //node does NOT exist
            printf("ERROR: Node does not exist!\n");
            return head;
        }
    
        // Seek to the specified node, and keep track of previous node.
        // We need previous node to remove specified node from the list.
    
        for(i=1, prev = 0, node = head; i < pos && node != 0; i++) {
            prev = node;
            node = node->next;
        }
    
        // Out of range
        if(0 == node) {
            printf("ERROR: Index out of bounds!\n");
            return head;
        }
    
        // @node points to a list's node located at index pos 
        // @prev points to a previous node.
    
        // Remove current node from the list.
        if(0 == prev) {
            head = node->next;
        }
        else {
            prev->next = node->next;
        }
        free(node);
    
        return head;   
    }
    
    0 讨论(0)
提交回复
热议问题