一道数据结构的简单的编程题

时间:2022-10-06 10:27:20
#include <iostream.h>
#include <assert.h>

template <class NODETYPE>
class List
{
typedef bool (*COMPAREFUNC)(NODETYPE compnum,NODETYPE arraynum);
typedef bool (*TRAVERFUNC)(NODETYPE);
 public:
 List(int number);
 ~List();
 bool DestroyList(); //销毁链表
 bool ClearList(); //清空链表
 bool ListEmpty(); //测试是否为空
 int ListLength();
 bool GetElem(int i,NODETYPE &node); //得到第i个节点的值
 NODETYPE GetElem(int i);                       //得到第i个节点的值
 int LocateElem(NODETYPE node,COMPAREFUNC compare);     //比较node与链表中的值,返回第一个满足条件的节点的位置
 NODETYPE GetPriorElem(NODETYPE  cur_e); //返回上一个节点
 NODETYPE GetNextElem(NODETYPE  cur_e); //返回下一个节点
 bool ListInsert(int i,NODETYPE node);          //在i位子插入值
 bool ListDelete(int i);                        //删除i节点的值
 bool ListTraverse(TRAVERFUNC visit);           //遍历节点
 bool CompareEqual(NODETYPE compnum,NODETYPE arraynum);     //等于比较
 bool CompareAbove(NODETYPE compnum,NODETYPE arraynum);     // 大于比较
 bool CompareBelow(NODETYPE compnum,NODETYPE arraynum);     //小于比较

 private:
 NODETYPE *array;
 int length;                          //申请空间大小
 int cur_length;                      //当前长度
};

template <class NODETYPE>
List<NODETYPE>::List(int number)
{
array=new NODETYPE[number];
length=number;
cur_length=0;
cout<<"constructor is used"<<endl;
}
template <class NODETYPE>
bool List<NODETYPE>::ListInsert(int i,NODETYPE node)
{

if(i>-1&&i<=cur_length&&cur_length<length)
{
cur_length++;
for(int k=cur_length;k>i;k--)
array[k]=array[k-1];
array[i]=node;
return true;
}
return false;
}
template <class NODETYPE>
int  List<NODETYPE>::LocateElem(NODETYPE node,COMPAREFUNC compare)
{
for(int i=0;i<cur_length;i++)
if(compare(node,array[i]))
return i;
else return -1;
}
template <class NODETYPE>
bool List<NODETYPE>::CompareEqual(NODETYPE compnum,NODETYPE arraynum)
{
if(compnum==arraynum)
return true;
else return false;
}
void main()
{
List<int> a(30);
for(int i=0;i<20;i++)
a.ListInsert(i,i);

cout<<a.GetElem(LocateElem(9,a.CompareEqual));


}

为什么编译的时候会出现
e:\code\cpp11.cpp(77) : error C2065: 'LocateElem' : undeclared identifier
这样的错呀。


22 个解决方案

#1


LocateElem是类的一个成员函数呀,怎么可以这么调用呢?得给它个对象吧!
太粗心了。

#2


'LocateElem是成员函数,不能直接调用,用对象调用吧

#3


谢谢楼上指点。但是我把cout<<a.GetElem(LocateElem(9,a.CompareEqual));
改为cout<<a.GetElem(a.LocateElem(9,a.CompareEqual));

却发现E:\code\Cpp1.cpp(204) : error C2664: 'LocateElem' : cannot convert parameter 2 from 'bool (int,int)' to 'bool (__cdecl *)(int,int)'
这是什么意思,望高手指点

#4


问两个问题
调用头文件是干什么用的
还有你的类中的
typedef bool (*COMPAREFUNC)(NODETYPE compnum,NODETYPE arraynum);
是什么意思  为什么后面还有(NODETYPE compnum,NODETYPE arraynum);

谢谢

#5


意思是说你的=两边的值类型不匹配。

#6


to  znnren(小宁宁) 
typedef bool (*COMPAREFUNC)(NODETYPE compnum,NODETYPE arraynum);这是定义了函数指针类型COMPAREFUNC

头文件在其他函数定义中会用到

#7


望高人帮我修改一下。在下感激!!!!!!!!!!!!

#8


int i = a.GetElem(a.LocateElem(9,a.CompareEqual));
cout<<a.GetElem(i);

#9


楼上的我试了,但是还是发生一样的错误

#10


帮忙呀!!!!!!!!!!!!!!

#11


help

#12


help

#13


问题解决了九散分

#14


很复杂

#15


为什么会这样呀???????

#16


会不会是 函数指针的问题呀?

#17


帮忙呀!

#18


这是因为函数
bool CompareEqual(NODETYPE compnum,NODETYPE arraynum);
是一个成员函数,具有隐含的this指针,而你定义的函数指针
typedef bool (*COMPAREFUNC)(NODETYPE compnum,NODETYPE arraynum);
只有两个参数引起的

