我的程序存在问题,该程序交叉引用文件并在按字母顺序排列的编号列表中显示某些信息。我一直收到2条错误,指出newMyTree
以及findOrInsert
的“未定义引用”。我真的不知道我做错了什么,这非常令人沮丧。有人可以帮忙吗?这些是错误:
C:\**\**\**\**\crossref.o:crossref.c|| undefined reference to newMyTree|
C:\**\**\**\**\crossref.o:crossref.c|| undefined reference to findOrInsert|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 3 second(s)) ===|
代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#define MaxWordSize 20
#define MaxLine 101
typedef struct listLinked{
int numLine;
struct listLinked*next;
}ListLinked,*ListLinkedPtr;
typedef struct{
char word[MaxWordSize+1];
ListLinkedPtr firstLine;
}NodeData;
typedef struct MyTree{
NodeData data;
struct MyTree*left,*right;
}MyTree,*MyTreePtr;
typedef struct{
MyTreePtr root;
}BinaryTree;
main(){
int getWord(char[], char[]);
MyTreePtr newMyTree(NodeData);
NodeData newNodeData(char[]);
MyTreePtr findOrInsert(BinaryTree, NodeData), node;
ListLinkedPtr newListLinked(int);
void inOrder(FILE*, MyTreePtr);
char word[MaxWordSize+1];
char line[MaxLine];
int currentLine = 0;
FILE*in = fopen("passage.in","r");
FILE*out = fopen("passage.out","w");
BinaryTree bst;
bst.root = NULL;
while (fgets(line, MaxLine, in)!= NULL){
fprintf(out,"%3d. %s\n",++currentLine, line);
//extract words from current line
while (getWord(line, word)!= 0){
if (bst.root == NULL)
bst.root = node = newMyTree(newNodeData(word));
else
node = findOrInsert(bst,newNodeData(word));
ListLinkedPtr ptr = newListLinked(currentLine);
ptr -> next = node -> data.firstLine;
node -> data.firstLine = ptr;
}
}
fprintf(out, "\nWords Line numbers\n\n");
inOrder(out, bst.root);
fclose(in); fclose(out);
}//close main
int getWord(char line[], char str[]){
//finds the next word in line and stores it in str
//returns 1 if a word is found; 0 otherwise
static int p = 0; //p retains its value between calls to getWord
char ch;
int n = 0;
//skips over non-letters
while (line[p]!= '\0' &&!isalpha(line[p]))p++;
if (line[p]!='\0')return p = 0; //reset p for the next line
str[n++] = tolower(line[p++]);
while (isalpha(line[p])){
if(n < MaxWordSize)str[n++]= tolower(line[p]);
p++;
}
str[n]= '\0';
return 1;
}//end getWord
void inOrder(FILE*out, MyTreePtr node){
void printAWord(FILE*, MyTreePtr);
if (node!= NULL){
inOrder(out, node -> left);
printAWord(out, node);
inOrder(out, node -> right);
}
}//end inOrder
void printAWord(FILE* out, MyTreePtr pt){
void printLineNumbers(FILE*,ListLinkedPtr);
fprintf(out,"%-20s", pt -> data.firstLine -> next); //print all except first
fprintf(out, "%3d\n", pt -> data.firstLine -> numLine);//print first
}//end printAWord
void printLineNumbers(FILE* out, ListLinkedPtr top){
//line numbers are in reverse order; print list reversed
if (top != NULL){
printLineNumbers(out, top -> next);
fprintf(out, "%3d,", top -> numLine);
}
}//end printLineNumbers
NodeData newNodeData(char str[]){
NodeData temp;
strcpy(temp.word, str);
temp.firstLine = NULL;
return temp;
}//end newNodeData
ListLinkedPtr newListLinked(int lineNo){
ListLinkedPtr p = (ListLinkedPtr) malloc(sizeof(ListLinked));
p -> numLine = lineNo;
p -> next = NULL;
return p;
}//end of newListLinked
答案 0 :(得分:1)
首先,在你的main函数中,你有一堆函数原型:
int getWord(char[], char[]);
MyTreePtr newMyTree(NodeData);
NodeData newNodeData(char[]);
MyTreePtr findOrInsert(BinaryTree, NodeData); // this line had some typos...
ListLinkedPtr newListLinked(int);
void inOrder(FILE*, MyTreePtr);
它们应该在main
块之前,但在您定义的各种结构之后。
您得到的错误是因为编译器无法在任何地方找到函数findOrInsert
和newMyTree
。如果您已将它们写入另一个文件(例如标题),则需要在其中包含该文件,并在顶部添加#include "your_header.h"
。要么是这样,要么在.c文件中为它们提供实现,就像您使用getWord
和inOrder
一样。