所謂數據結構,其實就是數據在內存中存儲的方式。不一樣結構提供不一樣的數據存儲方式。node
爲何會有這麼多種數據結構?緣由就是不一樣數據結構適用不一樣的算法,讓咱們的程序跑得更快,資源利用得更加充分。算法
那麼總結一下幾種數據結構:線性表(順序存儲結構和鏈式存儲結構,因此也叫順序表和鏈表);數組
typedef struct { int data[1024]; int last; }sequenlist;
void Initlist(sequenlist* &L)
{
L=(sequenlist*)malloc(sizeof(sequenlist));
L->last=0;
}
從順序表的定義中就能夠看出,其操做的特色:邏輯相鄰則物理位置也相鄰;操做時須要移動大量元素,效率低;最大表長難以估計。所以就能夠選用鏈表。數據結構
typedef struct node { int data; struct node* next; }linklist;
linklist*Createlist()
{
linklist*head,*p;
head=(linklist*)malloc(sizeof(linklist));
head->next=NULL;
return head;
}
linklist*get(linklist*head,int i)
{
linklist*p=head;
int j=0;
while(p->next!=NULL&&j<i)
{
p=p->next;
j++;
}
if(i==j)return p;
else return NULL;
}
他是動態存儲空間,C語言中的兩個標準生成和釋放函數:p=(linklist*)malloc(sizeof(linklist));free(p);ide
此外還有循環鏈表,雙向列表。針對兩種存儲結構,若是對線性表的操做以查找爲主,採用順序存儲結構;若以插入和刪除爲主,則採用鏈式存儲結構。函數
棧和隊列(兩種存儲方式,由於也是線性的),可稱爲運算受限的線性表。spa
typedef struct { int data[1024]; int TOP; }seqstack;
這裏面TOP就是指針(和真正的指針不同,這裏就是個序號);跟數組下表有點相似。.net
typedef struct node { int data; struct node*next; }stacknode; typedef struct { stacknode*TOP; }linkstack;
鏈棧不會出現上溢狀況,可是會下溢;棧的應用:在數制轉換以及編譯程序中的表達式求值、函數遞歸調用等。下面給出一個使用棧的,例子,做爲本身的記錄:指針
/****************棧的例子****************/ typedef struct node{ int data; struct node*next; }stacknode; typedef struct { stacknode* TOP; }linkstack; void initstack(linkstack*&S) { S=(linkstack*)malloc(sizeof(linkstack)); S->TOP=NULL; } void push(linkstack*S,int e) { stacknode*p=(stacknode*)malloc(sizeof(stacknode)); p->data=e; p->next=S->TOP; S->TOP=p; } int empty(linkstack*S) { if(S->TOP<=0) return 1; else return 0; } int pop(linkstack*S,int &e) { stacknode *p=S->TOP; if(empty(S)) { printf("xiayi"); return 0; } else { e=p->data; S->TOP=p->next; free(p); return 1; } } void conversion(int y,int base) { linkstack *S; int bit; initstack(S); while(y!=0) { push(S,y%base); y=y/base; } while(!empty(S)) { pop(S,bit); if(bit>9) printf("%c",bit+55); else printf("%c",bit+48); } printf("\n"); } int main() { int y=1348; conversion(y,8); }
隊列,是先進先出,跟棧的先進後出,造成對比。也稱FIFO。code
樹,樹形結構是非線性數據結構。二叉樹最經常使用。
根據存儲結構,能夠有順序存儲和鏈式存儲,順序存儲必須把二叉樹轉化爲徹底二叉樹,缺點也很明顯,具備不少虛節點。
typedef char datatype; typedef struct node { datatype data; struct node *lchild,*rchild; }bitree; bitree *root;
hash表及其算法。
這裏加入了一個特殊的數據結構,是由於Linux內核不少地方時hash表組織的,因此這裏將hash算法複習一下。
http://blog.csdn.net/v_july_v/article/details/6256463
其實hash表就是爲了解決鏈表不易查找而出現的。它結合了鏈表和數組的優勢,從容完成大型數據的快速查找和操做。
上面的鏈接講的很詳細,估計也不會講的比他好了。因此本身留一個備份。