注册 登录
编程论坛 数据结构与算法

新手线性表 LocateElem中 compare 定义?

啊忠 发布于 2011-10-17 20:28, 1422 次点击
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 30
#define LISTINCREMENT 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef struct{
    ElemType *elem;
    int length;
    int listsize;
}SqList;
Status InitList(SqList *pL){
    (*pL).elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
    if(!(*pL).elem) return OVERFLOW;
    (*pL).length=0;
    (*pL).listsize=0;
    return OK;
}
int ListLength(SqList *pL){
    return pL->length;
}

void GetElem(SqList *pL,int i,ElemType *e)
{
    if((i>=1)&&(i<=(*pL).length))
        *e=(*pL).elem[i-1];
   
}
Status ListInsert(SqList *pL,int i,ElemType e)
{
    int *p,*q,*newbase;
    if(i<1||(i>(*pL).length+1))
        return ERROR;
    if((*pL).length>=(*pL).listsize)
    {    newbase=(int *)realloc((*pL).elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(ElemType));
        if(!(newbase)) return OVERFLOW;
        (*pL).elem=newbase;
        (*pL).listsize+=LISTINCREMENT;
      }
    p=&((*pL).elem[i-1]);
    q=(*pL).elem+(*pL).length-1;
    for(q;q>=p;--q)
        *(q+1)=*q;
    *p=e;
    ++(*pL).length;
    return OK;
}

int compare(ElemType * e1, ElemType * e2)
{//测试函数,返回要查找的元素
    return (*e1 - *e2);
}

int LocateElem(SqList *pL,ElemType e,int (*compare)(ElemType *,ElemType *))
{
    int i;
    ElemType *p;
    i=1;
    p=(*pL).elem;
    while (i<=(*pL).length&&(*compare )(p++ ,&e))
        ++i;
    if(i<=(*pL).length)
        return i;
    else return 0;
}

初学数据结构,对红色部分写法不懂,蓝色部分上网找的 compare 定义,老师没讲 compare中 return (*e1 - *e2); 很不理解啊,这什么用,看了好久也看不懂。谁教教我 compare 简单的定义 有吗  大家帮帮哦
1 回复
#2
leizisdu2011-10-18 22:25
回复 楼主 啊忠
红色部分是一个指向函数的指针,做函数LocateElem的参数,它指向的函数有两个参数,参数类型是ElemType *,而且它指向的函数有返回值,返回值类型是int型。
蓝色部分compare函数体:return (*e1 - *e2);所以,如果(*e1 == *e2)则函数返回值等于0,其他情况返回值不等于0。函数LocateElem中:
while (i<=(*pL).length && (*compare)(p++, &e)) ++i;
当i<=(*pL).length同时compare函数返回0时,while循环也会退出,表明在线性表中找到了e。
我也是新手,不知道说的对不对,你看看是这样吗?
1