| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1946 人关注过本帖
标题:关于严蔚敏版数据结构教材中顺序结构线性表Locate函数的使用问题
只看楼主 加入收藏
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
回复 9楼 yangzexun24
难道是用重载吗?但是重载的话不传入参数怎么比较两个元素大小
2013-11-15 19:12
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
回答我的这几个问题:

1、这是哪本书的第几页?(C++描述、类pascal语言描述、C语言描述,到底是哪本书,严蔚敏的书貌似有好几版)

2、把所有代码都详细的贴出来,否则我没法运行,不好排错。

3、这应该是C++代码吧,怎么在C语言版面提问?

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-16 19:44
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
回复 12楼 蚕头燕尾
数据结构(C语言版) 严蔚敏 清华大学出版社
我节选跟这个函数有关的代码吧 其他无关的我就不弄上来了
-------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10

typedef int Status;
typedef int ElemType;
typedef struct{
    ElemType *elem;
    int length;
    int listsize;
}SqList;

Status InitList(SqList &L)
{
    //线性表初始化
    L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if (!L.elem) exit(OVERFLOW);
    L.length=0;
    L.listsize=LIST_INIT_SIZE;
    return OK;
}//InitList

Status compare(ElemType e1,ElemType e2)
{
    if (e1==e2)
        return 0;
    if ( e1<e2 )
        return -1;
    return 1;
}

Status LocateElem(SqList L,ElemType e,Status (*compare)(ElemType,ElemType) )
{
    int i=1;
    while( i<=L.length && (*compare)(L.elem[i-1],e) )
        i++;
    if(i<=L.length)
        return i;
    return 0;
}

Status Locate(SqList L,ElemType e)
{
    int i=1;
    while( i<=L.length && compare(L.elem[i-1],e) )
        i++;
    if(i<=L.length)
        return i;
    return 0;
}

Status ListInsert(SqList &L,int i,ElemType e)
{
    //线性表已存在 1<i<L.length
    //在第i个数据元素之前插入e,后续数据元素后移,L.length加1
    ElemType *p;
    ElemType *q;
    ElemType *newbase;
    if (i<1 || i>L.length+1)
        return ERROR;
    if(L.length>=L.listsize)
    {
        newbase=(ElemType *)realloc(L.elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
        if(!newbase) exit (OVERFLOW);
        L.elem=newbase;
        L.listsize+=LISTINCREMENT;
    }
    q=&(L.elem[i-1]);
    for( p=&(L.elem[L.length-1]);p>=q;p-- )
    {
        *(p+1)=*p;
    }
    *q=e;
    L.length++;
    return OK;
}//ListInsert

Status ShowList(SqList L)
{
    for(int i=0;i<L.length;i++)
        printf("L.elem[%d]=%d ",i,L.elem[i]);
    printf("\n");
    return OK;
}//ShowList

int main(void)
{
    ElemType e=3;
    SqList L;

    InitList(L);
    ListInsert(L,1,2);
    ListInsert(L,1,3);
    ListInsert(L,2,1);
    ShowList(L);
    if( LocateElem(L,e,(*compare)()) )
        printf("线性表中存在数据元素e=%d\n",e);
    else
        printf("线性表中不存在数据元素e=%d\n",e);
    return 0;
}
2013-11-16 23:07
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
我以前看过primary C 这本书上 好像是这个名字 一个外国人些的 中文版
看过函数指针 有函数指针这个用法 但是我忘记怎么使用了
LocateElem(L,e,(*compare)()) 这样调用肯定是没错的 严蔚敏的书上也是的
但是要怎么成功调用不知道要怎么弄
当然只是要简单的实现locateelem这个函数的功能大可不必这样做 我定义了一个lcoate函数 同样可以实现要求的功能
我就是想知道怎么样实现这个方法
2013-11-16 23:10
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
a
2013-11-18 14:25
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
C++ primer Plus

我倒是看过名字是这样的一本书

----------------------------------------华丽的分割线-------------------------------------------

函数指针本质是指针。。。。使用的时候的格式是采用解除引用的方式

Status LocateElem(SqList L,ElemType e,Status (*compare)(ElemType,ElemType) )这是你的LocateElem函数定义时候用的函数头,

if( LocateElem(L,e,(*compare)()) )这是你LocateElem函数调用时候的方式

首先:这是C语言,没有“重载”这一说。

其次:你的compare并非“函数指针”【函数指针:本质是指针,指向函数】,

      从你的代码里我找到了compare的定义时候的接口如下:

      Status compare(ElemType e1,ElemType e2)

      这里的compare只是个函数的名字嘛,标志着函数的入口地址,并非“函数指针”,不是一个档次的概念。

再次:从的回复,我猜测你好像根本也没有理解C++等语言里的“重载”的概念,建议你查一下这个概念的准确定义。
      
      顺便查一下到底什么是“函数指针”以及它的使用方式~~


祝楼主学习愉快~

【申明:其他地方没有仔细看,不保证没有错误~】

欢迎回复~

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-21 11:26
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
回复 16楼 蚕头燕尾
函数的定义是这样的 LocateElem(SqList L,ElemType e,Status (*cmp)(ElemType,ElemType) )
3个参数 L、e和(*cmp)(ElemType,ElemType)

函数指针 指向函数入口地址的指针
通常的定义是 int funcA(int,int);int(*pa)(int,int)=funcA;

我想这里的(*cmp)参数确实是函数指针
可能当函数指针当做另外一个函数参数时初始化可能用法不同 我已经找到了正确调用LocateElem函数的方法

其他的都不要改 也不用给函数指针(*cmp)初始化
只需要修改在main函数里调用LocateElem函数个方法 把原程序里相应的代码改为
LocateElem(L,e,compare)
在参数列表里,实参给形参赋值的同时已经完成了函数指针的初始化
修改完后可以成功调用并且运行
2013-11-21 16:30
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
回复 16楼 蚕头燕尾
我生搬硬套书上的LocateElem函数调用 LocateElem(L,e,(*compare)()) 是我对书上的描述没理解
因为书上并没有定义(*compare)函数指针的原函数 所以就以函数指针的形式表示第三个参数
实际第三个参数名就是原函数名 这样就可以了
2013-11-21 16:34
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
不是的,你那么做只是一种妥协的做法。我感觉并不是很妥当。

首先:这是你给函数定义的接口,Status LocateElem(SqList L,ElemType e,Status (*compare)(ElemType,ElemType))

     最后一个参数的意思是:这里需要一个函数【Status (*compare)(ElemType,ElemType)的意思是这样的:(*compare)表示compare这个函数指针当前指向的函数】
                          最后这个参数完全可以这样写:Status funcName(ElemType,ElemType),但是楼主没有想过么,为什么书上要写成上面那样,而不是我这里下面说的                                   
                          这样?就是为了提示读者,下面要用函数指针解除引用的方法去传入参数。
而你呢?我看了你前面说的,你说compare是你自己定义的一个函数,你是没有理解书上的意思:书上的本意是把compare定义成一个函数指针,而不是像你那样定义成了一个函数!

你把主函数里的函数调用部分改了,确实,这样是可以正确的运行了,但是你却误解了作者的本意。因为你把作者有意写成这样:(*compare)(ElemType,ElemType)的函数参数硬是理解成Status funcName(ElemType,ElemType)这样的。我说了,这两种形式做函数参数的话确实是等价的,但是作者的本意并非如此~~

good luck


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-21 17:54
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
http://zh.

maybe useful

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-11-21 17:57
快速回复:关于严蔚敏版数据结构教材中顺序结构线性表Locate函数的使用问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019422 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved