顺序表——数据结构定义以及基础操作

顺序表

1.1源代码清单:

  • SqList.cpp
  • SqList.h

1.2顺序表数据结构:

本程序元素类型为int,读者可根据需求自行更改数据类型。

//线性表结构体
typedef struct{
    int* elem; //线性表数据
    int length; //线性表长度
    int listSize; //线性表大小
}SqList;

1.3该顺序表设计到的方法:

int  InitList(SqList &L); //初始化线性表
int  DestroyList(SqList &L); //销毁线性表
int  ClearList(SqList &L); //置空线性表
bool ListEmpty(SqList L); //判断是否为空
int  ListLength(SqList &L); //线性表长度
int  GetElem(SqList L, int i, int &e); //获取值
bool Compare(int a , int b); //比较
int  LocateElem(SqList L, int e, bool(Compare)(int, int)); //定位
int  PriorElem(SqList L, int cur_e , int &pre_e); //前驱
int  NestElem(SqList L , int cur_e , int &next_e); //后继
int  InsertList(SqList &L,int i ,int elem); //插入
int  ListDelete(SqList &L, int i, int &e); //删除
void Visit(int x); //访问
void visitList(SqList L,void(Visit)(int)); //输出顺序表

1.4 SqList.h

  • 宏定义
#include <iostream>
#include<stdio.h>
using namespace std;
/* 状态码 */
#define TRUE        1   // 真/是
#define FALSE       0   // 假/否
#define OK          1   // 通过/成功
#define ERROR       0   // 错误/失败

//系统中已有此状态码定义,要防止冲突
#ifndef OVERFLOW
#define OVERFLOW    -2  //堆栈上溢
#endif

//线性表的宏定义
#define listInitSize 20
#define listSizeStride 10 //空间增加的步长
  • 初始化表
//初始化线性表
int InitList(SqList &L){
    //给线性表数据部分分配空间
    L.elem = (int*)malloc(listInitSize * sizeof(int));
    //分配空间失败
    if(L.elem==NULL)
        // 存储内存失败
        exit(OVERFLOW);
    //线性表长度
    L.length=0;
    //线性表大小
    L.listSize=listInitSize;

    return OK;
}
  • 销毁线性表
//销毁线性表
int DestroyList(SqList &L){
    //确保线性表存在
    if( L.elem == NULL)
        return ERROR;

    //释放内存
    free(L.elem);

    //置空指针
    L.elem = NULL;

    //长度内存的改变
    L.length =0;
    L.listSize=0;

    return OK;
}
  • 置空线性表
int ClearList(SqList &L){
    if(L.elem==NULL)
        return ERROR;

    L.length=0;

    return OK;
}
  • 判断是否为空
bool  ListEmpty(SqList L){
    return L.length==0?TRUE:ERROR;
}
  • 线性表长度
int ListLength(SqList &L){
    return L.length;
}
  • 获取值
int GetElem(SqList L, int i, int &e){
    if(L.elem==NULL)
        return ERROR;
    e = L.elem[i];
    return OK;
}
  • 比较
bool Compare(int a , int b){
    return a==b;
}
  • 定位
int LocateElem(SqList L, int e, bool(Compare)(int, int)){
    if(L.elem==NULL)
        return ERROR;
    //下标
    int i=0;
    //新建指针指向数据域
    int* p = L.elem;
    //遍历
    while(i<L.length && !Compare(*p++,e)){
        ++i;
    }
    if(i<L.length)
        return i;
    else
        return -1;//没找到
}
  • 前驱
int  PriorElem(SqList L, int cur_e , int &pre_e){
    if(L.elem == NULL)
        return ERROR;
    int i=0;
    int *p = L.elem;
    while(i<L.length && !Compare(*p++, cur_e)){
        ++i;
    }
    if(i==0||i>=L.length)
        return ERROR;
    else
        pre_e = L.elem[i-1];
    return OK;
}
  • 后继
int NestElem(SqList L , int cur_e , int &next_e){
    if(L.elem == NULL)
        return ERROR;
    int i=0;
    int *p = L.elem;
    while(i<L.length && !Compare(*p++, cur_e)){
        ++i;
    }
    if(i>=L.length-1)
        return ERROR;
    else
        next_e = L.elem[i+1];
    return OK;
}
  • 插入
int InsertList(SqList &L,int i ,int elem){
    if(L.elem == NULL)
        return ERROR;
    //插入位置是否正确
    if(i<0 || i>L.length)
        return ERROR;

    int* newbase;//预计新建空间
    //是否空间不足
    if(L.length>=L.listSize){
        newbase = (int*) realloc(L.elem, (L.listSize+listSizeStride)*sizeof(int));
        //创建是否成功
        if(newbase==NULL)
            exit(OVERFLOW);
        L.elem = newbase;
        L.listSize += listSizeStride;
    }

    int*q = &L.elem[i]; //q指向要插入的位置
    int*p = &L.elem[L.length-1]; //p指向数据尾部位
    //右移元素
    while(p>=q){
        *(p+1) = *p;
        p--;
    }
    //插入元素
    *q = elem;
    //表长加1
    L.length++;

    return OK;
}
  • 删除
int ListDelete(SqList &L, int i, int &e){
    if(L.elem == NULL)
        return ERROR;
    //删除位置是否正确
    if(i<0 || i>L.length)
        return ERROR;
    int *q = &L.elem[i] ;//指向要被删除的位置
    int *p = &L.elem[L.length-1]; // 指向表尾元素
    //要删除的元素赋值给e
    e = *q;
    while(q<p){
        *q = *(q+1);
        q++;
    }
    //表长减1
    L.length--;
    return OK;
}
  • 访问元素
void Visit(int x){
    cout<<x<<'\t';
}
  • 输出顺序表
void visitList(SqList L,void(Visit)(int)){
    if(L.elem==NULL)
        cout<<"数据为空"<<endl;
    for(int i=0;i<L.length;i++)
        Visit(L.elem[i]);
    cout<<'\n';
}

1.5 SqList.cpp

#include "SqList.h"


int main(int argc, const char * argv[]) {
    SqList myList;
    InitList(myList);
    int num;
    cout<<"输入数据数量:"<<endl;
    cin>>num;
    cout<<"输入数据:"<<endl;
    int elem;
    for(int i=0 ; i<num;i++){
        cin>>elem;
        InsertList(myList, i, elem);
    }
    visitList(myList, Visit);
    cout<<"长度是:"<<ListLength(myList);
    cout<<"是否为空:"<<ListEmpty(myList);
    cout<<"输入一个想定位的数据:";
    int data;
    cin>>data;
    cout<<data<<"定位是:"<<LocateElem(myList, data, Compare)<<endl;
    int pre_data;
    PriorElem(myList, data, pre_data);
    int after_data;
    NestElem(myList, data, after_data);
    cout<<"前驱是:"<<pre_data<<'\t'<<"后继是:"<<after_data<<'\t';
    cout<<"删除元素"<<endl;
    int deldata;
    ListDelete(myList, 3, deldata);
    cout<<"删除的元素是:"<<deldata<<endl;
    visitList(myList, Visit);

    return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值