数据结构(第1章: 概述)

    程序 = 算法 +数据结构 —— 尼古拉斯.沃斯(Niklaus Wirth)

    程序设计其实质就是为了解决问题,算法是问题的处理策略,数据结构则是问题的数学模型。寻求数学模型的实质是通过分析问题并从中提取操作对象,找到操作对象之间的关系,然后用数学的语言加以描述。

    解决问题的步骤:

   

    数据结构简单说是把数据以一定的结构形式组织起来。数据结构可分为逻辑结构与物理结构(又称存储结构)。逻辑结构描述数据元素之间的逻辑关系,物理结构则是数据结构在计算中的表示(或映像)。

    数据结构可以通过编程语言所提供的数据类型、引用及其他操作加以实现。

 数据结构有4类基本结构:1)集合 2)线性结构 3)树形结构 4)图状结构

 

 1.抽象数据类型

     抽象数据类型(Abstract Data Type,ADT)是指一个数学模型以及定义在该模型上的一组操作。抽象数据类型的定义仅取

 决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关,即不论其内部结构如何变化,只要它的数学特性不变,都

 不影响其外部的使用。

     抽象数据类型实质上和数据类型是一个概念,“抽象”的意义在于数据类型的数学抽象特性。

     抽象数据类型的定义由一个值域和定义在该值域上的一组操作组成。按其值的不同特性可分为:

  1>  原子类型。如,int整数类型

  2>  固定聚合类型。如,复数是由两个确定数目的实数依确定的次序关系构成。

  3>  可变聚合类型。如,定义一个“有序整数序列”的抽象数据类型,其中序列的长度是可变的。

      固定聚合类型和可变聚合类型可统称为结构类型。

     抽象数据类型定义格式:

     ADT抽象数据类型名{

          数据对象:{数据对象的定义}

          数据关系:{数据关系的定义}

          基本操作:{基本操作的定义}

        }ADT抽象数据类型名

    2.时间复杂度

        算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n)=O(f(n)),它表示随着问题规

    模n的增大,算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称时间复杂度。

        为了便于比较同一问题的不同算法,通常从算法中选取一种对所研究的问题来说是基本操作的原操作,以该基本操作重复

    执行的次数作为算法的时间量度。

    3.空间复杂度

        算法所需存储空间的量度是空间复杂度,记作:S(n)=O(f(n)),其中n为问题的规模或大小。
        算法的存储量包括: 1>输入数据所占空间 2>程序本身所在空间 3>辅助变量所占空间
    4.数据结构,从C语言角度上简单来说就是如何组织设计结构体,而关键有以下几个结构体:
4.1> 线性表
/*=======================  线性表=========================*/
/*1>---------线性表:顺序表的动态分配存储结构---------*/
#define LIST_INIT_SIZE 100    /*线性表存储空间的初始分配量*/
#define LIST_INCREMENT  10    /*线性表存储空间的分配增量*/
typedef elem_type int;
typedef struct{
    elem_type *elem;          /*存储空间基址*/
    int list_len;             /*当前长度*/
    int list_size;            /*当前分配的存储容量*/
}seq_list;


/*2>---------线性表:单链表存储结构---------*/
typedef struct list_node
{
    elem_type data;           /*数据域*/
    struct list_node *next;   /*指针域*/
}list_node, *link_list;


/*3>---------线性表:单链表的静态存储结构---*/
#define MAXSIZE 1000 /*链表的最大长度*/
typedef struct
{
    elem_type data;
    int cur;
}component, static_link_list[MAXSIZE];


/*4>---------线性表:双向链表的存储结构------*/
typedef struct dul_node
{
    elem_type data;
    struct dul_node *prior;
    struct dul_node *next;
}dul_node, *dul_link_list;


/*5>---------线性表:带头结点的单链表的存储结构---------*/
typedef struct list_node
{
    elem_type data;
    struct list_node *next;
}list_node_t, *position;

typedef struct 
{
    list_node_t *head, *tail; /*head作为头结点,其next指向第一个结点;而tail指向最后一个结点*/
    int len;                  /*指示线性链表中数据元素的个数*/
}link_list_t;


/*=======================栈=========================*/
/*1>---------栈的顺序存储表示---------*/
#define STACK_INIT_SIZE 100   /*存储空间初始分配量*/
#define STACK_INCREMENT  10   /*存储空间分配增量*/
typedef int stack_elem_type;
typedef struct 
{
    stack_elem_type *base;    /*在栈构造之前和销毁之后,base值为NULL*/
    stack_elem_type *top;     /*栈顶指针*/
    int stack_size;           /*当前已分配的存储空间,以元素为单位*/
}seq_stack;

