C 优先级队列和堆(这对我来说很难)

C 优先级队列和堆(这对我来说很难),c,queue,heap,C,Queue,Heap,我想完成这段代码 #include <stdio.h> #include <stdlib.h> #define HEAP_LEN 100 #define MAX_HEAP 20 struct heapElem{ int priority; char* data; }; struct _heap{ int num_data; struct heapElem heapArr[HEAP_LEN]; }; int GetPriIdx(struct _hea

我想完成这段代码

#include <stdio.h>
#include <stdlib.h>

#define HEAP_LEN 100
#define MAX_HEAP 20

struct heapElem{
  int priority;
  char* data;
};

struct _heap{
  int num_data;
  struct heapElem heapArr[HEAP_LEN];
};

int GetPriIdx(struct _heap* ph, int idx);
void swapD(char* a, char* b); 
void swapI(int* a, int* b);
void swap(struct heapElem a, struct heapElem b);
void Insert(struct _heap* ph, char* data, int priority);
void Delete(struct _heap* ph);
void Printout(struct _heap* ph);
void Retrieve(struct _heap* ph);
void KeyIncrease(struct _heap* ph, int priority, int n_priority);

int main(void) {
  struct _heap heap;
  heap.num_data = 0;

  char option_char;
  char name[20];
  int k_value;
  int new_k_value;

  do{
    printf("\n*********** MENU ***************\n");
    printf("I : Insert new element into queue\nD : Delete element with largest key from queue\nR : Retrieve element with largest key from queue\nK : Increase key of element in queue\nP : Print out all elements in queue\nQ : Quit\n\nChoose menu :");
    scanf("%c", &option_char);

    switch(option_char){
      case 'I' : //insert new element into queue
        printf("Enter name of element : ");
        scanf("%s", name);
        printf("Enter key value of element : ");
        scanf("%d", &k_value);
        Insert(&heap, name, k_value);

        break;

      case 'D' : 
        Delete(&heap);
        break;

      case 'R' : 
        Retrieve(&heap);
        break;

      case 'K' : 
        printf("Enter idx of element : ");
        scanf("%d", &k_value);
        printf("Enter new key value : ");
        scanf("%d", &new_k_value);
       KeyIncrease(&heap, k_value, new_k_value);
       break;

     case 'P' : 
        Printout(&heap);
        break;

     default:
          break;

    }


  }while(option_char != 'Q');
  return 0;
}


void swapD(char* a, char* b) {

    char temp = *a;
    *a = *b;
    *b = temp;

}

void swapI(int* a, int* b) {

    int temp = *a;
    *a = *b;
    *b = temp;

}


void Insert(struct _heap* ph, char* data, int priority){
  if(ph->num_data >= MAX_HEAP) return;

  int idx = ph->num_data+1;

  ph->heapArr[idx].data = data;
  ph->heapArr[idx].priority = priority;
  printf("?? instant %d: [%s, %s] \n", idx, ph->heapArr[idx].data, ph->heapArr[idx/2].data);



  while(idx >1 && ph->heapArr[idx].priority > ph->heapArr[idx/2].priority){
    if(priority > ph->heapArr[idx/2].priority){ 
      swapD(ph->heapArr[idx/2].data, ph->heapArr[idx].data);
      swapI(&ph->heapArr[idx/2].priority, &ph->heapArr[idx].priority);
      idx = idx/2;
    }
    else break;
  }

  ph->num_data += 1;
  printf("New element [%s, %d] is inserted.\n",data, priority);

}
不是优先,, 我只把“数据”放在idx中(像这样
ph->heapArr[idx].data=data
),但
ph->Arr
中的所有数据都会改变值

所有
ph->Arr
中仅更改数据

首先插入[cat,5],然后再插入[dog,9],然后打印[dog,9][dog,5]


请帮帮我ㅠㅠ

在插入中,执行以下操作时:

ph->heapArr[idx].data = data;
将指针
数据
分配给heap元素。但是您必须复制数据,因为否则所有堆元素都指向相同的
数据
(在主堆中是
名称

所以你应该:

ph->heapArr[idx].data = malloc(strlen(data)+1);
strcpy(ph->heapArr[idx].data, data);
或者您可以使用
strdup
,它可以为您执行以下操作:

ph->heapArr[idx].data = strdup(data);

当你使用这个
ph->heapArr[idx].data=data您没有在中复制任何数据

ph->heapArr[idx].data
将它指向函数参数也指向的数据

如果您更改该数据
(在主功能中)
,则还将更改
ph->heapArr[idx]。数据,
由于您正在该指针
ph->heapArr[idx]
中搜索变量
name
的地址,虽然您可以更改变量
name
值,但所有数组
ph->heapArr[idx]
仍将指向存储在变量
name
地址中的值,因此它们都将更改

使用
malloc
首先为此指针分配内存,然后将其指向另一个变量,并在其中存储数据(复制数据,而不仅仅是将数据复制到数据)


非常非常感谢!!:>你的回答对我很有帮助。@Yeong请放心,没有必要感谢。如果它真的帮助你接受了答案。真的非常感谢!!:>你的回答对我很有帮助。
ph->heapArr[idx].data = strdup(data);
ph->heapArr[idx].data = malloc(strlen(data)+1);
strcpy(ph->heapArr[idx].data, data);