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