欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

顺序表初级

程序员文章站 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";
	}
相关标签: 顺序表