ADT的设计
Created|Updated
|Post Views:
前言
ADT(抽象数据类型),如果我们的程序需要使用类型,C中没有与之匹配的基本类型。那我们可以自己定义抽象数据类型。如果,我们要设计一个数据类型需要:
- 提供存储数据的方法。(定义一个结构)
- 描述操控该数据的方法
如何实现?
- 对数据类型进行一个属性和操作的描述。
- 开发一个实现ADT的接口。(在.h头文件)
- 编写代码实现接口。(.c文件)
例如
int类型
给我们的属性是:它代表一个整数值。
操作是:可以进行+ - * / %
- Anyway.ADT就是描述一些这个类型是属性和操作。如果要实现它,再通过接口(.h .c)来实现它。
Related Articles
2020-04-28
函数的效率
前言比较两个函数的效率,可以通过它的运行时间来确定。所以可以通过clock()函数来确定某段程序走过多少ticks。 如何确定运行时间 O(N) N是for循环的运行次数。如果是while循环的话,则要看结束条件和内部,要循环多少次 运行时间为O(L+P)123456789101112131415void PrintLots(List L, List P){ int Counter = 1; Position Ppos = L, Lpos = P; while (Ppos->next != NULL && Lpos->next != NULL) { if(Ppos->i == Counter++)//每次循环不一定执行,运行时间为O(P) { printf("%d ", Lpos->i); Ppos = Ppos->next; } Lpos = ...
2020-05-28
图的遍历
Depth_First_Search过程 从某个顶点v1出发,然后找到并访问与v1的邻接点(且从未访问过)v2,再从v2出发访问与v2相邻的顶点。–>这就是递归思想 直到所有的顶点被访问到。 因为要记录该点是否被访问过,所以需要一个数组bool visited[MAXVEX]; 邻接矩阵遍历12345678910111213141516171819202122void DFS(MGraph G, int i){ int j; visited[i] = true; printf("%c ", G.vexs[i]); for(j = 0; j < G.numVertexs; j++) { //有边(i--j),且 j 顶点没被访问 if(G.arc[i][j] == 1 && visited[j] == false) DFS(G, j); }}void DFSTraverse(MGraph G)...
2020-04-30
递归打开文件中的文件
前言我们知道#include可以引入文件,又可推知,引入的文件中还能包含#include,再次引入文件。即,引用文件中的文件。 我们可以使用递归来输出所有引入文件的内容 函数strstr() 参数(s1, s2) 返回值返回s2的首字符地址,找不到返回NULL 作用从字符串s1中找到字符串s2 strchr() 参数(s1, c1) 返回值返回s1中c1的字符地址 作用从s1中查找c1字符 注意调用字符串与首元素地址,紧密联系即,以上s1,s2都是字符串的首元素地址 实现filename.c1234567#include<stdio.h>#include<stdlib.h>#include "add.c"void Print(){ printf("Hello");} add.c123456#include<stdio.h>void add(){ printf("Hi");} main文件123456789101...
2022-02-01
Tree
二叉树二叉树是树的一种,每个节点最多只能有两个孩子。 树型结构是一种逻辑结构,他们同样可以用顺序结构和链式结构来实现。 结构1234567//树的相关数据结构typedef char BiElemType;typedef struct BiTNode { BiElemType c; struct BiTNode* lchild; struct BiTNode* rchild;}BiTNode, * BiTree; 层序建树这里要用到一个辅助链表(不带头节点)。它将记录一个个节点,一层层,插入到树中的顺序。 流程图 代码实现123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172#include"Header.h"void PreOrder(BiTree p) { if (p != NULL) { putch...
2020-05-12
链队列
前言链队列就是限制了只能在首端和尾端进行插入,删除操作的表。 链队列中需要头节点 实现它需要声明两个结构。QNode存储某一项的数据,和指向下一项的结构指针。ListQueue存储指向头节点和尾节点的结构指针。 12345678910typedef struct QNode{ ElementType data; struct QNode *next;}QNode, *QNodePtr;typedef struct ListQueue{ QNodePtr front, rear;}ListQueue, *ListQueuePtr; 空队列判断条件 front和rear同时指向头节点 操作插入12345678910111213void EnQueue(ListQueuePtr Q, ElementType e){ QNodePtr P = (QNodePtr)malloc(sizeof(QNode)); if(P == NULL) { fprintf(stder...
2020-05-17
遍历二叉树
概念二叉树的遍历是从根节点出发,按照某几种不同的顺序遍历每个节点,使得每个节点被遍历仅一遍。这些遍历方法分为:1. 前序遍历2. 中序遍历3. 后序遍历4. 层序遍历规则:若树为空(T == NULL),则空操作返回(return),否则执行访问(递归) 说明如何看待遍历顺序?