线性表的顺序表示与实现

#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define MYOVERFLOW -2
typedef int Status;
typedef int Elemtype;//用指定标识符Elemtype代表int类型,顾名思义表示元素类型为int型
typedef struct{      //在struct之前用了关键字typedef,表明是声明新类型名,新类型名为SqList
    Elemtype *elem;  //在新类型SqList中,有三个数据,一个为指向数据元素的指针,也是储存空间基址
    int length;      //当前长度
    int listsize;    //当前分配的储存容量(以sizeof(ElemType)为单位)
}SqList;
int compare(SqList l, Elemtype e);//用来比较的函数,现在选用==
bool visit(SqList L);   //遍历表中的数据元素
Status InitList(SqList &L);//构造一个空的线性表
Status DestroyList(SqList &L);//摧毁线性表L
Status ClearList(SqList &L);//将L重置为空表
bool ListEmpty(SqList L);//若L为空表,则返回TRUE,否则返回FALSE
int ListLength(SqList L);//返回L中的数据元素个数
Status GetElem(SqList L, int i, Elemtype &e);//用e返回L中第i个数据元素的值
int LocateElem(SqList L, Elemtype e, int compare(SqList l, Elemtype e));//返回L中第一个与e满足关系compare()的数据元素的
                                                                        //位序。若这样的元素不存在,则返回值为0
Status PriorElem(SqList L, Elemtype cur_e, Elemtype &pre_e);//若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱
                                                            //,否则操作失败,pre_e无定义
Status NextElem(SqList L, Elemtype cur_e, Elemtype &next_e);//若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
                                                            //若操作失败,next_e无定义
Status ListInsert(SqList &L, int i, Elemtype e);  //在L中第i个位置之前插入新的数据元素e,L的长度加1
Status ListDelete(SqList &L, int i, Elemtype &e); //删除L的第i个数据元素,并用e返回其值,L的长度减1
void   ListTraverse(SqList L, bool (*p)(SqList L));    //依次对L的每个数据元素调用visit(),一旦visit()失败,则操作失败

