数据结构入门第二课(浙大mooc)
数据结构入门第二课
引子 多项式的表示
方法1 顺序结构表示多项式各项
数组各分量对应多项式各项
问题:可能造成空间浪费
方法2 顺序结构表示非零项
将一个多项式看成系数和指数的二元组合,用结构数组表示:数组分量是由指数系数组成的结构,对应一个非零项。
要点:按指数大小有序存储
方法3 链表结构存储非零项
链表中每个结点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指针域。
typeof struct PolyNode* Polynomial;
struct PolyNode{
int coef;
int expon;
Polynomial link;
}
多项式问题的启示
同一个问题可以有不同的表示(存储)方法;
有一类共性问题:有序线性序列的组织和管理;
线性表
线性表:由同类型数据元素构成有序序列的线性结构
表中元素个数称为线性表的长度;
线性表中没有元素时,称为空表;
表起始位置称为表头,表结束位置称为表尾;
线性表的抽象数据类型描述

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

主要操作的实现
初始化(建立空的顺序表)
/* 初始化 */
List MakeEmpty()
{
List L; PtrL = (List)malloc(sizeof(struct LNode));
L->Last = -1; return PtrL;
}
查找
/* 查找 */
#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; /* 找到后返回的是存储位置 */
}
插入(第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;
}
删除(第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;
主要操作的实现
求表长
int length(List PtrL){
List p=PtrL;//指向表的第一个结点
int j=0;
while(p){
p=p->Next;
j++;
}
return j;
}
查找
按序号查找(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;
}
插入

/* 带头结点的插入 */
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;
}
}
删除

/* 不带头结点的删除,第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)的更多相关文章
- Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装
Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装 你们可以直接去,http://blog.csdn.net/wei_chong_chong/ar ...
- Kotlin入门第二课:集合操作
测试项目Github地址: KotlinForJava 前文传送: Kotlin入门第一课:从对比Java开始 初次尝试用Kotlin实现Android项目 1. 介绍 作为Kotlin入门的第二课, ...
- Spring入门第二课
看代码 package logan.spring.study; public class HelloWorld { private String name; public void setName2( ...
- DOM方法入门 - 第二课
1.console.log()是吧元素显示在控制台2.appendChild() 就是将元素追加到末尾3.innerHTML获取的是元素里面的所有内容包括里面的子元素4.innerText获取的是元素 ...
- Spring入门第二课:Spring配置Bean的细节
1.配置bean的作用域: 通过配置scope属性可以bean的作用域,参数有 prototype.request.session.singleton. 1)singleton为单例,IoC容器只会创 ...
- Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD
原文:Elasticsearch7.X 入门学习第二课笔记----基本api操作和CRUD 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链 ...
- CI(CodeIgniter)框架入门教程——第二课 初始MVC
本文转载自:http://www.softeng.cn/?p=53 今天的主要内容是,使用CodeIgniter框架完整的MVC内容来做一个简单的计算器,通过这个计算器,让大家能够体会到我在第一节课中 ...
- 【JavaScript从入门到精通】第二课 初探JavaScript魅力-02
第二课 初探JavaScript魅力-02 变量 说起变量,我们不得不提起我们有一部比较古老的电视剧叫<包青天>.包青天有一把非常厉害的宝剑叫“尚方宝剑”,见到尚方宝剑有如见到皇帝.某种程 ...
- 【JavaScript从入门到精通】第二课
第二课 初探JavaScript魅力-02 变量 说起变量,我们不得不提起我们有一部比较古老的电视剧叫<包青天>.包青天有一把非常厉害的宝剑叫“尚方宝剑”,见到尚方宝剑有如见到皇帝.某种程 ...
随机推荐
- 关于dll劫持我的奇思妙想(一)
0x00 前言 前段时间在研究着windows底层的一些东西,发现这个dll劫持一直没有做过,根据倾旋师傅的视频和文章做了一系列的研究,然后就突发来了兴致研究一些dll劫持提权. 0x01 了解 ...
- Android学习----自定义Adapter实现ListView
前言: 对于ListView而言,自定义的Adapter对于显示复杂的界面有很大的灵活性 .使用自定义的Adapter需要继承BaseAdapter,然后重写getCount(),getView(), ...
- list容器排除重复单词的程序
#include<iostream> #include<fstream> #include<string> #include<algorithm> #i ...
- Modbus协议和应用开发介绍
因业务需要了解Modbus协议的使用,因此对Modbus的协议,以及相应的C#处理应用进行了解,针对协议的几种方式(RTU.ASCII.TCPIP)进行了封装,以及对Modbus的各种功能码的特点进行 ...
- Java 配 Shell 等于美酒加咖啡
化学中我们得知「氢气加氧气在点燃的情况下会生成水」. 生活中我们得知「良辰加美景的情况下会得到千金春宵一刻」. 技术上又何尝不是如此呢?先假设一个场景:BOSS 让你实现一个服务监控的指挥室,能看到每 ...
- 关于C#三层架构中的“分页”功能
新手上路,请多指教! 今天将分页功能实现了,要特别感谢坐在前面的何同学的指点,不胜感谢!功能的实现采用了三层架构的方式实现该功能,简述如下: 界面: DAL层有两个方法:“当前所在页”和“总页数” 这 ...
- WeixinJSBridge API使用实例
<span style="color: rgb(51, 51, 51); font-family: tahoma, arial, 宋体; font-size: 14px; line-h ...
- 关于selenium定位元素时,出现此问题的处理办法:find_element=wait.until(ec.presence_of_element_locatetd(locator))定位不到页面元素的问题
最近再用,selenium中的from selenium.webdriver.common.by import By方法时,一直报错如下(图一),各种百度都没有解决,最后只能脱离框架,从最原始的代码开 ...
- 28.1 api-- Object(toString equals)
/* * String toString() : 返回该对象的字符串表示 * return getClass().getName() + "@" + Integer.toHexSt ...
- Struts2-学习笔记系列(7)-PreResultListener
在action处理完成之后,系统转入实际的物理试图之间被回调. Action,拦截器都可以添加该监听器.拦截器添加了该监听器后,该监听器会对该拦截器所有拦截的action其作用 public Stri ...