#19



cout<<a.GetElem(a.LocateElem(9,a.CompareEqual));

你的CompareEqual也是个函数吧  既然是 那么后面为什么没有()呢!?
按照你的代码,应该是还包含参数的!
是吧!
仔细看看哦!

#20


我还是给你举个简单的例子吧
class CTest
{
typedef int (*pf_type)(int a,int b);
public:
int kkkk(int a,pf_type pfunc){return a;}
int mFun(int a,int b){return a;}
};


int main(void)
{
CTest  test;

test.kkkk(3,test.mFun);

return 1;
}
此程序编译会发生如下情况:
Compiling...
Text1.cpp
F:\guobf\patch\Text1.cpp(15) : error C2664: 'kkkk' : cannot convert parameter 2 from 'int (int,int)' to 'int (__cdecl *)(int,int)'
        None of the functions with this name in scope match the target type
Error executing cl.exe.

Text1.exe - 1 error(s), 0 warning(s)

改成下面以后编译通过
class CTest
{
typedef int (*pf_type)(int a,int b);
public:
int kkkk(int a,pf_type pfunc){return a;}
static int mFun(int a,int b){return a;}
};


int main(void)
{
CTest  test;

test.kkkk(3,test.mFun);

return 1;
}

说到底,就是类的非静态成员函数搞的鬼

#21


因为非静态成员函数暗含了this指针

#22


是不是可以结帖拉?

#1


LocateElem是类的一个成员函数呀,怎么可以这么调用呢?得给它个对象吧!
太粗心了。

#2


'LocateElem是成员函数,不能直接调用,用对象调用吧

#3


谢谢楼上指点。但是我把cout<<a.GetElem(LocateElem(9,a.CompareEqual));
改为cout<<a.GetElem(a.LocateElem(9,a.CompareEqual));

却发现E:\code\Cpp1.cpp(204) : error C2664: 'LocateElem' : cannot convert parameter 2 from 'bool (int,int)' to 'bool (__cdecl *)(int,int)'
这是什么意思,望高手指点

#4


问两个问题
调用头文件是干什么用的
还有你的类中的
typedef bool (*COMPAREFUNC)(NODETYPE compnum,NODETYPE arraynum);
是什么意思  为什么后面还有(NODETYPE compnum,NODETYPE arraynum);

谢谢

#5


意思是说你的=两边的值类型不匹配。

#6


to  znnren(小宁宁) 
typedef bool (*COMPAREFUNC)(NODETYPE compnum,NODETYPE arraynum);这是定义了函数指针类型COMPAREFUNC

头文件在其他函数定义中会用到

#7


望高人帮我修改一下。在下感激!!!!!!!!!!!!

#8


int i = a.GetElem(a.LocateElem(9,a.CompareEqual));
cout<<a.GetElem(i);

#9


楼上的我试了,但是还是发生一样的错误

#10


帮忙呀!!!!!!!!!!!!!!

#11


help

#12


help

#13


问题解决了九散分

#14


很复杂

#15


为什么会这样呀???????

#16


会不会是 函数指针的问题呀?

#17


帮忙呀!

#18


这是因为函数
bool CompareEqual(NODETYPE compnum,NODETYPE arraynum);
是一个成员函数,具有隐含的this指针,而你定义的函数指针
typedef bool (*COMPAREFUNC)(NODETYPE compnum,NODETYPE arraynum);
只有两个参数引起的

#19



cout<<a.GetElem(a.LocateElem(9,a.CompareEqual));

你的CompareEqual也是个函数吧  既然是 那么后面为什么没有()呢!?
按照你的代码,应该是还包含参数的!
是吧!
仔细看看哦!

#20


我还是给你举个简单的例子吧
class CTest
{
typedef int (*pf_type)(int a,int b);
public:
int kkkk(int a,pf_type pfunc){return a;}
int mFun(int a,int b){return a;}
};


int main(void)
{
CTest  test;

test.kkkk(3,test.mFun);

return 1;
}
此程序编译会发生如下情况:
Compiling...
Text1.cpp
F:\guobf\patch\Text1.cpp(15) : error C2664: 'kkkk' : cannot convert parameter 2 from 'int (int,int)' to 'int (__cdecl *)(int,int)'
        None of the functions with this name in scope match the target type
Error executing cl.exe.

Text1.exe - 1 error(s), 0 warning(s)

改成下面以后编译通过
class CTest
{
typedef int (*pf_type)(int a,int b);
public:
int kkkk(int a,pf_type pfunc){return a;}
static int mFun(int a,int b){return a;}
};


int main(void)
{
CTest  test;

test.kkkk(3,test.mFun);

return 1;
}

说到底,就是类的非静态成员函数搞的鬼

#21


因为非静态成员函数暗含了this指针

#22


是不是可以结帖拉?