读数据结构与算法分析

表的概述

  • 形如A1,A2,A3...
  • 操作合集
  1. PrintList
  2. MakeEmpty
  3. Find
  4. Insert
  5. 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)实现法

设计思路

  1. 全局结构体数组模拟指针法,对于数组的任何单元,其数组下标来代表一个地址
  2. 使用一个数组来模拟malloc和free
  3. 数组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 ;
}

总结

  • 表就是一种顺序结构
  • 支持查找删除插入等操作
  • 主要有两种常见的实现方法
  1. 指针法
  2. 游标法
  • 有最基本的链表,还有双链表,循环链表,十字链表。比较特殊的有栈和队列。(下一篇)
  • 应用:
  1. 多项式计算 //链表
  2. 学生选课系统 //十字链表

基础的表ADT -数据结构(C语言实现)的更多相关文章

  1. 三元组ADT (数据结构C语言版) C++实现

    很久没用C语言,都忘了C语言中没有引用参数,下面的代码中用到了C语言没有的引用参数. 首先是一些表示状态的全局变量 common.h #define TRUE 1 #define FALSE 0 #d ...

  2. 数据结构C语言版 表插入排序 静态表

    数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./*  数据结构C语言版 表插入排序  算法10.3 P267-P270  编译 ...

  3. ①泡茶看数据结构-表ADT

    前言     小朽,晚上回到寝室.烧了开水,又泡了一杯下午喝了的小毛尖.耳机听着萨克斯,总结下今天学的数据结构和算法中的表ADT.       表ADT节点: #单链表   #双链表   #循环链表 ...

  4. 数据结构基础(1)--数组C语言实现--动态内存分配

    数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数 ...

  5. 数据结构:DHU顺序表ADT模板设计及简单应用:找匹配

    顺序表ADT模板设计及简单应用:找匹配 时间限制: 1S类别: DS:线性表->线性表应用 问题描述: 输入范例: 100000100000 99999 99998 99997 99996 99 ...

  6. c++学习书籍推荐《清华大学计算机系列教材:数据结构(C++语言版)(第3版)》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <清华大学计算机系列教材:数据结构(C++语言版)(第3版)>习题解析涵盖验证型.拓展型.反思型.实践型和研究型习题,总计290余道大题.525道 ...

  7. Python语言数据结构和语言结构(2)

    目录 1. Python预备基础 2. Python数据类型 3. Python条件语句 4. while循环和for循环 1. Python预备基础 1.1 变量的命名   变量命名规则主要有以下几 ...

  8. 数据结构C语言版 有向图的十字链表存储表示和实现

    /*1wangxiaobo@163.com 数据结构C语言版 有向图的十字链表存储表示和实现 P165 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h> ...

  9. 数据结构(C语言)—排序

    数据结构(C语言)—排序 排序 排序是按关键字的非递增或递减顺序对一组记录中心进行排序的操作.(将一组杂乱无章的数据按一定规律顺次排列起来.) 未定列表与不稳定列表 假设 Ki = Kj ( 1 ≤ ...

随机推荐

  1. Office365学习笔记—列表查询,删除条目,更新条目。

    1,基于Query语句的列表查询. function retrieveListItems(itemId) { var siteUrl=_spPageContextInfo.webServerRelat ...

  2. Knowledge Point 20180303 详解main函数

    学习Java的朋友想来都是从HelloWorld学起的,那么想来都对main函数不陌生了,但是main函数究竟是怎么回事呢?main函数中的参数是做什么的呢?main函数为什么能作为程序的入口呢?可不 ...

  3. java中匿名内部类总结

    在java的世界里,提供了匿名内部类语法糖,用于帮助大家简化代码,本文简要从接口,抽象类以及常规类以代码的形式描述其常用模式. 1. 接口模式 public interface IWriter { v ...

  4. 【HDOJ 1337】I Hate It(线段树维护区间最大值)

    Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写 ...

  5. 一个hibernate中的异常:NonUniqueDiscoveredSqlAliasException

    在hibernate中用SQL查询返回的结果集中,列名或别名必须唯一,否则会报下面的错误.返回的结果集中,列名或别名可以没有,但只能有一列没有. //空别名重复的情况:org.hibernate.lo ...

  6. WSO2 API Manager中host Ip 不正确的问题解决方法

    问题: 根据官方的Quick start的教程,部署完AM后,添加的API的host Ip不正确,为localhost或者服务器上的其他虚拟ip. 安装版本:       WSO2AM 2.6.0 环 ...

  7. python三大神器之装饰器

    装饰器的形成过程 假如你要写一个计算函数执行时间的函数,代码如下: import time def func1(): print('in func1') def timer(func): def in ...

  8. PAT (Basic Level) Practice 1008 数组元素循环右移问题

    个人练习 一个数组A中存有N(>)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N ...

  9. PTA基础编程题目集7-1厘米换算英尺英寸

    如果已知英制长度的英尺foot和英寸inch的值,那么对应的米是(foot+inch/12)×0.3048.现在,如果用户输入的是厘米数,那么对应英制长度的英尺和英寸是多少呢?别忘了1英尺等于12英寸 ...

  10. SpringBoot 解决ModelAndView强转Json问题

    最近一直在做SpringBoot升级的项目,碰到了一个很蛋疼的问题. 我们项目和前端的AngularJs通过Json来传递信息,但是我们有一块的代码在Controller返回的是ModelAndVIe ...