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表就是为了解决链表不易查找而出现的。它结合了链表和数组的优势,从容完成大型数据的快速查找和操做。

上面的链接讲的很详细,估计也不会讲的比他好了。因此本身留一个备份。

相关文章
相关标签/搜索