| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1960 人关注过本帖
标题:关于严蔚敏版数据结构教材中顺序结构线性表Locate函数的使用问题
取消只看楼主 加入收藏
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
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
yangzexun24
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2010-12-15
收藏
得分:0 
回复 20楼 蚕头燕尾
论坛的帖子回复是不是没有消息提示 真不好找
每次要一页页翻 找到那篇帖子
要是发帖量多的话 都沉底找不到了
2013-11-25 14:55
快速回复:关于严蔚敏版数据结构教材中顺序结构线性表Locate函数的使用问题
数据加载中...
 
   



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

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