数据结构算法中用到的存储结构

来源:互联网 发布:xp无法连接网络打印机 编辑:程序博客网 时间:2024/05/18 00:33

任何算法都是用于数据处理的,算法设计总是基于某种存储结构。很多人都会遇到这样的一个问题:拿到一个算法设计题只知道其过程,可以用文字来描述,但不会写出正确的代码。主要的原因有两方面

1、对存储结构不熟悉,比如不熟悉较为复杂的图的邻接矩阵存储结构和邻接表存储结构;
2、对计算机语言不熟悉,比如C/C++语言的不熟练使用

基本概念

数据概念

  • 数据在CS中是指所有能被输入到计算机中并能被计算机处理的符号的总称。
  • 数据元素是表示数据的基本单位;数据项是数据的最小单位,数据元素有若干个数据项组成。比如上图中一个学生记录就是一个数据元素,它由 学号、姓名、性别 3个数据项组成。
  • 数据对象是性质相同的数据元素的集合,是数据的一个子集。比如 大写字母就是一个数据对象,大写字母数据对象是集合{‘A’, ‘B’, …, ‘Z’}。在数据结构中数据通常指的是数据对象。
  • 数据结构是指相互之间存在某种关系的数据元素的集合,数据结构中的关系主要是指相邻关系(一对一,一对多,多对多)
  • 数据结构包含三方面内容:逻辑结构、存储结构(物理结构)和对数据的运算。逻辑结构:线性结构(一对一),树形结构(一对多),图形结构(多对多)。
  • 存储结构(数据的逻辑结构在计算机中的存储形式):顺序存储,链式存储,索引存储,散列存储。

以下给出常用的存储结构:

顺序表

//  顺序表(借助数组实现)typedef struct {    ElemType data[MaxSize];  //存放顺序表中的元素    int length;              //存放顺序表的长度}SqList;//单链表typedef struct LNode {          //定义节点    ElemType data;              //数据域    struct LNode *next;         //指针域}LinkList;                      //声明单链表节点的类型//双链表typedef struct DLinkList {    ElemType data;                   //数据域    struct DLinkList *prior,         //prior指向前驱节点    struct DLinkList *next;  ,      //next指向后继节点}DLinkList;//栈----只能在一端进行插入或删除操作的线性表(借助数组实现),其存储结构:顺序栈,链栈//顺序栈typedef struct {    ElemType data[MaxSize];    int top;         //栈顶指针,初始化 top = -1;}SqStack;//链栈(借助带头结点的单链表来作为链栈,即只能在一端进行插入和删除)typedef struct LinkNode {    ElemType data;    struct LinkNode *next;}LinkStack;//队列----顺序队列、链队列//顺序队列typedef struct {    ElemType data;    int front, rear;  //front指向队头,rear指向队尾}SqQueue;//链队列typedef struct qnode {    ElemType data;    struct qnode *next;}QNode;typedef struct {    QNode *front;     //队头指针    QNode *rear;      //队尾指针}LinkQueue;

树(二叉树)

//顺序存储结构typedef ElemType SBTree[MaxSize];//孩子兄弟链typedef struct node {          ElemType data;    struct node *lchild;    struct node *rchild;}BTNode;              

这里写图片描述

/*图的邻接矩阵*/#define MAXV 100     //最大顶点个数typedef char ElemType;typedef struct {    int no;          //顶点编号    ElemType info;   //顶点其他信息}VertexType;         //顶点类型typedef struct {    int edges[MAXV][MAXV];  //邻接矩阵    int n, e;               //顶点数,边数    VertexType vexs[MAXV];  //存放顶点信息}MGraph;                    //声明图的类型

这里写图片描述

/*图的邻接表*/typedef char ElemType;typedef int  InfoType;typedef struct ArcNode {     //定义边表节点    int adjvex;              //该边的终点位置    struct ArcNode *nextarc; //指向下一条边的指针    InfoType info;           //边相关信息,带权图可存放权值}ArcNode;                    //声明边表节点类型typedef struct VNode {    ElemType data;           //邻接表头节点类型    ArcNode *firstarc;       //指向第一条边}VNode, AdjList[MAXV];       //声明表头节点类型typedef struct {    AdjList adjlist;         //邻接表    int n, e;                //顶点数,边数}AGraph;                     //声明图的类型

数据结构与算法是程序员的内功,我的弱项,需要勤加练习,付出百倍努力。大牛与你的差距在于背后付出了多少汗水。凡事都需要一个过程,你现在觉得难的,将来它会像1 + 1 = 2 一样简单。

0 0
原创粉丝点击