声明:此一系列博客为阅读《数据结构与算法分析--C语言描述》(Mark Allen Weiss)笔记,部分内容参考自网络;转载请注明出处。

1、表

  表是最简单的数据结构,是形如A1、A2、A3、A4、...、AN的表,表的大小为N。大小为0的表为空表。

2、表的简单数组实现

  对表的所有操作都可以通过使用数组来实现。但是数组实现的表有两个缺点:(1)需要对表大小的最大值进行估计,通常需要估计的大一些,因此会浪费大量的空间;(2)、插入和删除操作是昂贵的。这个是显而易见的,当插入Ai时,i到N的所有元素都需要往后移动一个位置以空出空间来存放Ai,因此这两种操作最坏的情况为O(N)。所以,简单数组一般不用来实现表。

3、链表

  链表由一系列不必在内存中连续的结构组成,每一个结构均含有表元素和指向本元素后继元的结构的指针,称之为Next指针。这样,就可以允许表可以不连续存储,从而避免了插入和删除的线性开销。表的示意图如下:

删除命令可以通过修改一个指针来实现,比如上图,要删除A2,只需要修改A1指向A2的指针,将其直接指向A3即可;插入命令需要使用一次malloc操作得到一个新的结构。比如要在A2和A3之间插入一个新结构X,则先申请X的内存,让A2的Next指针指向X,X的Next指针指向A3即可。以下为具体的程序实现细节。在程序实现时,有别于上图的是,有一个表头,它没有具体的数据,只有一个指针,指向第一个数据单元。

首先,在.h文件中给出需要的声明

  1. #ifndef _LIST_H
  2. #define _LIST_H
  3.  
  4. struct Node;
  5. typedef struct Node *PtrToNode;
  6. typedef PtrToNode List;
  7. typedef PtrToNode Position;
  8.  
  9. List MakeEmpty(List L);
  10. int IsEmpty(List L);
  11. int IsLast(List L);
  12. Position Find(ElementType X, List L);
  13. void Delete(ElementType X, List L);
  14. Position FindPrevious(ElementType X, List L);
  15. void Insert(ElementType X, List L, Position P);
  16. void DeleteList(List L);
  17.  
  18. #endif

各个函数的作用由其命名即可清晰的看出。

下面是各个函数的实现,都比较简单

  1. /* 首先是具体的Node节点的定义*/
    struct Node
    {
      ElementType Element;
      Position Next;
    };
  2.  
  3. /* Return true if L is empty */
  4.  
  5. int IsEmpty(List L)
  6. {
  7. return (L->Next == NULL);
  8. }
  9.  
  10. /* Return True if p is last position in list L*/
    /* Parameter L is unused in this implemention*/
    /* 参数L在这个实现中并没有使用,写在这里,作者的意图应该是易于以后的扩展*/
    int IsLast(Position P, List L)
    {
      return (P->Next == NULL);
    }

Find 函数返回元素X所在的Node的指针;FindPrevious 返回X的前驱元的指针

  1. /* Return postion of X in L; NULL if not found*/
  2. Position Find(ElementType X, List L)
  3. {
  4. Position P;
  5.  
  6. P = L->Next;
  7. while(P != NULL && P->Element != X)
  8. {
  9. P = P->Next;
  10. }
  11.  
  12. return P;
  13. }
  14.  
  15. /* NULL if not found */
    Position FindPrevious(ElementType X, List L)
    {
      Position P;
  16.  
  17.   P = L;
    while(P->Next != NULL && P->Next->Element != X)
    P = P->Next;
  18.  
  19. if(P->Next == NULL)
    return NULL;
  20.  
  21.   return P;
    }

Delete 函数删除表中的元素X,这里规定,例程删除第一次出现的X,如果X不再表中,就什么都不做。

  1. /*Delete first occurrence of X from a list */
  2.  
  3. void Delete(ElementType X, List L)
  4. {
  5. Position P, TmpCell;
  6.  
  7. P = FindPrevious(X, L);
  8. if(P != NULL)
  9. {
  10. TmpCell = P->Next;
  11. P ->Next = TmpCell->Next;
  12. Free(TmpCell);
  13. }
  14.  
  15. }

Insert函数实现将X插入链表中。书中的实现方法传入了一个位置,供X插入。在这里,我将X插入到表中第一个元素位置,即表头后的一个位置

  1. /* Insert X into List*/
  2.  
  3. void Insert(ElementType X, List L)
  4. {
  5. Position TmpCell;
  6.  
  7. TmpCell = malloc(sizeof(Struct Node));
  8. if(TmpCell == NULL)
  9. return;
  10.  
  11. TmpCell->Element = X;
  12. TmpCell->Next = L->Next;
  13. L->Next = TmpCell;
  14. }

