указатель не изменяется при вставке в c

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

#include #include 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 priority ){ struct node* temp=head; while(temp->priority 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); } 

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); 

Супер-упрощенная версия без каких-либо операторов 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; }