簡體   English   中英

從C中的單鏈接列表中刪除前端節點

[英]Deleting front node from a Singly Linked List in C

我試圖從單鏈接列表中刪除,但是,當我嘗試從第一個元素中刪除時,它會打印垃圾。 我認為問題來自delete_node函數,但是,我嘗試了所有操作,但無法弄清楚。

    #include <stdio.h>//prinf
#include <stdlib.h>//alloc mallco callo
typedef struct node node;
 struct node{
    int number;
    node *next;
};
node *new_node(int num){
    node *n= (node*) malloc(sizeof(node));
    n->number=num;
    n->next=NULL;
    return n;
}

void node_free_all(node *n){
    if(n != NULL){
        node_free_all(n->next);
        free(n);
    }
}
void print_nodes(node *n){
    if(n != NULL){
        print_nodes(n->next);
        printf("Number is: %d\n",n->number);
    }
}
void delete_node(node *n, int num){

    node *rmNode= (node*)malloc(sizeof(node));

    //delete first
    if( n!= NULL && n->number==num){
        rmNode = n;
        n=n->next;
        free(rmNode);
    }
    //all but first
    while(n != NULL){
        if(n->next != NULL && n->next->number == num){
            rmNode= n->next;
            n->next = rmNode->next;
            free(rmNode);
            break;
        }
        n=n->next;
    }   

}
int main(){
    int i;
    node *head= (node*) malloc(sizeof(node));
    node *curr;
    head=NULL;

   for(i=1;i<=10;i++) {
      curr = new_node(i);
      curr->next =head;
      head=curr;
    }



    printf("Everything:\n");
    print_nodes(head);
    printf("Deleting 1:\n");
    delete_node(head,1);
    print_nodes(head);
    printf("Deleting 5:\n");
    delete_node(head,5);
    print_nodes(head);
    printf("Deleting 2:\n");
    delete_node(head,2);
    print_nodes(head);
    printf("Deleting 3:\n");
    delete_node(head,3);
    print_nodes(head);
    printf("Deleting 10:\n");
    delete_node(head,10);
    print_nodes(head);
    printf("Deleting 9:\n");
    delete_node(head,9);
    print_nodes(head);

node_free_all(head);
// node_free_all(list);
return 0;
}

我究竟做錯了什么?

您不需要為rmNode分配內存。 另外,您還需要將頭指針的引用傳遞給delete_node函數,因為每次更新列表時,如果必須刪除列表的第一個元素,則在這種情況下,頭指針也會被更新。

struct node
{
    int number;
    node *next; 
};

void delete_node(struct node** head_ref, int num)
{
    struct node* temp;
    struct node* current = (*head_ref);


    //delete first

    if( current != NULL && current->number == num)
    {
        temp = current;
        current = current->next;
        free(temp);
        (*head_ref) = current;
    }
    else
    {
        //all but first
        while(current != NULL)
        {
            if(current->next != NULL && current->next->number == num)
            {
                temp = current->next;
                current->next = temp->next;
                free(temp);
                break;
            }
            current = current->next;
        }
    }
}

這是一個版本,該版本會刪除所有與num匹配的項目,並始終更新主項目。

void delete_node(node** head_ref, int num)
{
    node* temp;
    node* last = 0;
    node* current = *head_ref;

    while(current)
    {       
        if( current->number == num )
        {
            temp = current;
            if( current == *head_ref )
                current = (*head_ref) = current->next;
            else
                current = last->next = current->next;
            free(temp);
        } else {
            last = current;
            current = current->next;
        }
    }
}

您必須像delete_node(&head,1);這樣稱呼它delete_node(&head,1);
因為它需要一個可以更改標題的地址

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM