顺序表初级
程序员文章站
2022-03-15 09:50:39
...
增删改查
//防止头文件重复包含的时候重定义
//因为结构体的定义
//一般写在头文件中的
#ifndef _SXB_H_
#define _SXB_H_
struct STUDENT
{
int id;
char name[32];
int age;
};
typedef STUDENT DATA;
struct SXB
{
DATA* p;//首地址
int size;//容量
int len;//长度
};
SXB* CreateSXB();//创建
bool InsertSXB(SXB* sxb,int xb, DATA data);//插入
void PushbackSXB(SXB* sxb,DATA data); //添加到末尾
bool EraseSXB(SXB* sxb,int xb);//删除指定
//查找数据,返回所在下标,没找到返回-1下标
int FindDataSXB(SXB* sxb,
DATA data,bool (*bj)(DATA&, DATA&),
int startxb = 0 );
DATA* GetDataSXB(SXB* sxb,int xb);//获取
void ClearSXB(SXB* sxb);//清空
int GetLenSXB(SXB* sxb);//获取长度
void DestroySXB(SXB* sxb);//销毁
void SortSXB(SXB* sxb,bool (*bj)(DATA&, DATA&));//排序
#endif
#include <iostream>
#include "SXB.h"
//创建
SXB* CreateSXB()
{
SXB* sxb = (SXB*)malloc(sizeof(SXB));
sxb->len = 0;
sxb->size = 1;
sxb->p = (DATA*)malloc(sizeof(DATA) * 1);
return sxb;
}
//插入
bool InsertSXB(SXB* sxb, int xb, DATA data)
{
if (xb < 0 || xb > sxb->len)
return false;
//扩容
if (sxb->len == sxb->size)
{
DATA* np = (DATA*)malloc(sizeof(DATA)*sxb->size*2);
for (int i = 0;i < sxb->len; ++i)
np[i] = sxb->p[i];
free(sxb->p);
sxb->p = np;
sxb->size *= 2;
}
//移位
for (int i = sxb->len-1; i >= xb; --i)
sxb->p[i+1] =sxb-> p[i];
//插入数据
sxb->p[xb] = data;
sxb->len++;
return true;
}
//添加到末尾
void PushbackSXB(SXB* sxb,DATA data)
{
InsertSXB(sxb, sxb->len, data);
}
//删除指定下标的数据
bool EraseSXB(SXB* sxb,int xb)
{
if (xb < 0 || xb > sxb->len-1)
return false;
for (int i = xb+1; i < sxb->len; ++i)
sxb->p[i-1] = sxb->p[i];
sxb->len--;
return true;
}
//查找数据,返回所在下标,没找到返回-1下标
int FindDataSXB(SXB* sxb,DATA data,
bool (*bj)(DATA&, DATA&),
int startxb)
{
for (int i = startxb; i < sxb->len; ++i)
{
//if (sxb->p[i] == data)//不能用==因为如果DATA是符合数据类型不能用比较运算符
if (bj(sxb->p[i], data))
return i;
}
return -1;
}
//获取某下标的数据的地址
DATA* GetDataSXB(SXB* sxb,int xb)
{
if (xb < 0 || xb > sxb->len-1)
return 0;
return &sxb->p[xb];
//return sxb->p + xb;
}
//清空
void ClearSXB(SXB* sxb)
{
sxb->len = 0;
}
//获取长度
int GetLenSXB(SXB* sxb)
{
return sxb->len;
}
//销毁
void DestroySXB(SXB* sxb)
{
if (sxb->p)
{
free(sxb->p);
sxb->p = 0;
}
free(sxb);
}
#include <iostream>
#include "sxb.h"
bool t1(int& a, int& b)
{
return a == b;
}
void main()
{
CreateSXB();
PushbackSXB(100);//100
PushbackSXB(200);//100 200
PushbackSXB(300);//100 200 300
InsertSXB(0,400);//400 100 200 300
//ClearSXB();
//EraseSXB(0);
int xb = FindDataSXB(100, t1, 2);
if (xb != -1)
{
std::cout<<"找到了,在" << xb <<"下标\n";
}
else
{
std::cout<<"没有找到";
}
int len = GetLenSXB();
std::cout<<"长度为:"<<len<<std::endl;
for (int i = 0; i < len; ++i)
{
int* a = GetDataSXB(i);
std::cout<< *a <<"\t";
}
下一篇: NR/5G - URLLC UL