线性表的顺序表示和实现

/***********************************
线性表的顺序表示和实现
  by Rowandjj
  date 2014/3/27
***********************************/
#include<iostream>
using namespace std;

#define LIST_INIT_SIZE    100//线性表空间的初始分配量
#define LIST_INCREMENT    10//线性表空间的分配增量


#define OK    1//成功状态码
#define TRUE 1 
#define FALSE 0
#define ERROR    2//失败状态码
#define OVERFLOW -1//内存分配失败状态码

typedef int Status;//返回结果,OK或者ERROR
typedef int Bool;
typedef int ElemType;//元素类型
/*线性表动态分配顺序存储结构*/
typedef struct _SQLIST_
{
    ElemType *elem;//存储空间基址
    int length;//当前长度
    int listsize;//当前分配的存储容量
}Sqlist;

/* 操作定义 */
Status InitList_Sq(Sqlist&);//构造一个空的线性表
Status DestroyList_Sq(Sqlist&);//销毁线性表
Status ClearList_Sq(Sqlist&);//将线性表重置为空表
Bool ListEmpty_Sq(Sqlist);//判断是否为空表
int ListLength_Sq(Sqlist);//返回线性表长度
void GetElem_Sq(Sqlist,int,ElemType&);//获取并返回线性表中指定位置的元素(1<=index<=ListLength)
void PriorElem_Sq(Sqlist,ElemType,ElemType&);//返回指定元素的前驱元素,若是第一个元素,则前驱未定义
void NextElem_Sq(Sqlist,ElemType,ElemType&);//返回指定元素的后继,若是最后一个元素,则后继未定义
Status ListInsert_Sq(Sqlist&,int,ElemType);//在指定位置上插入元素
Status ListDelete_Sq(Sqlist&,int,ElemType&);//删除指定位置上的元素
void ListTraverse_Sq(Sqlist);//遍历顺序表

/*具体实现*/
Status DestroyList_Sq(Sqlist &L)
{
    L.length = 0;
    L.listsize = 0;
    free(L.elem);
    L.elem = NULL;
    return OK;
}
Status ClearList_Sq(Sqlist &L)
{
    L.length = 0;
    return OK;
}
Status InitList_Sq(Sqlist &L)
{
    L.elem = (ElemType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
    if(!L.elem)
    {
        exit(OVERFLOW);
    }
    L.length = 0;
    L.listsize = LIST_INIT_SIZE;
    return OK;
}
void ListTraverse_Sq(Sqlist L)
{
    for(int i = 0; i < L.length; i++)
    {
        cout<<L.elem[i]<<" ";
    }
    cout<<endl;
}
int ListLength_Sq(Sqlist L)
{
    return L.length;
}
Bool ListEmpty_Sq(Sqlist L)
{
    return L.length==0 ? TRUE : FALSE;
}
Status ListInsert_Sq(Sqlist &L,int i,ElemType e)// 1<=i<=length+1 
{
    if(i<1 || i>L.length+1)//参数判断
    {
        return ERROR;
    }
    if(L.length>=L.listsize)//扩容
    {
        ElemType *newbase = (ElemType*)realloc(L.elem,(L.listsize+LIST_INCREMENT)*sizeof(ElemType));
        if(!newbase)
        {
            exit(OVERFLOW);
        }
        L.elem = newbase;
        L.listsize += LIST_INCREMENT;
    }
    //插入
    ElemType* q = &L.elem[i-1];
    for(ElemType* p = &L.elem[L.length-1];p >= q; p--)
    {
        *(p+1) = *p;
    }
    *q = e;
    L.length++;
    return OK;
}
Status ListDelete_Sq(Sqlist &L,int i,ElemType &e)
{
    ElemType *p = &L.elem[i-1];
    e = *p;
    for(++p; p <= &L.elem[L.length-1]; p++)
    {
        *(p-1) = *p;
    }
    L.length--;
    return OK;
}
void PriorElem_Sq(Sqlist L,ElemType e,ElemType& i)
{
    int index = 0;
    while(L.elem[index] != e && index < L.length)
    {
        index++;
    }
    if(index >= L.length || index==0)
    {
        return;
    }
    i = L.elem[index-1];
}
void NextElem_Sq(Sqlist L,ElemType e,ElemType &i)
{
    int index = 0;
    while(L.elem[index]!=e && index<L.length)
    {
        index++;
    }
    if(index>=L.length || index== L.length-1)
    {
        return;
    }
    i = L.elem[index+1];
}    
void GetElem_Sq(Sqlist L,int i,ElemType &e)
{
    if(i<1 || i>L.length)
    {
        return;
    }
    e = L.elem[i-1];
}

测试:

int main()
{
    Sqlist l;
    ElemType e,e2;
    int num,index;

    //init
    InitList_Sq(l);
    cout<<"length:"<<ListLength_Sq(l)<<endl;
    cout<<"EMPTY:"<<ListEmpty_Sq(l)<<endl;
    ListTraverse_Sq(l);
    
    //insert
    cin>>num;
    for(int i = 0; i < num; i++)
    {
        cin>>e;
        cin>>index;
        ListInsert_Sq(l,index,e);        
    }
    cout<<"length:"<<ListLength_Sq(l)<<endl;
    cout<<"EMPTY:"<<ListEmpty_Sq(l)<<endl;
    ListTraverse_Sq(l);
    //delete
    cin>>index;
    ListDelete_Sq(l,index,e);
    cout<<"e = "<<e<<endl;
    cout<<"length:"<<ListLength_Sq(l)<<endl;
    cout<<"EMPTY:"<<ListEmpty_Sq(l)<<endl;
    ListTraverse_Sq(l);
    //get
    cin>>index;
    GetElem_Sq(l,index,e);
    cout<<"e = "<<e<<endl;
    cout<<"length:"<<ListLength_Sq(l)<<endl;
    cout<<"EMPTY:"<<ListEmpty_Sq(l)<<endl;
    ListTraverse_Sq(l);
    //get prior
    cin>>e;
    PriorElem_Sq(l,e,e2);
    cout<<"e2 = "<<e2<<endl;
    ListTraverse_Sq(l);
    //get next 
    cin>>e;
    NextElem_Sq(l,e,e2);
    cout<<"e2 = "<<e2<<endl;
    ListTraverse_Sq(l);
    system("pause"); 
    return 0;
}
测试结果:




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值