gpt4 book ai didi

c - 如何初始化优先级队列(定制库)

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:37 24 4
gpt4 key购买 nike

所以对于这个项目,我们需要通过向下查看堆栈并通过队列向前检查单词是否是回文。我将所有逻辑放在一起,以及我的 palindrome.c 文件中的#include。在我的回文检查方法中使用(如下所示的 allocPQueue)时,我遇到的所有问题都是正确定义它。

这是 PriorityQueue.c 的摘录

#include "PriorityQueue.h"

PQueue* allocPQueue(uint elementSize, PQMode mode){
PQueue* pq = (PQueue*)calloc(1, sizeof(PQueue));
pq->elements = allocDList(elementSize, NULL, NULL);

//the elementSampling is to speed up search time, but it is not yet ready
//in order for it to work I cannot make a copy of DNode*, rather I should
//place the pointer of a DNode directly into the array
//I will call this a DeepDArray
pq->elementSampling = (GenericArray)allocDArray(10, sizeof(DNode*));

pq->mode = mode;
if(mode == PQMODE_STACK){
pq->priorityExtractor = &stackPriority;
}
else if(mode == PQMODE_QUEUE){
pq->priorityExtractor = &queuePriority;
}
return pq;
}

void releasePQueue(PQueue* pq){
if(pq){
if(pq->elements){
releaseDList(pq->elements);
}
if(pq->elementSampling){
releaseDArray(pq->elementSampling);
}
free(pq);
}
}

Object peekMin(PQueue* pq){
if(isEmptyPQueue(pq)){
return NULL;
}
Object data = malloc(pq->elements->elementSize);
memcpy(data, pq->elements->head->data, pq->elements->elementSize);
return data;
}

这是我的 palindrome.c 文件中的代码(不包括包含):

#include "PriorityQueue.h"

bool isPalindrome(char* str, uint length);
char getPalindromeChar(char c);
PQueue* stack;
PQueue* queue;

int main(int argc, char** argv){

if(isPalindrome(argv[1], strlen(argv[1]))){

printf("%s is a palindrome\n", argv[1]);

}

else{

printf("%s is not a palindrome\n", argv[1]);

}

return 0;
}

bool isPalindrome(char* str, uint length){
//TODO
//insert your check, you are only allowed to use a Stack, a Queue, and the char
//getPalindromeChar(char) helper function

char ch;
int wordLength;
int counter;
char stackChar;
char queueChar;
bool stillPalli;

stack = allocPQueue(sizeof(char), PQMODE_STACK); <--"undefined reference to 'allocPQueue'"
queue = allocPQueue(sizeof(char), PQMODE_QUEUE); <--"undefined reference to 'allocPQueue'"

wordLength = 0;

int i;

for(i = 0; i < length; i++){ // Goes through the str array, looking char-by-char for

ch = str[i];
ch = getPalindromeChar(ch);

wordLength++;

// places them in stack and queue
add(stack,ch);
add(queue,ch);

}
stillPalli = true;

while(stillPalli && (counter < wordLength)){

stackChar = top(stack);
pop(stack);

queueChar = front(queue);
dequeue(queue);

// test for equality
if(strcmp(stackChar, queueChar) != 0){
stillPalli = false;
}
counter++;

}

}

最佳答案

在 PriorityQueue.h 中声明函数 allocPQueue():

extern PQueue* allocPQueue(uint elementSize, PQMode mode);

在编译 palindrome.c 时,编译器需要知道某处有一个在链接时可用的函数。

extern 关键字正是这样做的:它填充编译器符号表但不尝试定义它的实际内容(汇编代码,在函数的情况下)。编译器将输出带有注释的目标代码 (palindrome.o),表明该函数仍然缺少定义。它将来自另一个目标文件。

然后进入链接器。您应该同时传递 palindrome.o 和 PriorityQueue.o,这样最终的可执行文件中就没有 undefined reference 。

关于c - 如何初始化优先级队列(定制库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24623469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com