基础的表ADT -数据结构(C语言实现)
读数据结构与算法分析
表的概述
- 形如A1,A2,A3...
- 操作合集
- PrintList
- MakeEmpty
- Find
- Insert
- Delete
表的简单数组实现
分析:
- PrintList和Find操作线性时间
- Find操作常数时间
- Insert和Delete操作效率低下
所以一般不用数组实现
链表的指针实现
设计思路
- 在内存中不必相连
- 每个结构包含表元素和指向该元素后继元的指针
即实现了快速Insert和Delete操作
实现代码
类型声明
struct Node
typedef struct Node *PtrToNode ;
typedef PtrToNode List ;
typedef PtrToNode Position ;
//操作函数声明
List MakeEmpty(List L) ;
int IsEmpty(List L) ;
int IsLast(Position P, List L) ;
Positiom Find(ElementType X, List L) ;
void Delete(ElementType X, List L) ;
Position FindPrevios(ElementType X, List L) ;
void Insert(ElementType X, List L, Position P);
void DeleteList(List L);
Position Header(List L) ;
Position First(List L) ;
Position Advance(Position P) ;
ElementType Retrieve(Position P) ;
struct Node
{
ElemenType Element ;
Position Next ;
}
测试是否为空表
int IsEmpty(List L)
{
return L->Next == NULL ;
}
测试是否为链表末尾
int IsLast(List L, Position P)
{
return P->Next == NULL ;
}
Find函数,寻找元素
Position Find(List L,Element X)
{
Position P ;
P = L->Next ;
while(P->Element X != X && P != NULL)
P = P->Next ;
return P ;
}
//FindPrevious函数
Position FindPrevios(List L, Element X)
{
Position P ;
P = L ;
while(P->Next->Element != X && P->Next != NULL)
P = P->Next ;
return P ;
}
Delete函数,删除元素
void Delete(Element X, List L)
{
Position P ,TmpCell;
P = FindPrevious(L, X) ;
if(!IsLast(P,L)
{
TmpCell = P->Next ;
P->Next = TmpCell->Next ;
free(TmpCell) ;
}
}
Insert函数,插入元素
void Insert(Element X, List L, Position P)
{
Position TemCell ;
TemCell = malloc(sizeof(struct Node)) ;
if(TemCell = NULL)
{
printf("内存不足") ;
}
TmpCell->Element = X ;
TmpCell->Next = P->Next ;
P->Next = TmpCell ;
}
DeleteList函数,删除表
void DeleteList(List L)
{
Position P ,Tmp ;
P = L->Next ;
while(P != NULL)
{
Tmp = P->Next ;
free(P) ;
P = Tmp ;
}
}
双链表
- 在结点结构中增加一个指向前一个结点的指针
- 简化了删除操作,插入和删除的开销增加一倍
循环链表
- 在双链表的基础上增加一个表尾指向表头和表头指向表尾的指针
十字链表
- 可用数组实现,但浪费空间效率低下
- 链表实现:每行每列都有一个表头指向该行该列
链表的游标实现
许多语言,如Java,并不支持指针,就可以游标(cursor)实现法
设计思路
- 全局结构体数组模拟指针法,对于数组的任何单元,其数组下标来代表一个地址
- 使用一个数组来模拟malloc和free
- 数组0管理着链表的空闲内存
类型声明
typedef int PtrToNode ;
typedef PtrToNode List ;
typedef PtrToNode Position ;
//L为表头
//初始化
void InitializeCursorSpace(void)
//操作函数声明
List MakeEmpty(List L) ;
int IsEmpty(List L) ;
int IsLast(Position P, List L) ;
Positiom Find(ElementType X, List L) ;
void Delete(ElementType X, List L) ;
Position FindPrevios(ElementType X, List L) ;
void Insert(ElementType X, List L, Position P);
void DeleteList(List L);
Position Header(List L) ;
Position First(List L) ;
Position Advance(Position P) ;
ElementType Retrieve(Position P) ;
struct Node
{
ElemenType Element ;
Position Next ;
}
struct Node CursorSpace[Spacesize] ;
游标法中的malloc和free函数
Position CursorAlloc(void)
{
Position P ;
P = CursorSpace[0].Next ;
CursorSpace[0].Next = CursorSpace[P].Next ;
return P ;
}
void CursorFree(Position P)
{
CursorSpace[P].Next = CursorSpace[0].Next ;
CursorSpace[0].Next = P ;
}
初始化
void InitializeCursorSpace(Void)
{
int i ;
for(i = 0;i < SpaceSize; i++)
{
CursorSpace[i].Next = i + 1;
}
CursorSpace[i] = 0 ;
}
判断链表是否为空和是否为末尾
int IsEmpty(List L) //L为表头,CursorSpace数组为全局变量
{
return CursorSpace[L].Next == 0 ;
}
int IsLast(Position P)
{
return CursorSpace[P].Next == 0;
}
Find函数 //游标实现
Position Find(Element X,List L)
{
Position P ;
P = CursorSpace[L].Next ;
while(P && CursorSpace[P] != X)
P = CursorSpace[P].Next ;
return P ;
}
Delete函数 //游标实现
void Delete(ElementType X, List L)
{
Position P, TmpCell ;
P = FindPrevious(X,L) ;
if(!IsLast(P))
{
TmpCell = CursorSpace[P].Next ;
CursorSpace[P].Next = CursorSpace[TmpCell].Next ;
CursorFree(TmpCell) ;
}
}
Insert函数 //游标实现
void Insert(Element X, List L, Position P)
{
Position TmpCell ;
TmpCell = CursorAlloc() ;
if(TmpCell == 0)
{
printf("链表数组空间不足") ;
}
CursorCell[TmpCell].Element = X ;
CursorCell[TmpCell].Next = CursorSpace[P].Next ;
CursorSpace[P].Next = TmpCell ;
}
总结
- 表就是一种顺序结构
- 支持查找删除插入等操作
- 主要有两种常见的实现方法
- 指针法
- 游标法
- 有最基本的链表,还有双链表,循环链表,十字链表。比较特殊的有栈和队列。(下一篇)
- 应用:
- 多项式计算 //链表
- 学生选课系统 //十字链表
基础的表ADT -数据结构(C语言实现)的更多相关文章
- 三元组ADT (数据结构C语言版) C++实现
很久没用C语言,都忘了C语言中没有引用参数,下面的代码中用到了C语言没有的引用参数. 首先是一些表示状态的全局变量 common.h #define TRUE 1 #define FALSE 0 #d ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- ①泡茶看数据结构-表ADT
前言 小朽,晚上回到寝室.烧了开水,又泡了一杯下午喝了的小毛尖.耳机听着萨克斯,总结下今天学的数据结构和算法中的表ADT. 表ADT节点: #单链表 #双链表 #循环链表 ...
- 数据结构基础(1)--数组C语言实现--动态内存分配
数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数 ...
- 数据结构:DHU顺序表ADT模板设计及简单应用:找匹配
顺序表ADT模板设计及简单应用:找匹配 时间限制: 1S类别: DS:线性表->线性表应用 问题描述: 输入范例: 100000100000 99999 99998 99997 99996 99 ...
- c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载
百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...
- Python语言数据结构和语言结构(2)
目录 1. Python预备基础 2. Python数据类型 3. Python条件语句 4. while循环和for循环 1. Python预备基础 1.1 变量的命名 变量命名规则主要有以下几 ...
- 数据结构C语言版 有向图的十字链表存储表示和实现
/*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...
- 数据结构(C语言)—排序
数据结构(C语言)—排序 排序 排序是按关键字的非递增或递减顺序对一组记录中心进行排序的操作.(将一组杂乱无章的数据按一定规律顺次排列起来.) 未定列表与不稳定列表 假设 Ki = Kj ( 1 ≤ ...
随机推荐
- NopCommerce 3.4中商品详情页面单选框、复选框的美化
先上图给大家看看效果,点这里打开网站(后期可能会找不到这个商品,现在再测试阶段) 现在你能看到的这个页面中,尺寸.文本描述是单选框(属性是我乱写的名字),上门安装是复选框.效果就看到这里,请君跳过图片 ...
- “->”和“.”运算符
1.指向结构变量的指针. 2.定义:struct stu *pstu, 赋值是把结构变量的首地址赋给指针,不能把结构名给该指针:如, pstu = &boy; 3. 访问结构变量的成员 (*结 ...
- 增加oracle表空间
查找用户对应的表空间 1.查询表空间物理文件路径select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_ ...
- Jquery中on绑定事件 点击一次 执行多次 的解决办法
举个例子,在同一个页面有下拉选择框 <select class="mySelect"> <option value="user">按用户 ...
- dva框架使用详解及Demo教程
dva框架的使用详解及Demo教程 在前段时间,我们也学习讲解过Redux框架的基本使用,但是有很多同学在交流群里给我的反馈信息说,redux框架理解上有难度,看了之后还是一脸懵逼不知道如何下手,很多 ...
- 【读书笔记】The Swift Programming Language (Swift 4.0.3)
素材:Language Guide 初次接触 Swift,建议先看下 A Swift Tour,否则思维转换会很费力,容易卡死或钻牛角尖. 同样是每一章只总结3个自己认为最重要的点.这样挺好!强迫你去 ...
- 【HDOJ 1285】确定比赛名次(拓扑排序+优先队列)
Problem Description有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员 ...
- Robots协议(摘)
robots协议 Robots协议(也称为爬虫协议.机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓 ...
- collections.Counter类统计列表元素出现次数
# 使用collections.Counter类统计列表元素出现次数 from collections import Counter names = ["Stanley", &qu ...
- Linux的基础命令大全
linux的基础命令大全 1.shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口(命令解释器) ls -al /bin/sh ls -al /bin/bash 查看这些shell的 ...