手写线性表,代码是函数形式的,每个函数都是实现一部分功能
实现的功能有顺序表的初始化,扩容,插入,删除,按值查找,按位查找
#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);
}