发新话题
打印

数据结构与算法综合资料库

数据结构与算法综合资料库

何谓数据结构

数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。

数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

数据结构主要研究什么?

数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

什么是数据结构?什么是逻辑结构和物理结构?

数据是指由有限的符号(比如,"0"和"1",具有其自己的结构、操作、和相应的语义)组成的元素的集合。结构是元素之间的关系的集合。通常来说,一个数据结构DS 可以表示为一个二元组:

DS=(D,S), //i.e., data-structure=(data-part,logic-structure-part)

这里D是数据元素的集合(或者是“结点”,可能还含有“数据项”或“数据域”),S是定义在D(或其他集合)上的关系的集合,S = { R | R : D×D×...},称之为元素的逻辑结构。

逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构。表和树是最常用的两种高效数据结构,许多高效的算法可以用这两种数据结构来设计实现。表是线性结构的(全序关系),树(偏序或层次关系)和图(局部有序(weak/local orders))是非线性结构。

数据结构的物理结构是指逻辑结构的存储镜像(image)。数据结构 DS 的物理结构 P 对应于从 DS 的数据元素到存储区M(维护着逻辑结构S)的一个映射:

PD,S) --> M

存储器模型:一个存储器 M 是一系列固定大小的存储单元,每个单元 U 有一个唯一的地址 A(U),该地址被连续地编码。每个单元 U 有一个唯一的后继单元 U'=succ(U)。

P 的四种基本映射模型:顺序(sequential)、链接(linked)、索引(indexed)和散列(hashing)映射。

因此,我们至少可以得到4×4种可能的物理数据结构:

   

sequential
(sets)
   

linked
lists
   

indexed
trees
   

hash
graphs

(并不是所有的可能组合都合理)

数据结构DS上的操作:所有的定义在DS上的操作在改变数据元素(节点)或节点的域时必须保持DS的逻辑和物理结构。

DS上的基本操作:任何其他对DS的高级操作都可以用这些基本操作来实现。最好将DS和他的所有基本操作看作一个整体——称之为模块。我们可以进一步将该模块抽象为数据类型(其中DS的存储结构被表示为私有成员,基本操作被表示为公共方法),称之为ADT。作为ADT,堆栈和队列都是一种特殊的表,他们拥有表的操作的子集。

对于DATs的高级操作可以被设计为(不封装的)算法,利用基本操作对DS进行处理。

好的和坏的DS:如果一个DS可以通过某种“线性规则”被转化为线性的DS(例如线性表),则称它为好的DS。好的DS通常对应于好的(高效的)算法。这是由计算机的计算能力决定的,因为计算机本质上只能存取逻辑连续的内存单元,因此如何没有线性化的结构逻辑上是不可计算的。比如对一个图进行操作,要访问图的所有结点,则必须按照某种顺序来依次访问所有节点(要形成一个偏序),必须通过某种方式将图固有的非线性结构转化为线性结构才能对图进行操作。

树是好的DS——它有非常简单而高效的线性化规则,因此可以利用树设计出许多非常高效的算法。树的实现和使用都很简单,但可以解决大量特殊的复杂问题,因此树是实际编程中最重要和最有用的一种数据结构。树的结构本质上有递归的性质——每一个叶节点可以被一棵子树所替代,反之亦然。实际上,每一种递归的结构都可以被转化为(或等价于)树形结构。

计算机中数据的描述方式

我们知道,数据可以用不同的形式进行描述或存储在计算机存储器中。最常见的数据描述方法有:公式化描述、链接描述、间接寻址和模拟指针。

