| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 518 人关注过本帖
标题:问个数据结构的问题
只看楼主 加入收藏
jyckder
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2010-9-16
结帖率:66.67%
收藏
 问题点数:0 回复次数:1 
问个数据结构的问题
#include <iostream.h>
#include <stdlib.h>
#include <stdio.h>

#define TRUE     1
#define FALSE    0
#define OK       1
#define ERROR    0
#define INFEASIBLE   -1
#define OVERFLOW     -2

typedef int Status;
typedef int ElemType;

#define LIST_INIT_SIZE   100  //线性表存储空间的初始分配量
#define LISTINCREMENT  10  //线性表存储空间的分配增量
typedef struct{
    ElemType   *elem;           //存储空间基址
    int                length;       //当前长度
    int                listsize;         //当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;


Status InitList_Sq(SqList &L);
Status ListInsert_Sq(SqList &L, int i, ElemType e);
Status ListDelete_Sq(SqList &L, int i, ElemType &e);
int LocateElem_Sq(SqList L, ElemType e,
        Status (*compare)(ElemType, ElemType));
void MergeList_Sq(SqList La, SqList Lb, SqList &Lc);

int deng(ElemType x,ElemType y)
{ if(x==y)return 1; else return 0;}



Status InitList_Sq(SqList &L) {  // 算法2.3
  // 构造一个空的线性表L。
  L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
  if (!L.elem) return OK;        // 存储分配失败
  L.length = 0;                  // 空表长度为0
  L.listsize = LIST_INIT_SIZE;   // 初始存储容量
  return OK;
} // InitList_Sq

Status ListInsert_Sq(SqList &L, int i, ElemType e) {  // 算法2.4
  // 在顺序线性表L的第i个元素之前插入新的元素e,
  // i的合法值为1≤i≤ListLength_Sq(L)+1
  ElemType *p;
  if (i < 1 || i > L.length+1) return ERROR;  // i值不合法
  if (L.length >= L.listsize) {   // 当前存储空间已满,增加容量
    ElemType *newbase = (ElemType *)realloc(L.elem,
        (L.listsize+LISTINCREMENT)*sizeof (ElemType));

    if (!newbase) return ERROR;   // 存储分配失败
    L.elem = newbase;   }          // 新基址
    L.listsize += LISTINCREMENT;  // 增加存储容量
  
  ElemType *q = &(L.elem[i-1]);   // q为插入位置
  for (p = &(L.elem[L.length-1]); p>=q; --p) *(p+1) = *p;
                                  // 插入位置及之后的元素右移
  *q = e;       // 插入e
  ++L.length;   // 表长增1
  return OK;
} // ListInsert_Sq

Status ListDelete_Sq(SqList &L,  int i, ElemType &e) {  // 算法2.5
  // 在顺序线性表L中删除第i个元素,并用e返回其值。
  // i的合法值为1≤i≤ListLength_Sq(L)。
  ElemType *p, *q;
  if (i<1 || i>L.length) return ERROR;  // i值不合法
  p = &(L.elem[i-1]);                   // p为被删除元素的位置
  e = *p;                               // 被删除元素的值赋给e
  q = L.elem+L.length-1;                // 表尾元素的位置
  for (++p; p<=q; ++p) *(p-1) = *p;     // 被删除元素之后的元素左移
  --L.length;                           // 表长减1
  return OK;
} // ListDelete_Sq

int LocateElem_Sq(SqList L, ElemType e,
        Status (*compare)(ElemType, ElemType)) {  // 算法2.6
  // 在顺序线性表L中查找第1个值与e满足compare()的元素的位序。
  // 若找到,则返回其在L中的位序,否则返回0。
  int i;
  ElemType *p;
  i = 1;        // i的初值为第1个元素的位序
  p = L.elem;   // p的初值为第1个元素的存储位置
  while (i <= L.length && !(*compare)(*p++, e))
    ++i;
  if (i <= L.length) return i;
  else return 0;
} // LocateElem_Sq

void Traverse(SqList L){
  //逐个输出顺序线性表L的元素。
  for(int i=0;i<L.length;i++)
      cout<<L.elem[i]<<"  ";
}


void MergeList_Sq(SqList La, SqList Lb, SqList &Lc) {  // 算法2.7
  // 已知顺序线性表La和Lb的元素按值非递减排列。
  // 归并La和Lb得到新的顺序线性表Lc,Lc的元素也按值非递减排列。
  ElemType *pa,*pb,*pc,*pa_last,*pb_last;
  pa = La.elem;  pb = Lb.elem;
  Lc.listsize = Lc.length = La.length+Lb.length;
  pc = Lc.elem = (ElemType *)malloc(Lc.listsize*sizeof(ElemType));
  if (!Lc.elem)
    exit(OVERFLOW);   // 存储分配失败
  pa_last = La.elem+La.length-1;
  pb_last = Lb.elem+Lb.length-1;
  while (pa <= pa_last && pb <= pb_last) {  // 归并
    if (*pa <= *pb) *pc++ = *pa++;
    else *pc++ = *pb++;
  }
  while (pa <= pa_last) *pc++ = *pa++;      // 插入La的剩余元素
  while (pb <= pb_last) *pc++ = *pb++;      // 插入Lb的剩余元素
} // MergeList


void main(){
    SqList La,Lb,Lc;int (*com)(ElemType ,ElemType );ElemType e;
    InitList_Sq(La);
    InitList_Sq(Lb);
    InitList_Sq(Lc);
    for(int i=1;i<=10;i++){
      ListInsert_Sq(La, i, i*2);  
      ListInsert_Sq(Lb, i, i*3);
    }
    com=deng; printf("dex=%d",LocateElem_Sq( La, 4,com));
    cout<<"\n"<<"La:";
    Traverse(La);
    cout<<"\n"<<"Lb:";
    Traverse(Lb);
   
 MergeList_Sq(La, Lb, Lc);
   cout<<"\n"<<"Lc:";
  
    Traverse(Lc);   ListDelete_Sq(Lc, 5, e);   cout<<"\n"<<"Lc:";Traverse(Lc);
}
这个代码中LocateElem_Sq(SqList L, ElemType e,
        Status (*compare)(ElemType, ElemType)的Status (*compare)(ElemType, ElemType 不是没在代码中定义 那怎么可以使用  而且它是用 来干嘛的  它的用法是怎么用
搜索更多相关主题的帖子: 数据结构 
2010-10-10 22:11
寒风中的细雨
Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17
等 级:贵宾
威 望:66
帖 子:1710
专家分:8645
注 册:2009-9-15
收藏
得分:0 
int deng(ElemType x,ElemType y)
{ if(x==y)return 1; else return 0;}

函数指针
2010-10-10 23:01
快速回复:问个数据结构的问题
数据加载中...
 
   



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

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