DeleteList 函数删除链表

  1. /*这个程序不同于书中的程序,此处删除了表头;书中的程序保留了表头*/
  2.  
  3. void DeleteList(List L)
  4. {
  5. Position P;
  6.  
  7. while(L != NULL)
  8. {
  9. P = L;
  10. L = L->Next;
  11. free(P);
  12. }
  13. }

4、双链表/循环列表

  双链表的实现非常简单,即在结构体中添加一个指针域,指向该单元的前一个单元即可。它可以非常简单的实现表的倒序扫描。同时,它简化了删除操作,因为你不在需要获得前驱单元的指针,这个信息是现成的。

  循环列表让最后的单元反过来指向的一个单元,可以有表头,也可以没有表头。

数据结构与算法C语言实现笔记(1)--表的更多相关文章

  1. 数据结构与算法C++描述学习笔记1、辗转相除——欧几里得算法

    前面学了一个星期的C++,以前阅读C++代码有些困难,现在好一些了.做了一些NOI的题目,这也是一个长期的目标中的一环.做到动态规划的相关题目时发现很多问题思考不通透,所以开始系统学习.学习的第一本是 ...

  2. 数据结构1:数据结构与算法C语言版分析概述

    本节开始将带领大家系统地学习数据结构,作为一门计算机专业大二学生的必修课程,该课程面对的目标人群为初步具备基本编程能力和编程思想的程序员(大一接触了 C 语言或者 C++).通过系统地学习数据结构,可 ...

  3. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  4. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  5. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  6. 【数据结构与算法Python版学习笔记】树——二叉树的应用:解析树

    解析树(语法树) 将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理 语法分析树 程序设计语言的编译 词法.语法检查 从语法树生成目标代码 自然语言处理 机器翻译 语义理 ...

  7. 数据结构与算法之美学习笔记:B+树(第48讲)

    一.解决问题的前提是定义清楚问题 通过对一些模糊需求进行假设,来限定要解决问题的范围 根据某个值查找数据,比如 select * from use where id=1234: 根据区间值来查询某些数 ...

  8. 《数据结构与算法(C语言版)》严蔚敏 | 第五章 建立二叉树,并完成三/四种遍历算法

    PS:所有的代码示例使用的都是这个图 2019-10-29 利用p126的算法5.3建立二叉树,并完成三种遍历算法 中序 后序 先序 #include<iostream> #include ...

  9. 【数据结构与算法Python版学习笔记】算法分析

    什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...

随机推荐

  1. C语言register关键字—最快的关键字

        register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率.注意是尽可能,不是绝对.你想想,一个CPU 的寄存器也就那么几个或几十个,你要是 ...

  2. Spring(AbstractRoutingDataSource)实现动态数据源切换--转载

    原始出处:http://linhongyu.blog.51cto.com/6373370/1615895 一.前言 近期一项目A需实现数据同步到另一项目B数据库中,在不改变B项目的情况下,只好选择项目 ...

  3. 关于C++需要加强学习的几点内容

    1.C++ effective指导原则 2.C++标准库 3.数据结构算法 4.C++设计模式 5.shell脚本 6.python

  4. WebService地址变成计算机名的解决办法

    WCF 4.0 has solved this issue in some instances with a new config option that use Request Headers: & ...

  5. appscan 安全漏洞修复办法

    appscan 安全漏洞修复办法http://www.automationqa.com/forum.php?mod=viewthread&tid=3661&fromuid=21

  6. Linux学习之路:shell变量(二)环境变量

    1.env (environment 的缩写)和export显示所有环境变量 2. 环境变量说明 环境变量 意义 HOME 用户主文件夹相当于“~” SHELL Linux默认为/bin/bash H ...

  7. js父窗口opener与parent

    parent表示父窗口,比如一个A页面利用iframe或frame调用B页面,那么A页面所在窗口就是B页面的parent.在JS 中,window.opener只是对弹出窗口的母窗口的一个引用.比如: ...

  8. ajax发送请求

    首先创建XMLHttpRequest对象,利用此对象发送请求 主页面 <!doctype html> <html lang="en"> <head&g ...

  9. .NET通过调用Office组件导出Word文档

    .NET通过调用Office组件导出Word文档 最近做项目需要实现一个客户端下载word表格的功能,该功能是用户点击"下载表格",服务端将该用户的数据查询出来并生成数据到Word ...

  10. jsp(一) : servlet基础

    1.客户  servlet容器   servlet 2.实现接口     #1.接口:servlet :             constrontor .init().service.destroy ...