当前位置: 首页 > 知识库问答 >
问题:

c中字符串的优先级队列

沃念
2023-03-14

该程序属于优先级队列,其中我将字符串存储为数据,队列使用链表创建。编号最少的元素(作为优先级编号)具有更高的优先级,即它将插入头节点,因此在移除(pop或出列)时,该元素将首先移除。(例如,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;
      }

〈代码〉而(tem-

      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个答案

邵赞
2023-03-14

push功能中,如果head为空,则将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;
}
 类似资料:
  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我试图实现Dijkstra算法的一个版本,以找到公共汽车从起点到终点的最短路线。不幸的是,我似乎找不到swift提供优先级队列类型的库或其他方式,所以我似乎必须自己编写代码。 话虽如此,有人能指出我做这件事的正确方向吗? 目前我的想法如下: 到目前为止这是我的代码。似乎太短太残忍了...我一定是在概念上漏掉了什么。

  • 通过前面的学习我们知道运算符有不同的类型,当这些不同类型的运算符出现在同一个表达式中时,就必须遵循运算符的优先级来进行运算,才能保证运算的合理性和结果的正确性、唯一性。运算符的优先级决定了表达式中各个部分执行运算的先后顺序。 下表中详细介绍了 C# 中运算符的优先级顺序: 优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[整型表达式] 左到右   () 圆括号 (表

  • 注意:我知道可以用比较器创建优先级队列,然后重复调用Add。

  • 考虑下面的优先级类声明<代码>类优先级队列 我的想法: 我能想到的一件事是,这将强制优先级队列使用对象比较器,并且不会提供实现其自定义比较器的能力,因为类的用户可能希望基于某个不同的比较器构建队列。