数据结构一:企业级顺序存储底层库封装


      数据结构是程序员的内功,从基础做起,同时数据结构也是我大三被一个小企业侮辱过的学科,也是我大学期间最头疼的学科,今天做个总结以表示自己很认真的学过,代码都可以在企业级开发中使用,后续会有常用数据结构的企业级开发封装

在底层库封装的过程中不关心业务流程的特点所以使用void*,有种分层的理念,直接上代码:

#ifndef  __MY_SEQLIST_H__ 
#define __MY_SEQLIST_H__

typedef void SeqList;
typedef void SeqListNode;

//顺序存储的创建 
SeqList* SeqList_Create(int capacity);

//顺序存储的清楚
void SeqList_Clear(SeqList* seqlist);

//顺序存储的销毁
int SeqList_Destroy(SeqList* seqlist);

//顺序存储的长度
int SeqList_Length(SeqList* seqlist);

//顺序表的插入数据
int SeqList_Insert(SeqList* seqlist,SeqListNode* node,int pos);

//顺序存储的删除元素
SeqListNode* SeqList_Delete(SeqList* seqlist,int pos);

//获得顺序存储的容量
int SeqList_Capacity(SeqList* seqlist);

//获得顺序存储的元素
SeqListNode*  SeqList_Get(SeqList* seqlist,int pos);


#endif  //__MY_SEQLIST_H__
这是SeqList的头文件。


#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "myseqlist.h"

typedef struct _tag_SeqList
{
	int length;
	int capacity;
	int * node;

}TSeqList;


//顺序存储的创建 
SeqList* SeqList_Create(int capacity)
{
	//创建一个顺序存储
	if (capacity < 0)
	{
		return NULL;
	}
	TSeqList * tseqlist = (TSeqList*)malloc(sizeof(TSeqList) * sizeof(int) * capacity);
	if (tseqlist == NULL)
	{
		return NULL;
	}
	tseqlist->length = 0;
	tseqlist->capacity = capacity;
	//这是第二种开辟内存的方式   设置node指针指向位置
	tseqlist->node = (unsigned int *)(tseqlist + 1);
	return tseqlist;
}

//顺序存储的清楚
void SeqList_Clear(SeqList* seqlist)
{
	if (seqlist == NULL)
	{
		return;
	}
	TSeqList* tseqlist = seqlist;
	tseqlist->length = 0;
}

//顺序存储的销毁
int SeqList_Destroy(SeqList* seqlist)
{
	//销毁 
	TSeqList * tseqlist = seqlist;
	if (seqlist == NULL)
	{
		return -1;
	}
	free(tseqlist);
	return 0;

}

//顺序存储的长度
int SeqList_Length(SeqList* seqlist)
{

	if (seqlist == NULL)
	{
		return 0;
	}
	TSeqList * tseqlist = seqlist;
	return tseqlist->length;
}

//顺序表的插入数据
int SeqList_Insert(SeqList* seqlist, SeqListNode* node, int pos)
{
	int i = 0;
	TSeqList * tseqlist = seqlist;
	//进行容错处理
	if (seqlist == NULL || node == NULL)
	{
		return -1;
	}

	if (pos < 0 || pos > tseqlist->capacity )
	{
		return -2;
	}
	//已经满了
	if (tseqlist->length >= tseqlist->capacity)
	{
		return -3;
	}

	if (pos> tseqlist->length)
	{
		pos = tseqlist->length;
	}
	//插入的位置包括0,1,2,3....
	for ( i = SeqList_Length(seqlist); i > pos ; i-- )
	{
		tseqlist->node[i] = tseqlist->node[i - 1];
	}
	tseqlist->node[pos] = (unsigned int)node;
	tseqlist->length++;
	return 0;
}

//顺序存储的删除元素
SeqListNode* SeqList_Delete(SeqList* seqlist, int pos)
{
	int i = 0;
	TSeqList * tseqlist = seqlist;
	if (seqlist == NULL)
	{
		return NULL;
	}
	if (pos < 0 || pos >=  tseqlist->length )
	{
		return NULL;
	}
	
	SeqListNode* node = (SeqListNode*)tseqlist->node[pos];
	for (i = pos+1; i < tseqlist->length;i++)
	{
		tseqlist->node[i - 1] = tseqlist->node[i];
	}
	tseqlist->length--;
	return node;
}

//获得顺序存储的容量
int SeqList_Capacity(SeqList* seqlist)
{
	if (seqlist == NULL)
	{
		return 0;
	}
	TSeqList * tseqlist = seqlist;
	return tseqlist->capacity;
}

//获得顺序存储的元素
SeqListNode*  SeqList_Get(SeqList* seqlist, int pos)
{

	TSeqList * tseqlist = seqlist;
	if (seqlist == NULL || pos < 0 || pos >tseqlist->length)
	{
		return NULL;
	}
	SeqListNode* node = (SeqListNode*)tseqlist->node[pos];
	return node;
}

以上是头文件的实现部分。

#include "stdlib.h"
#include "string.h"
#include "stdio.h"
#include "myseqlist.h"

typedef  struct _tag_Teacher
{
	int age;
	char * name;

}Teacher;


void Testdemo2()
{
	Teacher t1, t2, t3, t4;
	int length;
	t1.age = 11;
	t1.name = "shao11";
	t2.age = 22;
	t2.name = "shao22";
	t3.age = 33;
	t3.name = "shao33";
	t4.age = 44;
	t4.name = "shao44";

	SeqList * mlist = SeqList_Create(10);
	SeqList_Insert(mlist, (SeqListNode*)&t1, 0);
	SeqList_Insert(mlist, (SeqListNode*)&t2, 0);
	SeqList_Insert(mlist, (SeqListNode*)&t3, 0);
	SeqList_Insert(mlist, (SeqListNode*)&t4, 2);

	for (int i = 0; i < SeqList_Length(mlist);i++)
	{
		Teacher * node = (Teacher*)SeqList_Get(mlist, i);
		printf("年级:%d,姓名:%s\n", node->age, node->name);

	}

	length = SeqList_Length(mlist);

	//for (int i = 0;i < length;i++)
	//{
	//	Teacher* node = (Teacher*)SeqList_Delete(mlist, 1);
	//	printf("删除年级:%d,姓名:%s,%d\n", node->age, node->name,i);
	//}
	printf("\n");
	Teacher* node = (Teacher*)SeqList_Delete(mlist, 1);
	printf("删除年级:%d,删除姓名:%s\n", node->age, node->name);
	printf("new data \n");
	for (int i = 0; i < SeqList_Length(mlist);i++)
	{
		Teacher * node = (Teacher*)SeqList_Get(mlist, i);
		printf("年级:%d,姓名:%s\n", node->age, node->name);

	}
	SeqList_Destroy(mlist);

}

void main()
{
	Testdemo2();
	system("pause");
}

业务流模拟部分




内功学习 从基础做起,不喜勿喷,只是自己的学习见证


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值