数据结构入门第二课

引子 多项式的表示

方法1 顺序结构表示多项式各项

数组各分量对应多项式各项

问题:可能造成空间浪费

方法2 顺序结构表示非零项

将一个多项式看成系数和指数的二元组合,用结构数组表示:数组分量是由指数系数组成的结构,对应一个非零项。

要点:按指数大小有序存储

方法3 链表结构存储非零项

链表中每个结点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指针域。

typeof struct PolyNode* Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
}

多项式问题的启示

同一个问题可以有不同的表示(存储)方法;

有一类共性问题:有序线性序列的组织和管理;

线性表

线性表:由同类型数据元素构成有序序列的线性结构

​ 表中元素个数称为线性表的长度;

​ 线性表中没有元素时,称为空表;

​ 表起始位置称为表头,表结束位置称为表尾;

线性表的抽象数据类型描述

线性表的顺序存储实现

利用数组的连续存储空间顺序存放线性表的各元素

主要操作的实现

  1. 初始化(建立空的顺序表)
    /* 初始化 */
    List MakeEmpty()
    {
    List L; PtrL = (List)malloc(sizeof(struct LNode));
    L->Last = -1; return PtrL;
    }
  2. 查找
    /* 查找 */
    #define ERROR -1 Position Find( List L, ElementType X )
    {
    int i = 0; while( i <= L->Last && L->Data[i]!= X )
    i++;
    if ( i > L->Last ) return ERROR; /* 如果没找到,返回错误信息 */
    else return i; /* 找到后返回的是存储位置 */
    }
  3. 插入(第i个位置)
    /* 插入 */
    bool Insert( List L, ElementType X, int P )
    { /* 在L的指定位置P前插入一个新元素X */
    int i; if ( L->Last == MAXSIZE-1) {
    /* 表空间已满,不能插入 */
    printf("表满");
    return false;
    }
    if ( P<0 || P>L->Last+1 ) { /* 检查插入位置的合法性 */
    printf("位置不合法");
    return false;
    }
    for( i=L->Last; i>=P; i-- )
    L->Data[i+1] = L->Data[i]; /* 将位置P及以后的元素顺序向后移动 */
    L->Data[P] = X; /* 新元素插入 */
    L->Last++; /* Last仍指向最后元素 */
    return true;
    }
  4. 删除(第i个位置)
    /* 删除 */
    bool Delete( List L, int P )
    { /* 从L中删除指定位置P的元素 */
    int i; if( P<0 || P>L->Last ) { /* 检查空表及删除位置的合法性 */
    printf("位置%d不存在元素", P );
    return false;
    }
    for( i=P+1; i<=L->Last; i++ )
    L->Data[i-1] = L->Data[i]; /* 将位置P+1及以后的元素顺序向前移动 */
    L->Last--; /* Last仍指向最后元素 */
    return true;
    }

线性表的链式存储实现

不要求逻辑上相邻的两个元素物理上也相邻;通过链建立起数据元素之间的逻辑关系。

插入输出不需要移动数据元素,只需要修改链。

typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;

主要操作的实现

  1. 求表长
int length(List PtrL){
List p=PtrL;//指向表的第一个结点
int j=0;
while(p){
p=p->Next;
j++;
}
return j;
}
  1. 查找
    • 按序号查找(FindKth)
      List FindKth(List L, int K)
      {
      List p = PtrL; /* p指向L的第1个结点 */
      while ( p!=Null && i<K ){
      p = p->Next;
      i++;
      }
      if(i==K)return P;
      else
      return NULL;
      }
    • 按值查找
      Position Find( List L, ElementType X )
      {
      Position p = L; /* p指向L的第1个结点 */ while ( p && p->Data!=X )
      p = p->Next; /* 下列语句可以用 return p; 替换 */
      if ( p )
      return p;
      else
      return ERROR;
      }
  2. 插入

/* 带头结点的插入 */
bool Insert( List L, ElementType X, Position P )
{ /* 这里默认L有头结点 */
Position tmp, pre; /* 查找P的前一个结点(可用p=Find(Ptrl,x);代替 */
for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;
if ( pre==NULL ) { /* P所指的结点不在L中 */
printf("插入位置参数错误\n");
return false;
}
else { /* 找到了P的前一个结点pre */
/* 在P前插入新结点 */
tmp = (Position)malloc(sizeof(struct LNode)); /* 申请、填装结点 */
tmp->Data = X;
tmp->Next = P;
pre->Next = tmp;
return true;
}
}
  1. 删除

