【问题标题】:Delete and insert a node linked list C [closed]删除并插入节点链表C [关闭]
【发布时间】:2021-07-01 16:06:23
【问题描述】:

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

这是两个函数,但我不知道问题出在哪里(对不起意大利的 cmets)

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

【问题讨论】:

  • 编译器将为此赋值 temp = head; 发出错误。所以你的代码不能编译。
  • 这已经详细介绍了here
  • @VladfromMoscow 编辑,我放了旧代码,现在可以编译了
  • 请重新检查您的代码格式。此外,它应该是minimal reproducible example,即未经修改编译,因此包含任何必要的标头。作为这里的新用户,还请务必使用tour 并阅读How to Ask

标签: c sorting struct singly-linked-list function-definition


【解决方案1】:

你的代码不能编译,因为至少在函数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 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2021-02-13
    相关资源
    最近更新 更多