名称:顺序表的结构定义和基本操作
当前版本:1.1
开发平台:Windows 7 Ultimate RC
开发环境:Visual Studio 2008 SP1
作者:毛晋
完成日期:2009年9月24日
历史版本
1.0 完成日期:2009年9月23日
//SqList.h
- #include "windows.h"
- #include "iostream"
- using namespace std;
- //常量值定义
- #define OK 1
- #define ERROR 0
- #define TRUE 1
- #define FALSE 0
- #define OVERFLOW -1
- #define UNDERFLOW -2
- #define LIST_INIT_SIZE 100
- #define LISTINCREMENT 10
- //函数返回值类型定义
- typedef INT Status;
- //数据元素类型定义
- typedef INT ElemType;
- #pragma once
- //顺序表结构定义
- typedef struct{
- ElemType *elem;
- LONG length;
- LONG size;
- }SqList;
- //辅助函数的声明
- bool compare(ElemType,ElemType);//比较两个元素,看是否满足指定的条件
- typedef bool (*pCompare)(ElemType,ElemType); //函数指针
- Status output(ElemType);//输出数据元素
- typedef Status (*pOutput)(ElemType);
- //顺序表基本操作的声明
- Status InitList(SqList&,LONG);//初始化顺序表
- Status DestroyList(SqList&);//销毁顺序表
- Status ClearList(SqList&);//清空顺序表
- bool ListEmpty(SqList&);//判断顺序表是否为空
- LONG ListLength(SqList&);//获取顺序表的长度
- Status GetElem(SqList&,LONG,ElemType&);//随机访问顺序表中的元素
- Status LocateElem(SqList&,ElemType,LONG&,pCompare);//按指定的规则在顺序表中查找元素
- Status PriorElem(SqList&,ElemType,ElemType&);//返回指定元素的前驱
- Status NextElem(SqList&,ElemType,ElemType&);//返回指定元素的后继
- Status ListInsert(SqList&,LONG,ElemType);//在顺序表中的指定位序的元素之前插入一个元素
- Status ListDelete(SqList&,LONG,ElemType&);//删除顺序表中指定位序的元素,并返回该元素
- Status ListTraverse(SqList&,pOutput);//遍历顺序表,并将每个数据元素输出
//SqList.cpp
- //顺序表的基本操作
- #include "stdafx.h"
- #include "SqList.h"
- bool compare(ElemType e1,ElemType e2)
- //操作结果:比较e1和e2是否相等,若相等,返回TRUE;否则,返回FALSE
- {
- if(e1==e2)
- return TRUE;
- else
- return FALSE;
- }
- Status output(ElemType e)
- //操作结果:将e在屏幕上输出
- {
- cout<<e<<" ";
- return OK;
- }
- Status InitList(SqList &L,LONG _size)
- //操作结果:构造一个空的线性表L,按照指定的大小分配存储空间
- {
- L.elem=(ElemType*)malloc(_size*sizeof(ElemType));
- if(L.elem==NULL){
- cout<<"顺序表初始化失败"<<endl;
- exit(OVERFLOW);
- }
- L.length=0;
- L.size=_size;
- return OK;
- }
- Status DestroyList(SqList &L)
- //初始条件:线性表L已存在
- //操作结果:销毁线性表
- {
- free(L.elem);
- L.elem=NULL;
- L.length=0;
- L.size=0;
- return OK;
- }
- Status ClearList(SqList &L)
- //初始条件:线性表L已存在
- //操作结果:将L置为空表
- {
- free(L.elem);
- L.elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));//重新分配预设的LIST_INIT_SIZE大小的存储空间
- if(L.elem==NULL){
- cout<<"存储空间分配失败"<<endl;
- return ERROR;
- }
- L.length=0;
- L.size=LIST_INIT_SIZE;
- return OK;
- }
- bool ListEmpty(SqList &L)
- //初始条件:线性表L已存在
- //操作结果:若L为空表,则返回TRUE;否则,返回FALSE
- {
- if(L.length!=0)
- return FALSE;
- else
- return TRUE;
- }
- LONG ListLength(SqList &L)
- //初始条件:线性表L已存在
- //操作结果:返回L中数据元素的个数
- {
- return L.length;
- }
- Status GetElem(SqList &L,LONG index,ElemType &e)
- //初始条件:线性表L已存在,1<=index<=ListLength(L)
- //操作结果:用e返回L中第i个数据元素的值
- {
- if((index < 1) || (index>L.length)){
- cout<<"查找位置不合理!"<<endl;
- return ERROR;
- }
- e=L.elem[index-1];
- return OK;
- }
- Status LocateElem(SqList &L,ElemType e,LONG &pos,pCompare comFun)
- //初始条件:线性表L已存在,comFun是指向compare()函数的指针
- //操作结果:返回L中第1个与e满足关系compare()的数据元素的位置。若这样的数据元素
- //不存在,返回ERROR
- {
- LONG i=0;
- for(;(i < L.length) && (comFun(e,L.elem[i])==FALSE);i++)
- ;
- if(i>L.length-1){
- cout<<"未找到元素"<<endl;
- return ERROR;
- }
- else{
- pos=i;
- return OK;
- }
- }
- Status PriorElem(SqList &L,ElemType e,ElemType &priElem)
- //初始条件:线性表L已存在
- //操作结果:若e是L的数据元素,且不是第一个,则用priElem返回它的前驱,否则,操作失败。
- {
- LONG i;
- if(LocateElem(L,e,i,compare)==ERROR)
- return ERROR;
- if(i==0){
- cout<<"该元素不存在前驱"<<endl;
- return ERROR;
- }
- priElem=L.elem[i-1];
- return OK;
- }
- Status NextElem(SqList &L,ElemType e,ElemType &nextElem)
- //初始条件:线性表L已存在
- //操作结果:若e是L的数据元素,且不是最后一个,则用nextElem返回它的后继,否则,操作失败
- {
- LONG i;
- if(LocateElem(L,e,i,compare)==ERROR)
- return ERROR;
- if(i==L.length-1){
- cout<<"该元素不存在后继"<<endl;
- return ERROR;
- }
- nextElem=L.elem[i+1];
- return OK;
- }
- Status ListInsert(SqList &L,LONG index,ElemType e)
- //初始条件:线性表L已存在,1<=i<=ListLength(L)+1
- //操作结果:在L中的第i个元素之前插入新的数据元素e,L的长度加1
- {
- if((index<1) || (index>L.length+1)){
- cout<<"插入的位置不合理"<<endl;
- return ERROR;
- }
- if(L.length>=L.size){
- ElemType *newbase=(ElemType*)realloc(L.elem,
- (L.size+LISTINCREMENT)*sizeof(ElemType));
- if(newbase==NULL){
- cout<<"增量存储空间分配失败"<<endl;
- exit(OVERFLOW);
- }
- else{
- L.elem=newbase;
- L.size+=LISTINCREMENT;
- }
- }
- //移动元素
- int i=L.length;
- for(;i>index-1;i--)
- L.elem[i]=L.elem[i-1];
- //插入元素
- L.elem[index-1]=e;
- //修改表长
- L.length++;
- return OK;
- }
- Status ListDelete(SqList &L,LONG index,ElemType &e)
- //初始条件:线性表L已存在且非空,1<=i<=ListLength(L)
- //操作结果:删除L的第i个元素,并用e返回其值,L的长度减1
- {
- if((index<1) || (index>L.length)){
- cout<<"删除的位序不合理"<<endl;
- return ERROR;
- }
- if(L.length == 0){
- cout<<"顺序表为空,删除错误"<<endl;
- exit(UNDERFLOW);
- }
- e=L.elem[index-1];
- int i=index-1;
- for(;i<L.length-1;i++)
- L.elem[i]=L.elem[i+1];
- //修改表长
- L.length--;
- return OK;
- }
- Status ListTraverse(SqList &L,pOutput outFun)
- //初始条件:线性表L已存在
- //操作结果:依次对L的每个数据元素调用函数output()。
- {
- if(L.length == 0){
- cout<<"顺序表为空,遍历失败"<<endl;
- return ERROR;
- }
- for(int i=0;i<L.length;i++)
- outFun(L.elem[i]);
- cout<<endl;
- return OK;
- }
test.cpp
- #include "stdafx.h"
- #include "windows.h"
- #include "SqList.h"
- #include "time.h"
- INT RangedRand( int range_min, int range_max)
- //copy from:msdn library
- {
- // Generate random numbers in the half-closed interval
- // [range_min, range_max). In other words,
- // range_min <= random number < range_max
- INT u = (double)rand() / (RAND_MAX + 1) * (range_max - range_min)
- + range_min;
- return u;
- }
- int main()
- {
- DWORD start_time,finish_time;
- start_time=::GetTickCount(); //获得系统此刻的运行时间,单位:毫秒
- SqList L1,L2;
- InitList(L1,1e3);
- InitList(L2,1e3);
- srand( (unsigned)time( NULL ) );//设置随机种子
- ElemType data1[100000];
- ElemType data2[100000];
- for(LONG i=0;i<1e5;i++){
- data1[i]=RangedRand(-1000,1000);
- ListInsert(L1,1,data1[i]);
- data2[i]=RangedRand(-1000,1000);
- ListInsert(L2,1,data2[i]);
- }
- cout<<"L1:"<<endl;
- ListTraverse(L1,output);
- cout<<"L1的长度为:"<<ListLength(L1)<<endl;
- cout<<"L2:"<<endl;
- ListTraverse(L2,output);
- cout<<"L2的长度为:"<<ListLength(L2)<<endl;
- //调试运行,比较不同之处
- DestroyList(L1);
- ClearList(L2);
- finish_time=::GetTickCount();//获得系统此刻的运行时间,单位:毫秒
- cout<<"程序运行的时间为:"<<finish_time-start_time<<"毫秒"<<endl;
- return OK;
- }