学习数据结构已经很久了,一直没有用上,最近时间有点空闲,所以翻出来炒一炒。子曰:温故而知新。当初学习数据结构的时候,买的是国嵌唐老师的视频,所以这些代码和唐老师课上写的几乎一模一样,若转载请注明出自国嵌唐老师数据结构教程。
首先来看第一个例子,顺序表:
头文件
#ifndef _SEQLIST_H_
#define _SEQLIST_H_
typedef void SeqList;
typedef void SeqListNode;
SeqList* SeqList_Create(int capacity);
void SeqList_Destroy(SeqList* list);
int SeqList_Clean(SeqList* list);
int SeqList_Length(SeqList* list);
int SeqList_Capacity(SeqList* list);
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
SeqListNode* SeqList_Delete(SeqList* list, int pos);
SeqListNode* SeqList_Get(SeqList* list, int pos);
#endif
我个人有点小小的强迫症,代码尽量要求简洁,所以没有注释,有什么不明白的可以留言。
实现文件
#include "SeqList.h"
#include <stdio.h>
#include <malloc.h>
typedef unsigned int TSeqListNode;
typedef struct tag_SeqList
{
int length;
int capacity;
TSeqListNode* node;
}TSeqList;
SeqList* SeqList_Create(int capacity)
{
TSeqList* ret = NULL;
if (capacity >= 0)
{
ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity);
if (ret)
{
ret->capacity = capacity;
ret->length = 0;
ret->node = (TSeqListNode*)(ret + 1);
return (SeqList*)(ret);
}
}
return ret;
}
void SeqList_Destroy(SeqList* list)
{
free(list);
}
int SeqList_Clean(SeqList* list)
{
TSeqList* sList = (TSeqList*)list;
int ret = -1;
if (sList != NULL)
{
sList->length = 0;
}
return ret;
}
int SeqList_Length(SeqList* list)
{
TSeqList* sList = (TSeqList*)list;
int ret = -1;
if (sList != NULL)
{
ret = sList->length;
}
return ret;
}
int SeqList_Capacity(SeqList* list)
{
TSeqList* sList = (TSeqList*)list;
int ret = -1;
if (sList != NULL)
{
ret = sList->capacity;
}
return ret;
}
int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
{
TSeqList* sList = (TSeqList*)list;
int i = 0;
int ret = (sList != NULL) && (node != NULL);
ret = (sList->length + 1 <= sList->capacity) && (pos >= 0);
if (ret)
{
if (pos > sList->length)
{
pos = sList->length;
}
for (i = sList->length; i > pos; i--)
{
sList->node[i] = sList->node[i - 1];
}
sList->node[pos] = (TSeqListNode)node;
sList->length++;
}
return ret;
}
SeqListNode* SeqList_Delete(SeqList* list, int pos)
{
TSeqList* sList = (TSeqList*)list;
int i = 0;
SeqListNode* ret = NULL;
if ((sList != NULL) && (pos >= 0) && (pos < sList->length))
{
ret = (SeqListNode*)(sList->node[pos]);
for (i = pos + 1; i < sList->length; i++)
{
sList->node[i - 1] = sList->node[i];
}
sList->length--;
}
return ret;
}
SeqListNode* SeqList_Get(SeqList* list, int pos)
{
TSeqList* sList = (TSeqList*)list;
SeqListNode* ret = NULL;
if ((sList != NULL) && (pos >= 0) && (pos < sList->length))
{
ret = (SeqListNode*)sList->node[pos];
}
return ret;
}
测试文件
<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#include "SeqList.h"
int main(int argc, char *argv[])
{
SeqList* list = SeqList_Create(10);
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int i = 0;
SeqList_Insert(list, &a, 0);
SeqList_Insert(list, &b, 0);
SeqList_Insert(list, &c, 0);
SeqList_Insert(list, &d, 0);
SeqList_Insert(list, &e, 0);
SeqList_Insert(list, &f, 0);
printf("length = %d\n", SeqList_Length(list));
for (i = 0; i < SeqList_Length(list); i++)
{
int* p = SeqList_Get(list, i);
printf("%d\n", *p);
}
SeqList_Clean(list);
for (i = 0; i < SeqList_Length(list); i++)
{
int* p = SeqList_Get(list, i);
printf("%d\n", *p);
}
printf("capacity = %d\n", SeqList_Capacity(list));
SeqList_Insert(list, &a, SeqList_Length(list));
SeqList_Insert(list, &b, SeqList_Length(list));
SeqList_Insert(list, &c, SeqList_Length(list));
SeqList_Insert(list, &d, SeqList_Length(list));
SeqList_Insert(list, &e, SeqList_Length(list));
SeqList_Insert(list, &f, SeqList_Length(list));
for (i = 0; i < SeqList_Length(list); i++)
{
int* p = SeqList_Get(list, i);
printf("%d\n", *p);
}
printf("capacity = %d\n", SeqList_Length(list));
while(SeqList_Length(list) > 0)
{
int* p = SeqList_Delete(list, SeqList_Length(list) - 1);
printf("%d\n", *p);
}
SeqList_Destroy(list);
system("PAUSE");
return 0;
}
上面代码都可以放到工程里面直接用,对于嵌入式开发的不能用到很多集成库,很多东西都要自己写,所以上面的代码是可复用的。