Linux下undefined reference to错误

Chinaxjdyh 2011-05-08 08:56:47
各位:我在写一个双向链表程序。里面有一个FindElebyIndex 函数,是用来查找链表中指定序号元素的,但是我在编译连接时提示如下错误:
/tmp/ccSh2r0h.o: In function `main':
DoubleLinkList.c:(.text+0x2ee): undefined reference to `FindEleByIndex'
collect2: ld returned 1 exit status

我使用的命令是
gcc DoubleLinkList.c -o DoubleLinkList

然而我把这个函数注释后重新编译通过,然后取消注释,编译也通过,并且运行结果正确。可是不知这里面发生了什么。请有过类似经验的大牛告诉我为什么会这样。为什么注释后编译链接,再取消注释重新编译链接就好了呢?
我在网上搜这个错误,说是链接错误,但不知道错在了那里。

这是我的源代码:
//2011/05/08
//DoubleList的实现和基本操作。包括查找,删除,增加等。

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

#define True 1
#define False 0
#define null NULL

typedef struct DNode
{
int data;
struct DNode* prior; //前驱结点
struct DNode* next; //后继结点
}DLinkList;

//void PrintDl(DLinkList* dl);

//头插法建表
int CreateDoubleLinkList_head(DLinkList *dl,int n)
{
DLinkList* s;int i;
dl->next=null;
dl->prior=null;
for(i=0;i<n;++i)
{
s=(DLinkList*)malloc(sizeof(DLinkList));
scanf("%d",&(s->data));
s->next=dl->next; //s的前驱指向下一个结点
s->prior=dl; //s插入头结点之后
dl->next=s; //dl指向刚插入的结点
if(s->next!=null)
{
s->next->prior=s; //若插入结点的下一个结点不为空,则后继结点的前驱指针域指向s
}
//printf("%d\n",dl->data);
}
// PrintDl(dl);
return True;
}

//尾插法
int CreateDoubleLinkList_tail(DLinkList *dl,int n)
{
DLinkList *s,*r;
int i=0;
dl->next=null;
dl->prior=null;
r=dl;
for(i=0;i<n;++i)
{
s=(DLinkList*)malloc(sizeof(DLinkList));
scanf("%d",&(s->data));
r->next=s; //插入尾结点之后
s->prior=r; //修改s的前驱指针域
r=s;
}
r->next=null; //尾结点next域设为空
return True;
}

//这里貌似出了一个链接错误:
///tmp/ccSh2r0h.o: In function `main':
//DoubleLinkList.c:(.text+0x2ee): undefined reference to `FindEleByIndex'
//collect2: ld returned 1 exit status
//不知是何原因,重新注释这个函数后就正确了。
//按序号查找第n个元素
int FindElebyIndex(DLinkList* dl,int index,int *element)
{

int i=0;
DLinkList* s=dl;

while(s!=null&&i<index)
{
++i;
s=s->next;
}

if(s==null)
{
return False;
}

*element=s->data;

return True;
}

//Print DL
void PrintDl(DLinkList* dl)
{
DLinkList* s=dl->next;
while(s!=null)
{
printf("%d\n",s->data);
s=s->next;
}
}

//Test
int main()
{
//头插法建表
DLinkList* dl =(DLinkList*)malloc(sizeof(DLinkList)); //建立带头结点的双向链表
printf("输入你想要建表的结点个数:\n");
int num=0;
scanf("%d",&num);
printf("输入这%d数:\n",num);
CreateDoubleLinkList_head(dl,num);//头插法建表
printf("链表中有的元素为:\n");
PrintDl(dl);
printf("====================================================\n");
//尾插法建表
DLinkList* doublelist=(DLinkList*)malloc(sizeof(DLinkList)); //建立带头结点的双向链表
printf("输入你想要建表的结点个数:\n");
int count=0;
scanf("%d",&count);
printf("输入这%d数:\n",count);
CreateDoubleLinkList_tail(doublelist,count);//头插法建表
printf("链表中有的元素为:\n");
PrintDl(doublelist);
//查找第n个元素并打印
int n;
printf("输入你想找的元素序号:");
scanf("%d",&n);
int x=0;
int *e=&x;
FindElebyIndex(doublelist,n,e);
printf("您想找的元素为:%d\n",*e);

return 0;
}

...全文
597 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chinaxjdyh 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bargio_susie 的回复:]

//不知是何原因,重新注释这个函数后就正确了


这个的意思是原来那个函数是注释掉了,现在把它还原回来吗?
[/Quote]
注释掉编译通过,取消注释编译就通过了。。。
bargio_susie 2011-05-08
  • 打赏
  • 举报
回复
//不知是何原因,重新注释这个函数后就正确了


这个的意思是原来那个函数是注释掉了,现在把它还原回来吗?
Chinaxjdyh 2011-05-08
  • 打赏
  • 举报
回复
请各位解答~谢谢

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