数据结构入门第二课

引子 多项式的表示

方法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. 使用 Visual Studio 开发、测试和部署 Azure Functions(二)测试,部署

    1,引言 上一篇介绍了使用使用 Visual Studio 开发 "Azure Functions" 函数,此篇介绍 “Azure Functions” 的测试以及直接从 Vist ...

  2. 【WPF学习】第六十五章 创建无外观控件

    用户控件的目标是提供增补控件模板的设计表面,提供一种定义控件的快速方法,代价是失去了将来的灵活性.如果喜欢用户控件的功能,但需要修改使其可视化外观,使用这种方法就有问题了.例如,设想希望使用相同的颜色 ...

  3. Docker常用yml

    GitLib version: '3.1' services: web: image: 'twang2218/gitlab-ce-zh:11.0.5' restart: always hostname ...

  4. Java基础知识3-类和对象(1)

    面向过程和面向对象的区别 面向过程(结构化程序设计) 实际上是一个面向操作过程,首先设计一系列过程(算法)来求解问题(操作数据),然后再考虑存储数据的方式(组织数据).即程序=算法\+数据结构.对应典 ...

  5. 跟面试官侃半小时MySQL事务,说完原子性、一致性、持久性的实现

    提到MySQL的事务,我相信对MySQL有了解的同学都能聊上几句,无论是面试求职,还是日常开发,MySQL的事务都跟我们息息相关. 而事务的ACID(即原子性Atomicity.一致性Consiste ...

  6. JavaScript form表单提交与验证

    原网址:https://blog.csdn.net/vipwxs/article/details/79119701 一.form对象的属性: name:获取表单的名称,该name一般给JS使用 met ...

  7. 虚拟机的vmnet8网卡找不到了

    不知道我设置了什么,在我于Linux中配置网络时发现怎么都不行,检查了一下发现用于NAT的网卡没有了. 我重启了电脑之后发现还是没有. 于是按照网上的办法在虚拟网络编辑器将其重置,如下图. 问题解决. ...

  8. go 反射包

    一.什么是反射? 反射是用程序检查其所拥有的结构,尤其是类型的一种能力: 二.Printf Printf 的函数声明为: func Printf(format string, args ... int ...

  9. Hadoop在Ubuntu的安装和使用

    由于小编在本学期有一门课程需要学习hadoop,需要在ubuntu的linux系统下搭建Hadoop环境,在这个过程中遇到一些问题,写下这篇博客来记录这个过程,并把分享给大家. Hadoop的安装方式 ...

  10. alg-链表中有环

    typedef struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }ListN ...