【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
原创粉丝点击