数据结构入门第二课

引子 多项式的表示

方法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. G - 土耳其冰淇凌 Gym - 101194D(二分答案 + 贪心检验)

    熊猫先生非常喜欢冰淇淋,尤其是冰淇淋塔.一个冰淇淋塔由K个冰淇淋球堆叠成一个塔.为了使塔稳定,下面的冰淇淋球至少要有它上面的两倍大.换句话说,如果冰淇淋球从上到下的尺寸是A0, A1, A2,···, ...

  2. Vertica的这些事(五)——-谈谈vertica的flex-table

    Json格式对于现在所有的软件开发者都不陌生,很多数据格式都用他来存储,我们来看一下vertica是怎么处理json数据的.这就是vertica的flex table! 首先创建一个json文件: { ...

  3. jmeter执行多条sql语句

    1.JDBC Connection Configuration 在配置DataBase URL的时候,加上allowMultiQueries=true 2.在JDBC Request中设置Quer T ...

  4. Socket探索1-两种Socket服务端实现

    介绍 一次简单的Socket探索之旅,分别对Socket服务端的两种方式进行了测试和解析. CommonSocket 代码实现 实现一个简单的Socket服务,基本功能就是接收消息然后加上结束消息时间 ...

  5. flask-url参数

    flask-url参数 无约束(string)传参 from flask import Flask app = Flask(__name__) @app.route('/<id>') de ...

  6. Linux网络架设篇,虚拟机l系统中网卡设备名与配置文件不符如何处理?

    很多情况下,当我们在虚拟机中安装好linux系统后,并不能成功连上网.当我们配置好相关IP地址后同样不能成功连接网络.并且会体会网卡名与配置名不符,这时候应该怎么办呢? 1.清空下面文件 /etc/u ...

  7. WEB应用环境的搭建(一)配置Tomcat步骤

    首先了解C/s架构 比如我们常见的QQ,魔兽世界等 这种结构的程序是有服务器来提供服务的,客户端来使用服务 而B/S架构是这样的 它不需要安装客户端,只需要浏览器就可以了 例如QQ农场,这样对客户端的 ...

  8. 反射----获取class对象的五种方法

    反射Reflection 配合注解使用会格外强大,反射注解,天生一对 类如何加载? 动态语言和静态语言.我知道是什么,不用总结了. 由于反射,Java可以称为准动态语言. 允许通过反射获得类的全部信息 ...

  9. 通过String的不变性案例分析Java变量的可变性

    阅读本文之前,请先看以下几个问题: 1.String变量是什么不变?final修饰变量时的不变性指的又是什么不变,是引用?还是内存地址?还是值? 2.java对象进行重赋值或者改变属性时在内存中是如何 ...

  10. 复习python的多态,类的内部权限调用 整理

    #多态的用法 class Dii: passclass Aii(Dii): def run(self): print('一号函数已调用')class Bii(Dii): def run(Dii): p ...