数据结构
某种组织与保存数据的方式,分物理与逻辑两种角度来设计。物理一般是数组、链表,逻辑多种多样,如树、图等。
某一具体的数据结构必然也要配备相对应的操作集,这些操作集要尽可能的高效,才能最大程度发挥该数据结构的优势。
一般而言,操作集有:增加元素、删除元素、修改元素、查找元素、返回当前规模、清空当前数据等。
对于查找元素,这里规范语义:当查找元素时,返回不小于该元素的第一个元素,即:若不存在该元素,返回不大于该元素的位置;仅存在一个该元素,返回该元素位置;若存在多个该元素,返回最后一个位置。
数组(向量,Vector)
数组是一组地址连续的数据结构。C++中的Vector就是基于数组的数据结构构建的。
因为地址连续,我们可以通过循秩(call-by-rank)的方式访问元素。
但数据大小一旦确定就不能更改,除非另开辟一组更大的内存并将原数组的数据复制过去。
而且数组需要地址连续,因此申请空间时,内存必须存在一个足够大、且连续的内存空间,才能申请成功,否则会失败。
如果是已有序的数组,查找可以通过二分查找达到更高效的查找。
如下用C语言简单实现,比较简单未做单元测试。

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define ERROR -1 5 6 typedef int T; 7 typedef struct{ 8 T* Data; 9 int Size; 10 }Vector; 11 12 Vector* Create(int size){ 13 Vector* v; 14 15 v = (Vector *)malloc(sizeof(Vector)); 16 v->Data = (T *)malloc(sizeof(T)*size); 17 v->Size = size; 18 19 return v; 20 } 21 22 void Add(int rank, T data, Vector *v){ 23 if( v->Size <= rank ) 24 return; 25 26 int i; 27 for( i=v->Size-1; i>rank; i--) 28 v->Data[i] = v->Data[i-1]; 29 v->Data[i] = data; 30 } 31 32 void Remove(int rank, Vector *v){ 33 if( v->Size <= rank ) 34 return; 35 36 int i; 37 for( i=rank; i<v->Size-1; i++) 38 v->Data[i] = v->Data[i+1]; 39 } 40 41 void Modify(int rank, T mod, Vector *v){ 42 if( v->Size <= rank ) 43 return; 44 v->Data[rank] = mod; 45 } 46 47 int Search(T data, Vector *v){ 48 int i; 49 50 for( i=v->Size-1; i>=0; i--) 51 if( v->Data[i] == data) 52 return i; 53 return ERROR; 54 } 55 56 int main(void){ 57 58 return 0; 59 }
链表(列表, List)
链表与数组不同的是,链表的地址是不连续的,因此不能通过循秩访问。链表是通过每个结点的一个或多个指针来找到下一个或上一个或某一个其他数据。C++中的列表就是通过链表来实现的。
因此,链表属于逻辑上的连续,而非物理上的连续。也因此,给链表申请结点时,只要内存中含有一个结点大小的空间就能申请成功,最大度利用空间。
因为链表的地址不连续,所有无法使用二分查找来提高查找速度。以下C语言实现一个单链表(单向链表),常用的还有双链表、十字链表等。

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define ERROR NULL 5 6 typedef int T; 7 typedef struct LNode *PNode; 8 struct LNode{ 9 T Data; 10 PNode Next; 11 }; 12 typedef PNode List; 13 14 List Create(){ 15 List list; 16 17 list->Next = NULL; 18 return list; 19 } 20 21 void Add(PNode pos, T data, List list){ 22 PNode p; 23 24 p = list; 25 while( p && p->Next != pos ) 26 p = p->Next; 27 if( p ){ 28 PNode node = (PNode)malloc(sizeof(struct LNode)); 29 node->Data = data; 30 node->Next = p->Next; 31 p->Next = node; 32 } 33 } 34 35 void Remove(T data, List list){ 36 PNode p; 37 38 p = list; 39 while( p && p->Next->Data != data ) 40 p = p->Next; 41 if( p ){ 42 PNode node = p->Next; 43 p->Next = node->Next; 44 free(node); 45 } 46 } 47 48 PNode Search(T data, List list){ 49 PNode p; 50 51 p = list; 52 while( p && p->Next->Data != data ); 53 if( p ) 54 return p->Next; 55 else 56 return ERROR; 57 } 58 59 int main(void){ 60 61 return 0; 62 }