C語言數據結構複習

所謂數據結構,其實就是數據在內存中存儲的方式。不一樣結構提供不一樣的數據存儲方式。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);    
}
View Code

隊列,是先進先出,跟棧的先進後出,造成對比。也稱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表就是爲了解決鏈表不易查找而出現的。它結合了鏈表和數組的優勢,從容完成大型數據的快速查找和操做。

上面的鏈接講的很詳細,估計也不會講的比他好了。因此本身留一個備份。

相關文章
相關標籤/搜索