/*2>---------栈的链式存储表示---------*/
typedef struct stack_node
{
    stack_elem_type data;
    struct stack_node *next;
}stack_node, *stack_list;

/*=======================队列=========================*/
/*1>---------单链队列-- 队列的链式存储结构---------*/
typedef int queue_elem_type;
typedef struct queue_node
{
    queue_elem_type data;
    struct queue_node *next;
}queue_node, *queue_ptr;

typedef struct 
{
    queue_ptr front; /*队头指针*/
    queue_ptr read;  /*队尾指针*/
}link_queue;

/*2>---------循环队列-- 队列的顺序存储结构---------*/
#define MAXQSIZE 100  /*最大队列长度*/
typedef struct
{
    queue_elem_type *base;
    int front;
    int rear;
}seq_queue;
4.2> 树
/*=======================树=========================*/
/*1>---------二叉树的顺序存储表示---------*/
#define MAX_TREE_SIZE 100                            /*二叉树的最大结点树*/
typedef int tree_elem_type;
typedef tree_elem_type seq_bi_tree[MAX_TREE_SIZE]; /*0号单元存储根结点*/
seq_bi_tree bt;                                      /*仅适用于完全二叉树*/


/*2>---------二叉树的二叉链表存储表示---------*/
typedef struct bi_tree_node
{
    tree_elem_type data;
    struct bi_tree_node *lchild, *rchild;/*左右孩子指针*/
}bi_tree_node, *bi_tree;


/*3>---------赫夫曼树和赫夫曼编码的存储表示---------*/
typedef struct
{
    unsigned int weight;
    unsigned int parent,lchild,rchild;
}huff_tree_node, *huffman_tree;
typedef char **huffman_code;
4.3> 图
/*=======================图形=========================*/
/*---------图的数组(邻接矩阵)存储表示---------*/
#define INFINITY INT_MAX
#define MAX_VERTEX_NUM 20    /*最大顶点个数*/
typedef enum {DG,DN,UDG,UDN}graph_kind;/*有向图,有向网,无向图,无向网*/
typedef int vr_type;
typedef char info_type;
typedef struct arc_cell
{
    vr_type adj;    /*顶点关系类型*/
    info_type *info;/*该弧相关信息的指针*/
}arc_cell, adj_matrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef char ver_tex_type;
typedef struct
{
    ver_tex_type vexs[MAX_VERTEX_NUM];/*顶点向量*/
    adj_matrix arcs;                  /*邻接矩阵*/
    int vexnum, arcnum;               /*图的当前顶点数和弧数*/
    graph_kind kind;                  /*图的种类标志*/
}m_graph;

/*---------图的邻接表存储表示---------*/
#define MAX_VERTEX_NUM 20
typedef struct arc_node
{
    int adjvex;                 /*该弧所指向的顶点的位置*/
    struct arc_node *next_arc;  /*指向下一条弧的指针*/
    info_type *info;            /*该弧相关信息的指针*/
}arc_node;

typedef struct v_node
{
    ver_tex_type data;          /*顶点信息*/
    arc_node *first_arc;        /*指向第一条依附该顶点的弧的指针*/
}v_node, adj_list[MAX_VERTEX_NUM];

typedef struct 
{
    adj_list vertices;         /*图的当前顶点数和弧数*/
    int vexnum, arcnum;        /*图的种类标志*/
    int kind;
}al_graph;

/*---------有向图的十字链表存储表示---------*/
#define MAX_VERTEX_NUM 20
typedef struct arc_box
{
    int tailvex, headvex;
    struct arc_box *hlink,*tlink;
    info_type *info;
}arc_box;

typedef struct vex_node
{
    ver_tex_type data;
    arc_box *first_in, *first_out;/*分别指向该顶点的第一条入弧和出弧*/
}vex_node;

typedef struct
{
    vex_node xlist[MAX_VERTEX_NUM];/*表头向量*/
    int vexnum, arcnum;            /*有向图的当前顶点数和弧数*/
}ol_graph;

/*---------无向图的邻接多重表存储表示---------*/
#define MAX_VERTEX_NUM 20
typedef enum{unvisited,visited}visit_if;
typedef struct ebox
{
    visit_if mark;             /*访问标记*/
    int ivex,jvex;             /*该边指向依附这两个顶点的下一条边*/
    struct ebox *ilink,*jlink; /*该边的信息指针*/
    info_type *info;
}ebox;
typedef struct vex_box
{
    ver_tex_type data;
    ebox *first_edge;         /*指向第一条依附该顶点的边*/
}vex_box;

typedef struct
{
    vex_box adjmulist[MAX_VERTEX_NUM];
    int vexnum,edgenum;       /*无向图的当前顶点数和边数*/
}aml_graph;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值