приоритетная очередь строки в c - PullRequest
0 голосов
/ 24 сентября 2018

Эта программа имеет приоритетную очередь, где я сохраняю строку, поскольку данные и очередь создаются с использованием связанного списка, элемент с наименьшим номером (в качестве приоритета нет) имеет более высокий приоритет, то есть он будет вставлен в головной узел и, таким образом, пока времяудаления (pop или dequeue) этот элемент будет удален первым (например, 1 имеет более высокий приоритет, чем 2)

#include<stdio.h>
#include<stdlib.h>
struct node {
  char *string;
  int priority;
  struct node* next;
};
struct node *head;
struct node* getnewnode(char *s,int p){
    struct node* newnode=(struct node*)malloc(sizeof(struct node));
    newnode->string=s;
    newnode->priority=p;
    newnode->next=NULL;

   return newnode;
}
void push(char* str,int p){
    struct node* node1=getnewnode(str,p);
    if(head==NULL){        //if the element is inserted in empty list
      head=node1;
    }

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

while(temp->next!=NULL&&temp->priority <= p) правильно или нет, потому что если приоритет выдвигаемого элемента равенсоответствующий этому новому элементу будет помещен после текущего (имеющего тот же приоритет)

      node1->next=temp->next;
      temp->next=node1;

    }

}
void pop(){
    struct node* temp=head;
    head=head->next;
    free(temp);

}
char* peek(){
    return head->string;
}
int main(){
head=NULL; //head is null initially
char a[10]="akash";
push(a,1);
char b[20]="rahul";
push(b,3);
printf("%s",peek());



}

Не отображается желаемый результат, но происходит сбой

int main(){
head=NULL;
char* a=(char *)malloc(sizeof(char)*10);
a="akash";
push(a,1);
char* b=(char *)malloc(sizeof(char)*10);
b="rahul";
push(b,3);
char* c=(char *)malloc(sizeof(char)*10);
c="neymar";
push(c,1);
printf("%s",peek());
pop();
printf("%s",peek());

}

Я даюakash как приоритет 1, rahul как 2 и neymar снова как 1, он должен напечатать akash и neymar для последних двух операторов printf, но он печатает akash rahul @ dbush

1 Ответ

0 голосов
/ 24 сентября 2018

В вашей функции push, в случае, когда head равно NULL, вы устанавливаете head для нового узла, а затем позже попытаетесь снова поместить узел в список.В итоге поле next указывает на себя, поэтому будущие вставки попадают в бесконечный цикл.

При вставке в пустой список вам нужно только установить head для нового узла и ничего больше, так что просто return прямо сейчас.

if(head==NULL){        //if the element is inserted in empty list
  head=node1;
  return;
}

Кроме того, вы должны сделать копию строки, которая передается при создании нового узла.В противном случае вы можете получить указатель на недопустимую память или несколько указателей, указывающих на один и тот же буфер, с возможностью просмотра только самого последнего обновления:

struct node* getnewnode(char *s,int p){
    struct node* newnode = malloc(sizeof(struct node));   // don't cast return value of malloc
    newnode->string = strdup(s);   // create copy of given string
    newnode->priority=p;
    newnode->next=NULL;

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