数据结构入门第二课

引子 多项式的表示

方法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. IDEA+EasyCode实现代码生成

    IDEA+EasyCode实现代码生成 Easy Code介绍 EasyCode是基于IntelliJ IDEA开发的代码生成插件,支持自定义任意模板(Java,html,js,xml).只要是与数据 ...

  2. MySQL从库实用技能(一)--巧用slave_exec_mode参数

    想必从库异常中断的情况不在少数,其中报错信息中1032及1062的错误占了不少的比重 错误1032指的是从库中找不到对应行的记录 错误1062指的是主键冲突 遇到此报错时,大多DBA会使用如下方法进行 ...

  3. Java Object类学习总结

    这篇博文发出来总有点问题,转为图片了,谢谢看官支持.

  4. APScheduler轻量级定时任务框架

    目录 一.APScheduler简介 支持的后端存储作业 集成的Python框架 二.APScheduler下载安装 三.APScheduler组件 各组件简介 调度器 作业存储器 执行器 触发器 四 ...

  5. Iscsi技术

                                                                        Iscsi技术 1案例1:发布iSCSI网络磁盘 1.1问题 本 ...

  6. node.js代码

    // 1. 引入 express var express = require('express'); var formidable = require('formidable'); var mysql ...

  7. Centos 7 系统定时重启

    crontab -e         //系统命令 00 08 * * * root systemctl restart docker00 08 * * * root reboot //写入需要重启的 ...

  8. 白话说编程之java线程

    线程和进程: 在说多线程之前,我们先来研究一下线程,说到线程,我们又不得不说到进程,因为很多初学者会把线程和进程分不清,搞混淆. 进程: 是操作系统系统运行的最小单元.怎么理解这句话,可以这样去对比, ...

  9. Python 的while循环和for循环的使用

    #循环 遍历 迭代 # while循环 a = 0while a <5: a =a+1 if a == 3: continueprint('我循环了')+str(a) # print ('我循环 ...

  10. PHP获取当天、本周、本月、本季度、本年度时间

    function get_date($date, $t = 'd', $n = 0) { if ($t == 'd') { $firstday = date('Y-m-d 00:00:00', str ...