/* 不带头结点的删除,第i位置*/
List Delete( List L, int i )
{ /* 这里默认L有头结点 */
List p,s;
if (i==1){//删除头结点的情况
S=PtrL;
if(PtrL!=NULL)PtrL=PtrL->Next;
else
return NULL;
free(s);
return PtrL;
}
p=FindKth(i-1,PtrL);/*查找i-1个结点*/
if(p==NULL){
printf("the %d node is not exist",i-1);
return NULL;
}else if(p->Next==NULL){
printf("the %d node is not exist",i-1);
return NULL;
}else{
s=p->Next;
p->Next=s->Next;
free(s);
return PtrL;
}
}

广义表


多重链表




数据结构入门第二课(浙大mooc)的更多相关文章

  1. Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装

    Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装 你们可以直接去,http://blog.csdn.net/wei_chong_chong/ar ...

  2. Kotlin入门第二课:集合操作

    测试项目Github地址: KotlinForJava 前文传送: Kotlin入门第一课:从对比Java开始 初次尝试用Kotlin实现Android项目 1. 介绍 作为Kotlin入门的第二课, ...

  3. Spring入门第二课

    看代码 package logan.spring.study; public class HelloWorld { private String name; public void setName2( ...

  4. DOM方法入门 - 第二课

    1.console.log()是吧元素显示在控制台2.appendChild() 就是将元素追加到末尾3.innerHTML获取的是元素里面的所有内容包括里面的子元素4.innerText获取的是元素 ...

  5. Spring入门第二课:Spring配置Bean的细节

    1.配置bean的作用域: 通过配置scope属性可以bean的作用域,参数有 prototype.request.session.singleton. 1)singleton为单例,IoC容器只会创 ...

  6. Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD

    原文:Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链 ...

  7. CI(CodeIgniter)框架入门教程——第二课 初始MVC

    本文转载自:http://www.softeng.cn/?p=53 今天的主要内容是,使用CodeIgniter框架完整的MVC内容来做一个简单的计算器,通过这个计算器,让大家能够体会到我在第一节课中 ...

  8. 【JavaScript从入门到精通】第二课 初探JavaScript魅力-02

    第二课 初探JavaScript魅力-02 变量 说起变量,我们不得不提起我们有一部比较古老的电视剧叫<包青天>.包青天有一把非常厉害的宝剑叫“尚方宝剑”,见到尚方宝剑有如见到皇帝.某种程 ...

  9. 【JavaScript从入门到精通】第二课

    第二课 初探JavaScript魅力-02 变量 说起变量,我们不得不提起我们有一部比较古老的电视剧叫<包青天>.包青天有一把非常厉害的宝剑叫“尚方宝剑”,见到尚方宝剑有如见到皇帝.某种程 ...

随机推荐

  1. JQuery主要内容

    一.什么是JQuery jquery全称javaScript Query,是js的一个框架,本质上仍然是js 二.jQuery的特点 支持各种主流浏览器 使用特别简单 拥有丰富的插件和边界的插件扩展机 ...

  2. 听说你还搞不定java中的==和equals?

    相信很多读者关于==和equals懂了又懵,懵了又懂,如此循环,事实上可能是因为看到的博客文章之类的太多了,长篇大论,加上一段时间的洗礼之后就迷路了.本篇文章再一次理清楚.当然如果觉得本文太啰嗦的话, ...

  3. 使用xlsxwriter模块和xlrd模块操作Excel表格

    1.xlsxwriter模块介绍:主要用来生成excel表格,插入数据.插入图标等表格操作 如下代码:目的是往demo01.xlsx插入数据和图片 # 导入xlsxwriter模块:主要用来修改表格的 ...

  4. Three中的动画实现-[three.js]

    Table Of Content 动画原理 js中动画实现原理setInterval js中动画实现新方法requestAnimationFrame 一个示例 动画原理 动画的本质实际上就是快速地不断 ...

  5. SQL Server 存储过程分页。

     create proc proc_Product@page int, -- 页数@row int --  一页有几行Asdeclare @newpage int  set @newpage = (@ ...

  6. Linux基础:Day03

    Linux的网络 以太网的发明--PC之间文件共享情况出现 网卡硬件设备 -- MAC地址  一层:物理层 HUB -- 集线器 总线型结构 泛洪  广播域/冲突域  二层: 在早期的网络中,PC互通 ...

  7. ThinkPHP3.1.2 使用cli命令行模式运行

    ThinkPHP3.1.2 使用cli命令行模式运行 标签(空格分隔): php 前言 thinkphp3.1.2 需要使用cli方法运行脚本 折腾了一天才搞定 3.1.2的版本真的很古老 解决 增加 ...

  8. javascript入门 之 ztree(二 标准json数据)

    1.代码 <!DOCTYPE html> <HTML> <HEAD> <TITLE> ZTREE DEMO - Standard Data </T ...

  9. 36 Thread 多线程

    /* * 多线程的实现方式: * 方式1:一种方法是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例 * * Thread * Str ...

  10. hive常用函数六

    cast 函数: 类型转换函数,cast(kbcount as int); case when: 条件判断,case when kbcount is not null and cast(kbcount ...