c中字符串的优先级队列

时间:2018-09-24 19:02:33

标签: c data-structures queue

此程序是优先级队列,其中我正在将字符串存储为数据,并且使用链接列表创建队列,具有最小编号(作为优先级为no)的元素具有更高的优先级,即它将被插入到头节点,因此时间移除(弹出或出队)的操作,该元素将首先被移除。(例如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,它应该为最后两个printf语句打印akash和neymar,但它正在打印akash rahul @dbush

1 个答案:

答案 0 :(得分:2)

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