数据结构——手写线性表

手写线性表,代码是函数形式的,每个函数都是实现一部分功能
实现的功能有顺序表的初始化,扩容,插入,删除,按值查找,按位查找

#include<bits/stdc++.h>
#define MAX_SIZE 10
using namespace std;
typedef struct Vector
{
    int *data;
    int maxsize;
    int length;
}Vector;

void Vector_Init(Vector &L) //初始化
{
    L.maxsize=MAX_SIZE;
    L.data=(int*)malloc(sizeof(int)*L.maxsize);
    L.length=0;
}

void Vector_Extend(Vector &L,int len) //扩容
{
    int* p=L.data;
    L.data=(int*)malloc(sizeof(int)*(L.maxsize+len));
    for(int i=0;i<L.length;i++){
        L.data[i]=p[i];
    }

    L.maxsize=L.maxsize+len;
    free(p);
}

void Vector_Input(Vector &L) //初始化步骤:给data中的每一位赋 1
{
    for(int i=0;i<L.maxsize;i++){
        L.data[i]=1;
        L.length++;
    }
}

bool Vector_Insert(Vector &L,int pos,int val) //插入,pos表示位序(位序从1开始)
{
    if(pos<1||pos>L.length+1) return false;
    if(L.length==L.maxsize){
        Vector_Extend(L,2);
        cout<<"扩容成功"<<endl;
    }

    for(int i=L.length;i>=pos;i--){
        L.data[i]=L.data[i-1];
    }
    L.data[pos-1]=val;
    L.length++;
    return true;
}
bool Vector_Erase(Vector &L,int pos,int &val) //插入,pos表示位序(位序从1开始)
{
    if(pos<1||pos>L.length) return false;
    if(L.length==0) return false;

    val=L.data[pos-1];
    for(int i=pos-1;i<L.length-1;i++){
        L.data[i]=L.data[i+1];
    }
    L.length--;
    return true;
}

int Getval(Vector &L,int pos) //按位查找,pos表示位序(位序从1开始)
{
    if(pos<1||pos>L.length) return -1;
    if(L.length==0) return -1;
    return L.data[pos-1];
}

int LockVal(Vector &L,int val) //按值查找,返回的是位序(位序从1开始)
{
    for(int i=0;i<L.length;i++){
        if(L.data[i]==val)
            return i+1;
    }
    return -1;
}
void Vector_Output(Vector &L) //输出data中所有的元素
{
    printf("data[%d]=",L.length);
    for(int i=0;i<L.length;i++)
        cout<<L.data[i]<<" ";
    cout<<endl;
}
int main() //所有测试案例
{
    Vector L;
    Vector_Init(L);
    Vector_Input(L);
    Vector_Output(L);

    if(Vector_Insert(L,1,5))
        Vector_Output(L);
    if(Vector_Insert(L,1,6))
        Vector_Output(L);
    if(Vector_Insert(L,1,7))
        Vector_Output(L);
    if(Vector_Insert(L,14,8))
        Vector_Output(L);
    if(Getval(L,12)>0)
        cout<<"第12位元素是"<<Getval(L,12)<<endl;
    if(LockVal(L,8)>0)
        cout<<"有元素8,位于"<<LockVal(L,8)<<"位"<<endl;
    return 0;
}


下面是另外一种写法
功能包含插入,删除,清空,打印,元素个数,表长,realloc函数扩容线性表

#include<bits/stdc++.h>
using namespace std;
typedef struct MyVector
{
    int *data;
    int vecsize;
    int number;
}Vector;

Vector* Init(int N)
{
    Vector* vec=(Vector*)malloc(sizeof(Vector));
    vec->data=(int*)malloc(sizeof(int)*N);
    vec->vecsize=N;
    vec->number=0;
}

bool Extend(Vector *vec) {
    int new_size = vec->vecsize * 2;
    int *p = (int *)realloc(vec->data, sizeof(int) * new_size);
    if (p == NULL) return 0;
    vec->vecsize = new_size;
    vec->data = p;
    return true;
}

bool VecInsert(Vector* vec,int pos,int val)
{
    if(vec==NULL) return false;
    if(pos<0||pos>vec->number) return false;
    if(vec->number==vec->vecsize)
        if (!Extend(vec)) return 0;
        else printf("success\n");

    for(int i=vec->number;i>pos;i--){
        vec->data[i]=vec->data[i-1];
    }
    vec->data[pos]=val;
    vec->number++;
    return true;
}

bool VecErase(Vector* vec,int pos)
{
    if(vec==NULL) return false;
    if(pos<0||pos>=vec->number) return false;
    if(vec->number==0) return false;


    for(int i=pos;i<vec->number;i++){
        vec->data[i]=vec->data[i+1];
    }
    vec->number--;
    return true;
}

bool VecClear(Vector* vec)
{
    if(vec==NULL) return false;
    free(vec->data);
    free(vec);
    return true;
}

void VecOutput(Vector *vec)
{
    cout<<"data = ";
    for(int i=0;i<vec->number;i++){
        cout<<vec->data[i]<<" ";
    }
    cout<<endl;
}

int main()
{

    Vector* vec =Init(2);
    cout<<VecInsert(vec,0,1)<<endl;
    cout<<VecInsert(vec,0,2)<<endl;
    cout<<VecInsert(vec,0,3)<<endl;
    cout<<VecInsert(vec,0,4)<<endl;
    cout<<VecInsert(vec,0,5)<<endl;
    cout<<VecInsert(vec,0,6)<<endl;
    cout<<VecInsert(vec,0,7)<<endl;
    cout<<VecErase(vec,2)<<endl;
    cout<<VecErase(vec,2)<<endl;
    VecOutput(vec);
    cout<<VecClear(vec)<<endl;
    VecOutput(vec);
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值