首页 > 解决方案 > 删除和插入一个节点链表 C

问题描述

我正在尝试编写一个程序,我必须在其中删除和插入链接列表中的元素。我在删除时和插入后遇到问题。特别是如果我在删除插入后打印列表,我会打印一个循环。而且,如果我删除第一个元素,我想我会删除整个列表。

这是两个功能,但我不知道问题出在哪里(对不起意大利评论)

void delete_peer(struct node_peer** head, int value){
    struct node_peer* temp;
    struct node_peer* prev;
    temp = head;
    
    if(temp != NULL && temp->port == value){
        head = temp->next;
        free(temp);
        temp = NULL;
        return;
    }
    
    while(temp != NULL && temp->port != value){
        prev = temp;
        temp = temp->next;
    }

    //peer non presente
    if(temp == NULL)
        return;

    prev->next = temp->next;
    free(temp);
    temp = NULL;
};

void insert_sort(struct node_peer* head, struct node_peer* new_peer){
    
    //se la lista è vuota, o il peer ha il n° di porta piu piccolo tra quelli presenti
    //allora inseriamo il nodo in testa
    if(*head == NULL || (*head)->port >= new_peer->port) {
        new_peer->next = *head;
        *head = new_peer;
        printf("Inserimento in testa\n");
        return;
    }
    
    //altrimenti, inserisco all'interno della lista, oridnata per n° di porta dei peers
    struct node_peer* current = *head;
    while(current->next != NULL && current->next->port < new_peer->port)
        current = current->next;

    new_peer->next = current->next;
    current->next = new_peer;   
    printf("Inserimento in mezzo\n");
    return;
};


EDIT: I pass the *head instead of **head

标签: csortingstructsingly-linked-listfunction-definition

解决方案


您的代码不应编译,因为至少在函数中delete_peer

void delete_peer(struct node_peer** head, int value){

在这份声明中

temp = head;

使用了不同类型的操作数(struct node_peer*struct node_peer**),并且没有从一种类型到另一种类型的隐式转换。

或者在声明的函数中

void insert_sort(struct node_peer* head, struct node_peer* new_peer){

再次例如 if 语句中的表达式

if(*head == NULL || (*head)->port >= new_peer->port) {

是不正确的,因为至少操作数*head(根据参数的声明head)没有指针类型。

该函数delete_peer可以通过以下方式定义

int delete_peer( struct node_peer **head, int value )
{
    while ( *head && ( *head )->port != value )
    {
        head = &( *head )->next;
    }

    int success = *head != NULL;

    if ( success )
    {
        struct node_peer *tmp = *head;
        *head = ( *head )->next;
        free( tmp );
    }

    return success;
}

并且应该至少像调用该函数一样

delete_peer( &head, value );

该函数insert_sort可以定义为

void insert_sort( struct node_peer **head, struct node_peer *new_peer )
{
    while ( *head && !( new_peer->port < ( *head )->port ) )
    {
        head = &( *head )->next;
    }

    new_peer->next = *head;
    *head = new_peer;
}

该函数insert_sort应该被称为

insert_sort( &head, new_peer );

推荐阅读