Указатель не изменяется во вставке в C - PullRequest
0 голосов
/ 03 октября 2018

Программа для приоритетной очереди, я сомневаюсь в указателе, я передаю головку для вставки, но она не изменяется во вставке, как вы можете видеть, я печатаю головку

  • во вставке и в основной
  • во вставке печатается что-то отличное от нуля
  • , а в голове оно равно нулю
    #include<stdio.h>
    #include<stdlib.h>
    struct node{
        int data;
        int priority;
        struct node* next;
    };
    struct node* getnewnode(int data,int priority){
        struct node* newnode=malloc(sizeof(struct node));
        newnode->data=data;
        newnode->next=NULL;
        newnode->priority=priority;
        return newnode;
    }
    void insert(struct node* head,int data,int priority){

        struct node* newnode=getnewnode(data,priority);
        if(head==NULL){
            head=newnode;
            printf("head in insert is %d",head);
            return;
        }

        if(head->priority > newnode->priority){
            newnode->next=head;
            head=newnode;
            return;
        }
        if(head->priority <= newnode->priority ){
            struct node* temp=head;
            while(temp->priority <= newnode->priority ){
                temp=temp->next;
            }
            newnode->next=temp->next;
            temp->next=newnode;
            return;
        }
    }
    int removee(struct node* head){
        if(head==NULL)
            return -1;
        int temp=head->data;
        head=head->next;
        return temp;
    }
    int main(){
        struct node* head=NULL;
        insert(head,3,5);
        printf("\n head in main is %d",head);

    }

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Супер упрощенная версия без if() утверждений:


void insert(struct node **head, int data, int priority){

    struct node *newnode = getnewnode(data, priority);

    for( ; *head && (*head)->priority <= newnode->priority; head = &(*head)->next)
        {;}

    newnode->next = *head;
    *head = newnode;

    return;

}

... если вам не нравятся пустые циклы, вы можете добавить if(...) break;:


void insert(struct node **head, int data, int priority){

    struct node *newnode = getnewnode(data, priority);

    for( ; *head ; head = &(*head)->next) {
        if( (*head)->priority > newnode->priority) break;
        }

    newnode->next = *head;
    *head = newnode;

    return;

}
0 голосов
/ 03 октября 2018

head в insert локально для функции insert, любая модификация к ней не повлияет на head в основном и будет уничтожена после выхода из функции insert.

Решение:

Вам нужно передать указатель head в main на insert.

Следовательно, ваша вставка станет такой, как показано ниже.

 void insert(struct node **head,int data,int priority){

    struct node* newnode=getnewnode(data,priority);
    if(*head==NULL){
        *head=newnode;
        printf("head in insert is %d",*head);
        return;
    }

    if((*head)->priority > newnode->priority){
        newnode->next=*head;
        *head=newnode;
        return;
    }
    if((*head)->priority <= newnode->priority ){
        struct node* temp=*head;
        while(temp->priority <= newnode->priority && temp->next != NULL){
            temp=temp->next;
        }
        newnode->next=temp->next;
        temp->next=newnode;
        return;
    }
}

и вы звоните insert с main, как показано ниже.

insert(&head,3,5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...