数据结构之线性表顺序实现

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>

using namespace std;

const int max_size=100;


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

/****线性表的定义*******/
typedef struct
{
    int data[max_size];//存取关键字  大于等于0
    int length;        //当前长度
} SqList;

/********初始化*********/

bool InitList(SqList &sq)
{
    memset(sq.data,0,sizeof(sq.data));
    sq.length=0;
    return true;
}

/********清空*********/
bool ClearList(SqList &sq)
{
    memset(sq.data,0,sizeof(sq.data));
    sq.length=0;
    return true;
}

/*******随机生成线性表*****/
void Create(SqList &sq)
{
    srand((unsigned int)time(NULL));
    for(int i=0; i<10; i++)
    {
        sq.length++;
        sq.data[i]=rand()%100;
    }
}

/************************************插入********************************/
/** 插入数据data到第i个位置
**  说明i的取值为[1,sq.length+1],判断i是否在此范围,同时判断sq.length==max_size?
**  插入的时候如果不是在线性表的尾部插入,就需要移动原来的[i,sq.length]的数值
**  注意  存数据时是从0开始的
**  返回值:true表示插入成功,false表示插入失败
**/

bool InsertList(SqList &sq,int i,int data)
{
    if(i<1||i>sq.length+1)return false;  //判断范围
    if(sq.length==max_size)return false; // 顺序线性表已经满
    if(i<=sq.length)                     // 若插入数据位置不在表尾
    {
        for(int j=sq.length-1; j>=i-1; j--)
        {
            sq.data[j+1]=sq.data[j];
        }
    }
    sq.data[i-1]=data;//直接插在表尾
    sq.length++;
    return true;
}

/********遍历**********/
void print(SqList sq)
{
    for(int i=0; i<sq.length; i++)
    {
        cout<<sq.data[i]<<" ";
    }
    cout<<endl;
}

/********删除*********/
/** 删除第i个数据,并用data返回
**  说明 i的取值为[1,sq.length],判断i是否在此范围,并且判断是否为空
**  删除的时候如果不是在线性表的尾部删除,就需要移动原来的[i,sq.length]的数值
**  返回值:true表示删除成功,false表示删除失败
**/
bool DeleteList(SqList &sq,int i)//删除第i个并不返回data
{
    if(sq.length==0)return false;     //空表
    if(i<1||i>sq.length)return false;//判断范围
    if(i<sq.length)
    {
        for(int j=i; j<sq.length; j++)
        {
            sq.data[j-1]=sq.data[j];
        }
    }
    sq.length--;
    return true;
}

bool DeleteListReturn(SqList &sq,int i,int &data)//返回data
{
    if(sq.length=0)return false;     //空表
    if(i<1||i>sq.length)return false;//判断范围
    data=sq.data[i-1];
    if(i<sq.length)
    {
        for(int j=i; j<sq.length; j++)
        {
            sq.data[j-1]=sq.data[j];
        }
    }
    sq.length--;
    return true;
}

/********判断是否为空*********/
bool ListEmpty(SqList sq)
{
    return sq.length==0?true:false;
}


/********获取线性表的长度*********/
int GetListLength(SqList sq)
{
    return sq.length;
}

/********获取指定位置的元素*********/
/**      获取第i个数据
**       判断i的合法性
**       -1 表示错误,否则返回第i个data的值
**/
int GetData(SqList sq,int i)
{
    if(i<1||i>sq.length||sq.length==0)return -1;
    return sq.data[i-1];
}

/***********获取满足条件的第一个位置*************/
/**      在这儿默认为 >
**       获取第一个大于data的位置
**       成功返回第一个大于data的位置,反之返回-1
**       前提是sq存在,同时如果i的值等于length,表示没找到,返回-1
**/

int LocateData(SqList sq,int data)
{
    int i;
    if(sq.length==0)return -1;
    for(i=0; i<sq.length; i++)
    {
        if(sq.data[i]>data)
        {
            break;
        }
    }
    if(i>=sq.length)return -1;
    return i+1;
}

/***********前驱***********/
/**       注意范围
**        前提是sq存在
**        返回成功第i个数据的前驱,失败返回-1
**        除了第一个元素,其他的元素都有前驱
**        除了最后一个元素,其他元素都有后继
**/
int GetPrior(SqList sq,int i)
{
    if(sq.length==0||i==1)return -1;
    if(i>sq.length)return -1;
    return sq.data[i-2];
}

/***********后继*** *******/
int GetNext(SqList sq,int i)
{
    if(sq.length==0||i==sq.length)return -1;
    if(i>sq.length)return -1;
    return sq.data[i];
}

/********合并*********/
/**  假设sqa和sqb都是升序存在,sqc升序存储
**   判断大小就行了
**/
void MergeList(SqList sqa,SqList sqb,SqList &sqc)
{
    InitList(sqc);
    int i=1,j=1,k=0;
    while(i<=GetListLength(sqa)&&j<=GetListLength(sqb))
    {
        int a=GetData(sqa,i),b=GetData(sqb,j);
        if(a<=b)
        {
            i++;
            InsertList(sqc,k,a);
            k++;
        }
        else
        {
            j++;
            InsertList(sqc,k,b);
            k++;
        }
    }
    while(i<=sqa.length)
    {
        InsertList(sqc,k,GetData(sqa,i));
        i++;
        k++;
    }
    while(j<=sqb.length)
    {
        InsertList(sqc,k,GetData(sqb,j));
        k++;
        j++;
    }
}


int main()
{
    SqList sq;
    SqList a,b,c;
    InitList(sq);
    Create(sq);
    print(sq);
    cout<<"List length is "<<GetListLength(sq)<<endl;

    if(ListEmpty(sq)==true)cout<<"List empty"<<endl;
    else cout<<"Has Item"<<endl;

    if(InsertList(sq,5,19)==false)
    {
        cout<<"insert failed"<<endl;
    }
    else
    {
        print(sq);
        cout<<"List length is "<<GetListLength(sq)<<endl;
    }

    if(DeleteList(sq,5)==false)
    {
        cout<<"delete failed"<<endl;
    }
    else
    {
        print(sq);
        cout<<"List length is "<<GetListLength(sq)<<endl;
    }

    int tmp=GetData(sq,5);
    if(tmp==-1)
    {
        cout<<"get failed"<<endl;
    }
    else cout<<"get data is "<<tmp<<endl;

    tmp=LocateData(sq,56);
    if(tmp==-1)cout<<"locate error"<<endl;
    else cout<<tmp<<endl;

    tmp=GetPrior(sq,3);
    if(tmp==-1)cout<<"1 has not prior"<<endl;
    else cout<<"prior is "<<tmp<<endl;

    tmp=GetNext(sq,4);
    if(tmp==-1)cout<<"sq.length has not next"<<endl;
    else cout<<"next is "<<tmp<<endl;

    InitList(a);
    InitList(b);

    for(int i=0;i<4;i++)
    {
        InsertList(a,i+1,i+1);
    }
    for(int i=0;i<5;i++)
    {
        InsertList(b,i+1,i+3);
    }
    print(a);
    print(b);
    MergeList(a,b,c);
    print(c);
    ClearList(a);
    ClearList(b);
    ClearList(c);
    ClearList(sq);
    cout<<"a length is "<<GetListLength(a)<<endl;
    cout<<"b length is "<<GetListLength(b)<<endl;
    cout<<"c length is "<<GetListLength(c)<<endl;
    cout<<"sq length is "<<GetListLength(sq)<<endl;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值