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

顺序表问题解决不了

cwl168 发布于 2012-12-26 21:16, 374 次点击
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR
#define OVERFLOW
typedef struct SqList
{
    int * elem;
    int length;
    int listsize;
}SqList;
//顺序表的初始化
void IntiList(SqList *L)
{
      L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
      if(!L->elem) exit(0);
      L->length=0;
      L->listsize=LIST_INIT_SIZE;
      printf("InitList Success!\n");
}
//书序表的插入
void ListInsert(SqList *L,int i,int e)
{
      int *p,*q,*newbase;
      if(i<1||i>L->length+1)  
          exit(0);
      if(L->length>=L->listsize)
      {
           newbase=(int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof(int));
           if(!newbase) exit(0);
           L->elem=newbase;
           L->listsize+=LISTINCREMENT;
      }
      q=&(L->elem[i-1]);
      for(p=&(L->elem[L->length-1]);p>=q;--p)//元素往右移动
          *(p+1)=*q;
      *q=e;
      ++L->length;
      printf("ListInsert Success!\n");
}
//顺序表的遍历
void ListTravese(SqList *L)
{
      for(int i=0;i<=L->length-1;i++)
          printf("%d ",L->elem[i]);
}
//顺序表的删除
void ListDelete(SqList *L,int i, int e)
{
     int *p,*q;
     if(i<1||(i>L->length+1)) exit(0);
     p=&(L->elem[i-1]);
     e=*p;
     q=&(L->elem[L->length-1]);//等价于q=L->elem+L->length-1
     for(++p;p<=q;++p)
         *(p-1)=*p;
     --L->length;

}
//顺序表的定位
int LocateElem_Sq(SqList *L,int e,int(*compare)(int,int))
{
    int i=1,*p;
    p=L->elem;
    while(i<=L->length && !(compare)(*p++,e))
        ++i;
    if(i<=L->length) return i;
    else return 0;
}
//顺序表的长度
int ListLength(SqList *L)
{
    return L->length;
}
//顺序表置为空表
int ClearList(SqList *L)
{
     L->length=0;
     return OK;
}
//顺序表的销毁
int DestroyList(SqList *L)
{
     free(L->elem);
     L->elem=NULL;
     L->length=0;
     L->listsize=0;
     return OK;
}
int main()
{  
    SqList L;
    IntiList(&L);
    ListInsert(&L,1,1);
    ListInsert(&L,2,2);
    ListInsert(&L,3,3);
    ListInsert(&L,4,4);
    ListInsert(&L,5,5);
    ListInsert(&L,6,6);
    ListInsert(&L,7,7);
    ListInsert(&L,8,8);
    ListTravese(&L);
    ListDelete(&L,2,2);
    ListLength(&L);
    printf("\n");
    ListTravese(&L);
  //  printf("the postion is:%d",LocateElem_Sq(&L,7,compare));
    return 0;
}
这段程序中这块什么意思int LocateElem_Sq(SqList *L,int e,int(*compare)(int,int))
{
    int i=1,*p;
    p=L->elem;
    while(i<=L->length && !(compare)(*p++,e))
        ++i;
    if(i<=L->length) return i;
    else return 0;
}
我知道其他的方法可以写,如果是这种方法定位,该怎么写啊
尤其是int(*compare)(int,int))

4 回复
#2
寒风中的细雨2012-12-27 09:01
传递参数  只不过传递的是函数指针
#3
a1511412012-12-30 10:17
compare()是个函数。具体要表示大于,小于,或其他关系,自己定义。
#4
不玩虚的2013-01-02 14:50
顺序表指的是数组实现的楼主,链表用指针实现的。数组是没有办法实现元素的插入,删除。能删的也只是假删。链表可以。所以楼主的不是顺序表而是链表。
#5
不玩虚的2013-01-02 14:52
不相信请看数据结构的教材。
1