Приоритетная очередь не вставляет элемент в порядке возрастания - PullRequest
0 голосов
/ 03 октября 2018

Это код очереди приоритетов, использующий связанный список, у меня есть два сомнения в этом коде

1) Этот код является частью моей функции вставки

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

почему мыне может сделать temp! = NULL в цикле while вместо temp->next!=NULL, потому что temp!=NULL также сделает выход из цикла еще в одной итерации, но это приводит к сбою, что является причиной сбоя

2) Я хочу сделать приоритетную очередь такой, чтобы элемент, имеющий наименьший приоритет, был сначала удален, а элементы, которые имеют такой же приоритет, затем элемент будет удален первым, который был добавлен первой входной частью из main function

    insert(&head,3,5);   
    insert(&head,2,2);   

    insert(&head,1,1);   
    insert(&head,7,1);
    insert(&head,11,1);
    insert(&head,8,5);   
    insert(&head,9,5);

Я получаю вывод для этого 1 2 11 7 3 8 9, но его вывод должен быть 1 7 11 2 3 8 9

#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** addofhead,int data,int priority){

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

    if((*addofhead)->priority > newnode->priority){
        newnode->next=*addofhead;
        *addofhead=newnode;
        return;
    }

    if((*addofhead)->priority <= newnode->priority ){
        struct node* temp=*addofhead;
        while(temp->next!=NULL&&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);   /// 3
    insert(&head,2,2);   /// 2,3

    insert(&head,1,1);   /// 1,2,3
    insert(&head,7,1);
    insert(&head,11,1);
    insert(&head,8,5);   /// 1,7,2,3
    insert(&head,9,5);
    struct node* temp=head;
    while(temp)
    {
        printf(" %d ",temp->data);
        temp=temp->next;

    }
    printf("\n head in main  after insertion is %d",head);

}

1 Ответ

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

почему мы не можем сделать temp!=NULL в цикле while вместо temp->next!=NULL (?)

Поскольку строка после цикла имеет temp->next; @ Джонатан Леффлер.

Обычная цель продвижения по связанному списку для вставки - узнать указатель предыдущего узла, чтобы его элемент .next мог быть обновлен.


Код имеет 2 функциональные проблемы

Сравнение неправильных приоритетов

// while(temp->next!=NULL&&temp->priority <newnode->priority ){
while(temp->next!=NULL&&temp->next->priority <newnode->priority ){
//                          ^^^^^^    

Неправильное сравнение при ==

// while(temp->next!=NULL&&temp->next->priority <newnode->priority ){
while(temp->next!=NULL&&temp->next->priority <= newnode->priority ){
//                          ^^^^^^           ^^

Также используйте %pдля печати void *, а не "%d" для печати указателя.

// printf("head in insert is %d",*addofhead);
printf("head in insert is %p",(void *) (*addofhead));

Что было очень полезно для продвижения вперед, так это создание вспомогательной функции для печати данных.Тогда было легко вызывать его после каждой вставки, чтобы сузить проблемы.

void pq(const struct node* p) {
  while (p) {
    printf("(data %d,pri %d) ", p->data,  p->priority);
    p = p->next;
  }
  puts("");
}

Я обнаружил, что OP insert() слишком сложный.См. @wildplasser.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...