数据结构之顺序链表

来源:互联网 发布:cc网络验证模块源码 编辑:程序博客网 时间:2024/04/27 05:20

学习数据结构已经很久了,一直没有用上,最近时间有点空闲,所以翻出来炒一炒。子曰:温故而知新。当初学习数据结构的时候,买的是国嵌唐老师的视频,所以这些代码和唐老师课上写的几乎一模一样,若转载请注明出自国嵌唐老师数据结构教程。

首先来看第一个例子,顺序表:

头文件

#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{    intlength;    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;}

上面代码都可以放到工程里面直接用,对于嵌入式开发的不能用到很多集成库,很多东西都要自己写,所以上面的代码是可复用的。



0 0
原创粉丝点击