Question

I am having an issue with my program that cross-references a file and displays certain information in an alphabetized, numbered list. I keep getting 2 errors stating "undefined reference" for newMyTree as well as findOrInsert. I really don't know what I'm doing wrong and it is very frustrating. Can someone please help? These are the errors:

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

The code:

#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
Was it helpful?

Solution

First, in your main function you have a bunch of function prototypes:

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

They should go before the main block, but after the various structs you define.

The errors you are getting are is because the compiler can't find the functions findOrInsert and newMyTree anywhere. If you have written them in another file (a header for example) you need to include that file in this with a #include "your_header.h" at the top. Either that or provide an implementation for them in your .c file like you have done with getWord and inOrder for instance.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top