公式化描述借助数学公式来确定元素表中的每个元素分别存储在何处,也就通过公式计算元素的存储器地址。最简单的情形就是把所有元素依次连续存储在一片连续的存储空间中,这就是通常所说的连续线性表,即数组。复杂一点的情形是利用复杂的函数关系根据元素的某些特征来计算元素在内存中的位置,这种技术称为散列技术(Hash,经常音译为哈希技术)。
在链接描述中,元素表中的每个元素可以存储在存储器的不同区域中,每个元素都包含一个指向下一个元素的指针。这就是通常所说的链表。这种描述方法的好处是,知道了第一个元素的位置,就可以依次找到第n个元素的位置,而且在其中插入元素非常方便,缺点是查找某个元素要遍历所有在该元素之前的元素,实际应用中经常和公式化描述结合起来使用。
在间接寻址方式中,元素表中的每个元素也可以存储在存储器的不同区域中,不同的是,此时必须保存一张表,该表的第i项指向元素表中的第i个元素,所以这张表是一个用来存储元素地址的表。指针数组(元素为指针的数组)就是这种描述法的应用。这种描述方法是公式化描述和链接描述的一种折衷方案,同时具有两种描述方法的优点,但是需要额外的内存开销。
模拟指针非常类似于链接描述,区别在于它用整数代替了指针,整数所扮演的角色与指针所扮演的角色完全相同。模拟指针的描述方式是链接描述和公式化描述的结合,元素被存储在不同的区域中,每个元素包含一个指示下一个元素位置的整数,可以通过某种公式由该整数计算出下一个元素的存储器地址。线性表的游标实现就是模拟指针描述法。

我就是传说中的任哥大人。挣点回贴我容易吗? 大家积极回帖啊~~~3Q

TOP

用递归中序遍历二叉树




#include<stdlib.h>
struct tree                //声明树的结构
{
    struct tree *left;
    int data;
    struct tree *right;
};
typedef struct tree treenode;
type treenode *b_tree;             //声明二叉树链表
//插入二叉树的节点
b_tree insert_node(b_tree root,int node)
{
    b_tree newnode;
    b_tree currentnode;
    b_tree parentnode;
   
    newnode=(b_tree)malloc(sizeof(treenode));     //建立新节点的内存空间
    newnode->data=node;
    newnode->right=NULL;
    newnode->left=NULL;
    if(root=NULL)
         return newnode;
    else
    {   currentnode=root;
         while(currentnode!=NULL)
         {   parentnode=currentnode;
              if( currentnode->data>node)
                   currentnode=currentnode->left;
              else   currentnode=currentnode->right;
         }
         if(parentnode->data>node)
              parentnode->left=newnode;
         else  parentnode->right=newnode;
    }
    return root;
}
// 建立二叉树
b_tree create_btree(int *data,int len)
{
    b_tree root=NULL;
    int i;
    for(i=0;i<len;i++)
         root=insert_node(root,data);
    return root;
}
//二叉树中序遍历
void inorder(b_tree point)
{
    if(point!=NULL)
    {
         inorder(point->left);
         printf("%d",point->data);
         inorder(point->right);
    }
}
//主程序
void main( )
{
    b_tree root=NULL;
    int i,index;
    int value;
    int nodelist[20];
    printf("\n pleaase input the elements of binary tree(exit for 0 ):\n");
    index=0;
    //读取数值存到数组中
    scanf("%d",&value);
   
    while(value!=0)
    {
         nodelist[index]=value];
         index=index+1;
         scanf("%d",&value);
    }
    //建立二叉树
    root=create_btree(nodelist,index);
    //中序遍历二叉树
    printf("\nThe inorder traversal result is :");
    inorder(root);
    printf("\n");
}

我就是传说中的任哥大人。挣点回贴我容易吗? 大家积极回帖啊~~~3Q

TOP

楼主是中南的吗:

TOP

不是啊,怎么认为我是中南大学的啊。

我就是传说中的任哥大人。挣点回贴我容易吗? 大家积极回帖啊~~~3Q

TOP

我是高中生 爱好计算机 怎么觉得考研的内容不难啊 和联赛相比差不多啊

TOP

有前途!

TOP

每天有份好心情

TOP

发新话题