线性表

 

/***********************************

线性表的顺序表示和实现

  date 2018/9/7

***********************************/

#include<iostream>

#include<stdio.h>

#include<malloc.h>    //注意这个分配地址的头文件必须得加malloc-分配内存

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  INFEASIBLE -1//infeasible-不可行的

#define OVERFLOW -1//内存分配失败状态码overflow-溢出

 

typedef int Status;//返回结果,OK或者ERROR status-状态

typedef int Bool;

typedef int ElemType;//元素类型/定义表元素的类型

/*线性表动态分配顺序存储结构*/

typedef struct _SQLIST_   //typedef struct--顺序链表结构

{

    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;

}

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值