int compare(SqList l, Elemtype e)//用来比较的函数,现在选用==
{
    int position=0;//表中没有元素e时,返回position=0
    for (int i = 0; i < l.length; i++){
        if (e == *(l.elem + i)){//找到e的位置,按照平常人的习惯,将i+1赋给position
            position = i + 1;
            break;
        }
    }
    return position;
}
bool visit(SqList L){   //遍历表中的数据元素
    if (!(&L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        return FALSE;
    }
    if (L.length == 0)cout << "it is an empty list!" << endl;
    else
    cout << "the elem of the list is:" << endl;
    for (int i = 0; i < L.length; i++)//输出表中的每一个值
        cout << *(L.elem + i) << " ";
    cout << endl;
    return TRUE;
}
Status InitList(SqList &L)//构造一个空的线性表
{
    L.elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));//为L分配一个大小为LIST_INIT_SIZE*sizeof(Elemtype)大小的空间
    if (!L.elem){
        cout << "out of memory,space allocation is failed!";
        exit(MYOVERFLOW);
    }//内存不足,空间分配失败
    L.length = 0;  //空表长度为0
    L.listsize = LIST_INIT_SIZE;//初始储存容量
    cout << "the initialization of List is succeed!" << endl;
    return OK;
}
Status DestroyList(SqList &L)//摧毁线性表L,初始条件为线性表已存在
{
    if (!(&L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
    delete L.elem; //删除为L分配的空间
    L.length = 0;  //L的length和listsize都设置为0
    L.listsize = 0;
    cout << "the List is destroyed!" << endl;
    return OK;

}
Status ClearList(SqList &L)//将L重置为空表
{
    if (!(L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
    delete L.elem; //删除为L分配的空间
    L.elem = (Elemtype *)malloc(LIST_INIT_SIZE*sizeof(Elemtype));//为L分配一个大小为LIST_INIT_SIZE*sizeof(Elemtype)大小的空间
    if (!L.elem){
        exit(MYOVERFLOW);
    }//内存不足,空间分配失败
    L.length = 0;  //空表长度为0
    L.listsize = LIST_INIT_SIZE;//初始储存容量
    cout << "the list has been reset!" << endl;
    return OK;
}
bool ListEmpty(SqList L)//若L为空表,则返回TRUE,否则返回FALSE
{
    if (!(L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
    if (L.length == 0)return TRUE;
    else return FALSE;
}
int ListLength(SqList L)//返回L中的数据元素个数
{
    if (!(L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
    return L.length;
}
Status GetElem(SqList L, int i, Elemtype &e)//用e返回L中第i个数据元素的值
{
    if (!(L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
    if(0 >=i || i > L.length){  //如果i<0或者i>大于length,则超出了list的范围
        cout << "can‘t find the position of    " << i << endl;
        e = NULL;
        return ERROR;
    }
    else
    e = *(L.elem + i-1);
    return OK;
}
int LocateElem(SqList L, Elemtype e, int (*p)(SqList , Elemtype ))//返回L中第一个与e满足关系compare()的数据元素的
                                                                       //位序。若这样的元素不存在,则返回值为0
{
    if (!(L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
    int i;
    i = p(L, e);//通过compare()函数得到位置,赋值给i
    return i;
}
Status PriorElem(SqList L, Elemtype cur_e, Elemtype &pre_e)//若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱
                                                           //,否则操作失败,pre_e无定义
{
    if (!(L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
    int i = LocateElem(L, cur_e,compare);//调用LocateElem()函数,得到i的位置
    if (i == 1){
        cout << "It‘s the first elem,which doesn‘t has a prior elem!";//如果是第一个元素,则没有前驱
        return ERROR;
    }
    if (i == 0){                     //返回0说明cur_e不是表中的元素
        cout << "the elem doesn‘t exist in the list!";
        return ERROR;
    }
    else pre_e = *(L.elem + i - 2);//得到pre_e的值
    return OK;
}
Status NextElem(SqList L, Elemtype cur_e, Elemtype &next_e)//若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继,
                                                           //若操作失败,next_e无定义
{
    if (!(L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List isn‘t existed!" << endl;
        exit(-1);
    }
    int i = LocateElem(L, cur_e, compare);//调用LocateElem()函数,得到i的位置
    if (i == L.length){        //如果是最后一个元素,则没有后继
        cout << "It‘s the last elem,which doesn‘t has a next elem!";
        return ERROR;
    }
    if (i == 0){              //返回0说明cur_e不是表中的元素
        cout << "the elem doesn‘t exist in the list!" << endl;
        return ERROR;
    }
    else next_e = *(L.elem + i);//得到next_e
    return OK;
}
Status ListInsert(SqList &L, int i, Elemtype e)  //在L中第i个位置之前插入新的数据元素e,L的长度加1
{
    if (!(L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
    if ((1 <= i )&&(i<= L.length + 1)){
        if (L.length >= L.listsize){
            Elemtype *newbase;
            newbase = (Elemtype *)realloc(L.elem, (L.listsize + LISTINCREMENT)*sizeof(Elemtype));
            if (!newbase)exit(MYOVERFLOW);
            L.elem = newbase;
            L.listsize += LISTINCREMENT;
        }
        for (int j = L.length; j >= i;j--){  //将i后的数据元素全部后移一位
            *(L.elem + j) = *(L.elem + j - 1);
        }
        *(L.elem + i-1) = e;//将i位赋值e
        L.length += 1;      //表的长度加1
        return OK;
    }
    else {                //当i不在[1,L.length+1]之间时,无法插入元素
        cout << "can‘t find the position of " <<i<< " in the list!"<<endl;
        return ERROR;
    }
}
Status ListDelete(SqList &L, int i, Elemtype &e)//删除L的第i个数据元素,并用e返回其值,L的长度减1
{
    if (!(L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
    if ((1 <= i) &&(i<= L.length)){
        e = *(L.elem + i - 1);//将i位的值赋给e
        for (; i < L.length;i++){  //将i后包括i的数据元素全部前移一位
            *(L.elem + i-1) = *(L.elem + i);
        }
        L.length -= 1;      //表的长度减1
        return OK;
    }
    else {                //当i不在[1,L.length]之间时,无法删除元素
        cout << "can‘t find the position of "<< i<< " in the list!" << endl;
        return ERROR;
    }
}
void   ListTraverse(SqList L, bool(*p)(SqList L))   //依次对L的每个数据元素调用visit(),一旦visit()失败,则操作失败
{
    if (!(&L.elem)){    //如果L的元素首地址不存在,说明L并未初始化,L不存在
        cout << "the List is‘t existed!" << endl;
        exit(-1);
    }
     (*p)(L);    //调用visit()对表进行遍历
}
时间: 2025-01-05 03:32:30

线性表的顺序表示与实现的相关文章

数据结构_线性表的顺序表示和链式表示

/********************************************************************************************************************/ 声明: (1)*.h文件是代码声明, *.cpp文件是代码实现; (2)一般头文件的内容有: ①类型声明; ②函数声明; ③枚举; ④常量; ⑤宏 (3)以下说明是为了方便代码文件的管理而设定的一些规则, 以后代码都会按照此规则编写: 1)Pubuse.h 是几

线性表之顺序表奇偶调整和单链表就地逆置

线性表之顺序表奇偶调整,就是指将顺序表的奇数与偶数位置互换,以最优方法解决,因为方法很多,比如,开辟一个新的顺序表分别存放奇偶数,也可以从头向后寻找奇偶数放置到尾部或头部,但这些都会增大时间与空间的消耗.最优法则是前后分别寻找奇偶不同类型数,满足前奇后偶(或前偶后期),交换两数位置,实现时间复杂度O(n),空间O(1)的方案. void AdjustSqlist(SeqList *L) { int i=0,j=L->last; int temp; while(i<j) { while(L-&g

线性表之顺序表C++实现

线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件#include<iostream> const int MaxSize = 100;//定义顺序表SeqList的模板类template<class DataType>class SeqList{public: //顺序表无参构造器(创建一个空的顺序表) SeqList(){ length = 0 } //顺序表有参构造器(创建一个长度为n的顺序表) SeqList(DataType array[], int

线性表的顺序表示

线性表了有如下几个特征: 1.集合中必存在唯一的一个"第一个元素": 2.集合中必存在唯一的一个"最后的元素": 3.除最后元素之外,其它数据元素均有唯一的"后继": 4.除第一元素之外,其它数据元素均有唯一的"前驱". 线性表的顺序表示指的是用物理上的一段连续的地址来存储数据元素. 如果第一个元素的在内存上的地址为a1,每个元素占用的空间是l,那么第n个元素的地址就是a1+(n-1) x l. 数组描述的线性表顺序结构表示:

线性表的顺序表示和实现

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素. 假设线性表的每个元素需占用L个存储单元,并能所占的第一个单元的存储地址作为数据元素的存储位置.则线性表中第i+1个数据元素的存储位置LOC(ai+1)和第i个数据元素的存储位置LOC(ai)之间满足下列关系: LOC(ai+1)=LOC(ai)+L 一般来说,线性表的第i个数据元素ai的存储位置为 LOC(ai)=LOC(a1)+(i-1)×L 式中LOC(a1)是线性表中第一个数据元素的存储位置,通常称做线性表的起始位置

线性表之顺序栈C++实现

线性表之顺序栈 栈是限定仅在表尾(栈顶)进行插入删除操作的线性表,FILO:先进后出 一.顺序栈的头文件:SeqStack.h //顺序栈头文件#include<iostream>using namespace std;//设置顺序栈的大小const int StackSize = 10;template<class DataType>//定义顺序栈的模板类型class SeqStack{public: //无参构造器,初始化栈顶指针 SeqStack(){ top = -1; }

数据结构算法C语言实现(一)---2.3线性表的顺序表示和实现

注意: 虽然是用C语言实现,但是考虑到使用了一个C++的特性----引用以简化代码,所以所有的代码均以cpp作为后缀,用g++编译(以后不做说明). g++版本: 一.简述 本节主要讲述线性表的顺序实现,主要操作包括建表,插入元素,删除元素,查找元素,合并表等操作,根据书中伪代码编写了C语言,使用int类型进行了测试,需要注意的是查找元素时使用了函数指针,C语言初学者不易理解,可查阅相关书籍学习. 二.头文件 1 //head.h 2 /** 3 My Code 4 */ 5 #include

线性表的顺序实现

线性表的顺序表示和实现时间:2006/02/14测试环境:TC2.0 #include "stdio.h" #define TRUE 1 #define FALSE 0 #define List_Init_Size 30 #define List_Increment 10 typedef int ElemType; typedef struct { ElemType *elem; int length; int listsize; }Sqlist; /*初始化一个线性表*/ int I

C#线性表之顺序表

线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: (1)除第一个位置的数据元素外,其它数据元素位置的前面都只有一个数据元素: (2)除最后一个位置的数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是一个接一个的排列.因此,可以把线性表想象为一种数据元素序列的数据结构. 线性表的接口如下所示. public interface I

线性表之顺序表(C语言实现)

线性表是从数据元素的逻辑结构上定义的. 这种数据元素的逻辑结构的特征如下: 1.除开第一个和最后一个元素之外.所有元素都有一个前驱元素和后继元素. 2.第一个元素无前驱元素,但有后继元素. 3.最后一个元素有前驱元素,单无后继元素. 可以抽象为如下表述: 元素1 元素2 元素3 元素4 元素5 元素6 然而同一种逻辑结构在内存中却可以有两种存储方式:1.在内存中连续存储的线性表-----顺序表(如数组)                  2.在内存中离散存储的线性表-----链表(如单链表,双链