数据结构是程序员的内功,从基础做起,同时数据结构也是我大三被一个小企业侮辱过的学科,也是我大学期间最头疼的学科,今天做个总结以表示自己很认真的学过,代码都可以在企业级开发中使用,后续会有常用数据结构的企业级开发封装
在底层库封装的过程中不关心业务流程的特点所以使用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");
}
业务流模拟部分
内功学习 从基础做起,不喜勿喷,只是自己的学习见证