程序设计其实质就是为了解决问题,算法是问题的处理策略,数据结构则是问题的数学模型。寻求数学模型的实质是通过分析问题并从中提取操作对象,找到操作对象之间的关系,然后用数学的语言加以描述。
解决问题的步骤:
数据结构简单说是把数据以一定的结构形式组织起来。数据结构可分为逻辑结构与物理结构(又称存储结构)。逻辑结构描述数据元素之间的逻辑关系,物理结构则是数据结构在计算中的表示(或映像)。
数据结构可以通过编程语言所提供的数据类型、引用及其他操作加以实现。
数据结构有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.空间复杂度
/*======================= 线性表=========================*/
/*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;
/*=======================树=========================*/
/*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;
/*=======================图形=========================*/
/*---------图的数组(邻接矩阵)存储表示---------*/
#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;