【SeqList】线性表代码实现总结
来源:互联网 发布:电脑数据库在哪里 编辑:程序博客网 时间:2024/05/20 05:23
前言:
本文是在学习了线性表的实现,理解国嵌数据结构与算法教程后,自己实现的线性表这种简单的数据结构,并且是可复用于任意类型数据;
// SeqList.h#ifndef _SEQLIST_H_#define _SEQLIST_H__typedef void SeqList;typedef void SeqListNode;SeqList* SeqList_Create(int capacity);void SeqList_Destroy(SeqList *list);void SeqList_Clear();int SeqList_Length();int SeqList_Capacity(SeqList* list);int SeqList_Insert(SeqList* list, int pos, SeqListNode* node);SeqListNode* SeqList_Get(SeqList* list, int pos);SeqListNode* SeqList_Delete(SeqList* list, int pos);#endif
// SeqList.c#include"SeqList.h"#include<stdio.h>#include<malloc.h>typedef unsigned int TSeqListNode;typedef struct tag_SeqList{ int capacity; int length; TSeqListNode* node;}TSeqList;SeqList* SeqList_Create(int capacity){ TSeqList* ret = NULL; if(capacity >= 0) { ret = (TSeqList*) malloc(sizeof(TSeqList) + sizeof(TSeqListNode) * capacity); } if(NULL != ret) { ret->capacity = capacity; ret->length = 0; ret->node = (TSeqListNode*)(ret+1); } return ret; }void SeqList_Destroy(SeqList* list){ free(list); list = NULL;}void SeqList_Clear(SeqList* list){ TSeqList* slist = (TSeqList*)list; if(NULL != slist) { slist->length = 0; }}int SeqList_Length(SeqList* list){ TSeqList* slist = (TSeqList*)list; int ret = 0; if(NULL != slist) { ret = slist->length; } return ret;}int SeqList_Capacity(SeqList* list){ TSeqList* slist = (TSeqList*)list; int ret = 0; if(NULL != slist) { ret = slist->capacity; } return ret;}SeqListNode* SeqList_Get(SeqList* list, int pos){ TSeqList* slist = (TSeqList*)list; SeqListNode* ret = NULL; if(NULL != slist && pos >= 0 && pos < slist->length) { ret = (SeqListNode*)(slist->node[pos]); } return ret;}int SeqList_Insert(SeqList* list, int pos, SeqListNode* node){ TSeqList* slist = (TSeqList*)list; int ret = (NULL != slist && pos >= 0 && pos < slist->capacity); ret = ret && (NULL != node); if(ret != 0) { int i; if(pos > slist->length) { pos = slist->length; } for(i = slist->length; i>pos; i--) { slist->node[i] = slist->node[i-1]; } slist->node[i] = (TSeqListNode)node; // slist->length++; } return ret;}SeqListNode* SeqList_Delete(SeqList* list, int pos){ SeqListNode* ret = SeqList_Get(list, pos); TSeqList* slist = (TSeqList*)list; if(NULL != ret ) { for(int i = pos; i < slist->length-1; i++) { slist->node[i] = slist->node[i+1]; } slist->length--; } return ret;}
// main.c#include<stdio.h>#include"SeqList.h"char main(char argc, char *argv[]) { SeqList* list = SeqList_Create(10); char i = 'a'; char j = 'a'+1; char k = 'a'+2; char x = 'a'+3; char y = 'a'+4; char z = 'a'+5; SeqList_Insert(list, 0, &i); SeqList_Insert(list, 0, &j); SeqList_Insert(list, 0, &k); SeqList_Insert(list, 0, &x); SeqList_Insert(list, 0, &y); SeqList_Insert(list, 0, &z); SeqList_Delete(list, 5); printf("%c\n", *((char*)(SeqList_Get(list, 3)))); SeqList_Destroy(list); return 0;}
小结:
1)理解对于int *p = new int[6];
则每一个p[i]
存的都是int而不是int*
数据;
2)代码实现时为了代码的健壮性,必须对每一个传入的入参进行边界的检查,如指针是否为NULL
, 位置pos
是否合法,是否越界等等;
3)代码实现之前也要考虑那些操作会影响数据结构中的数据成员,是否属于变动性的操作,考虑好后续影响之后,在代码实现是别忘了这些影响的语句;
4)注意对于数据结构中代码的重用,比如这里的删除节点之前,可以通过get
函数先取到对应的元素值,其中也是进行了边界检查,这个时候这些代码片段是可以进行重用的,因此先进行get
函数的编码,这些在下手之前都是可以先考虑清楚的;
5)考虑这里对void*的使用,使得该数据结构可以复用,void*
是万能指针,可以代表所有,是一种抽象,概括的软件设计艺术;
6)这里也使用了“所有东西无论多大的或者任何结构的数据存储都会栈空间,都有一个起始地址”,因此使用了存地址的形式间接存数据,再结合void*
这种万能指针实现C语言中的可复用代码,这种思想值得好好学习;
0 0
- 【SeqList】线性表代码实现总结
- 链表线性表的c语言实现方式 seqlist.h 和 seqlist.c
- SeqList(顺序表的实现)
- SeqList 顺序表的实现
- Seqlist 代码
- 顺序表实现(SeqList C++)
- SeqList 顺序表的静态实现
- 1.1顺序表(SeqList)的实现
- 线性表实现代码
- 循序表的(SeqList.c)(函数实现)
- 【数据结构】顺序表seqlist
- SeqList
- seqlist
- Seqlist
- SeqList.
- SeqList
- SeqList——顺序表
- 顺序表类:class SeqList
- SpringMVC的@ModelAttribute和@RequestParam、@PathVariable、@CookieValue、@SessionAttributes
- 【OpenCV 基础】Mat和IplImage间的相互转换
- java实现最基础的中国5角星
- Gradle文件结构介绍
- 【CCF】命令行选项
- 【SeqList】线性表代码实现总结
- mysql_thread_safe()
- POJ 2516--Minimum Cost【最小费用最大流 && 经典】
- 开始学习ACM,刷杭电OJ
- super() 和this()为什么要放在构造函数的第一个语句
- 剑指offer OJ,旋转数组的最小数字
- 小Y上学记——小Y的玩偶(贪心)
- Android 自定义控件——Simple_Loading
- uva 11090 Going in Cycle!! 平均权值最小的回路