




已阅读5页,还剩20页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章 链表一、复习要点本章重点讨论最简单的链表结构单链表。详细地介绍了单链表的抽象数据类型,单链表的类定义,相应操作的实现,引入了带表头结点的单链表结构。进一步定义了用模板描述的单链表类。作为一种应用,讨论了一元多项式的类定义及其加法操作的实现。此外,讨论了循环链表和双向链表。在复习这一章时需要对C+ 语言中的指针和引用类型的使用有清楚的理解。对带表头结点的链表和不带表头结点的链表在插入、删除、搜索时的差别有清楚的认识。而且需要明确:链表是一种实现级的结构。本章复习的要点:1、基本知识点单链表是一种线性结构,链表各结点的物理存储可以是不连续的,因此各结点的逻辑次序与物理存放次序可以不一致。必须理解单链表的定义和特点,单链表的抽象数据类型和类定义,单链表成员函数,如构造函数、搜索、插入、删除等操作的实现,对比带表头结点单链表的搜索、插入、删除操作,比较其优缺点。其次是循环链表的定义和特点,它与单链表的差别,它的搜索、插入、删除操作的实现。最后是双向链表的定义,它的插入与删除操作的实现。2、算法设计 单链表的迭代求解算法,包括统计链表结点个数,在链表中寻找与给定值value匹配的结点,在链表中寻找第i个结点,在链表中第i个位置插入新结点,删去第i个结点,单链表各结点顺序逆转算法,在单链表中按从左到右和从右到左的顺序遍历的逆转链算法。 带表头结点的单链表的迭代算法,包括统计链表结点个数,在链表中寻找与给定值value匹配的结点,在链表中寻找第i个结点,在链表中第i个位置插入新结点,删去第i个结点,连续删除链表中含有value值的结点,两个有序链表的合并。 单链表的递归算法,包括统计链表结点个数,在链表中寻找与给定值value匹配的结点,在链表中寻找第i个结点,求链表各结点值的和,求链表各结点的值的平均值。 循环链表的迭代算法:包括统计链表结点个数,在链表中寻找与给定值value匹配的结点,在链表中寻找第i个结点,在链表中第i个位置插入新结点,删去第i个结点,将循环链表链入单链表的表头。 多项式的建立,两个多项式的相加,两个多项式的相减。 用单链表实现字符串操作,每个结点仅存一个字符。二、难点和重点1、单链表:单链表定义、相应操作的实现。单链表的两种定义方式(复合方式与嵌套方式) 单链表的搜索算法与插入、删除算法 单链表的递归与迭代算法2、循环链表:单链表与循环链表的异同3、双向链表:带表头结点的双向循环链表双向循环链表的定义,带表头结点的优点双向链表的搜索、插入与删除算法4、多项式:多项式的定义、多项式的表示及加法多项式.的三种表示多项式链接表示的优点多项式加法的实现(有序链表的合并算法)三、教材中习题的解析3-1线性表可用顺序表或链表存储。试问:(1) 两种存储表示各有哪些主要优缺点?(2) 如果有n个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用哪种存储表示?为什么?(3) 若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时,应采用哪种存储表示?为什么?【解答】(1) 顺序存储表示是将数据元素存放于一个连续的存储空间中,实现顺序存取或(按下标)直接存取。它的存储效率高,存取速度快。但它的空间大小一经定义,在程序整个运行期间不会发生改变,因此,不易扩充。同时,由于在插入或删除时,为保持原有次序,平均需要移动一半(或近一半)元素,修改效率不高。链接存储表示的存储空间一般在程序的运行过程中动态分配和释放,且只要存储器中还有空间,就不会产生存储溢出的问题。同时在插入和删除时不需要保持数据元素原来的物理顺序,只需要保持原来的逻辑顺序,因此不必移动数据,只需修改它们的链接指针,修改效率较高。但存取表中的数据元素时,只能循链顺序访问,因此存取效率不高。(2) 如果有n个表同时并存,并且在处理过程中各表的长度会动态发生变化,表的总数也可能自动改变、在此情况下,应选用链接存储表示。如果采用顺序存储表示,必须在一个连续的可用空间中为这n个表分配空间。初始时因不知道哪个表增长得快,必须平均分配空间。在程序运行过程中,有的表占用的空间增长得快,有的表占用的空间增长得慢;有的表很快就用完了分配给它的空间,有的表才用了少量的空间,在进行元素的插入时就必须成片地移动其他的表的空间,以空出位置进行插入;在元素删除时,为填补空白,也可能移动许多元素。这个处理过程极其繁琐和低效。如果采用链接存储表示,一个表的存储空间可以连续,可以不连续。表的增长通过动态存储分配解决,只要存储器未满,就不会有表溢出的问题;表的收缩可以通过动态存储释放实现,释放的空间还可以在以后动态分配给其他的存储申请要求,非常灵活方便。对于n个表(包括表的总数可能变化)共存的情形,处理十分简便和快捷。所以选用链接存储表示较好。(3) 应采用顺序存储表示。因为顺序存储表示的存取速度快,但修改效率低。若表的总数基本稳定,且很少进行插入和删除,但要求以最快的速度存取表中的元素,这时采用顺序存储表示较好。3-2 针对带表头结点的单链表,试编写下列函数。(1) 定位函数Locate:在单链表中寻找第i个结点。若找到,则函数返回第i个结点的地址;若找不到,则函数返回NULL。(2) 求最大值函数max:通过一趟遍历在单链表中确定值最大的结点。(3) 统计函数number:统计单链表中具有给定值x的所有元素。(4) 建立函数create:根据一维数组an建立一个单链表,使单链表中各元素的次序与an中各元素的次序相同,要求该程序的时间复杂性为O(n)。(5) 整理函数tidyup:在非递减有序的单链表中删除值相同的多余结点。【解答】单链表的结点类(ListNode class)和链表类(List class)的类定义。#ifndef LIST_H/将单链表定义在List.h#define LIST_Htemplate class List;/前视的类定义template class ListNode /链表结点类的定义friend class List;/List类作为友元类定义private: Type data;/数据域 ListNode *link;/链指针域public: ListNode ( ) : link (NULL) /仅初始化指针成员的构造函数 ListNode ( Type item, ListNode * next = NULL ) : data (item), link (next) /初始化数据与指针成员的构造函数 ListNode * getLink ( ) return link; /取得结点的下一结点地址 Type getData ( ) return data; /取得结点中的数据 void setLink ( ListNode * next ) link = next; /修改结点的link指针 void setData ( Type value ) data = value; /修改结点的data值;template class List /单链表类定义private: ListNode *first, *current;/链表的表头指针和当前元素指针public: List ( Type value ) first = current = new ListNode ( value ); /构造函数 List ( ) MakeEmpty ( ); delete first; /析构函数 void MakeEmpty ( );/将链表置为空表 int Length ( ) const;/计算链表的长度 ListNode * Find ( Type value );/搜索含value的元素并成为当前元素 ListNode * Locate( int i );/搜索第i个元素并置为当前元素 Type GetData ( ) return current-data; /取出表中当前元素的值 int Insert ( Type value );/将value插在当前位置后并成为当前元素 Type *Remove ( );/将表中当前元素删去, 填补者为当前元素 ListNode * Firster ( ) current = first; return first; /当前指针定位于表头 Type First ( ) ;/当前指针定位于表第一个元素并返回值 Type *Next ( );/将当前指针进到表中下一个元素并返回值 int NotNull ( ) return current != NULL; /表中当前元素空否?空返回1, 不空返回0 int NextNotNull ( ) return current != NULL & current-link != NULL; ;/当前元素的下一元素空否?空返回1, 不空返回0(1) 实现定位函数的算法如下:template ListNode * List : Locate ( int i ) /取得单链表中第i个结点地址, i从1开始计数, i = 0时返回指针NULL if ( i = 0 ) return NULL;/位置i在表中不存在 ListNode * p = first; int k = 0;/从表头结点开始检测 while ( p != NULL & k link; k+; /循环, p = NULL表示链短, 无第i个结点 return p;/否则k = i, 返回第i个结点地址(2) 实现求最大值的函数如下:template ListNode * List : Max ( ) /在单链表中进行一趟检测,找出具有最大值的结点地址, 如果表空, 返回指针NULL if ( first-link = NULL ) return NULL;/空表, 返回指针NULL ListNode * pmax = first-link, p = first-link-link;/假定第一个结点中数据具有最大值 while ( p != NULL ) /循环, 下一个结点存在 if ( p-data pmax-data ) pmax = p;/指针pmax记忆当前找到的具最大值结点 p = p-link;/检测下一个结点 return pmax;(3) 实现统计单链表中具有给定值x的所有元素的函数如下:template int List : Count ( Type& x ) /在单链表中进行一趟检测,找出具有最大值的结点地址, 如果表空, 返回指针NULL int n = 0; ListNode * p = first-link;/从第一个结点开始检测 while ( p != NULL ) /循环, 下一个结点存在 if ( p-data = x ) n+;/找到一个, 计数器加1 p = p-link;/检测下一个结点 return n;(4) 实现从一维数组An建立单链表的函数如下:template void List : Create ( Type A , int n ) /根据一维数组An建立一个单链表,使单链表中各元素的次序与An中各元素的次序相同 ListNode * p; first = p = new ListNode;/创建表头结点 for ( int i = 0; i link = new ListNode ( Ai );/链入一个新结点, 值为Ai p = p-link;/指针p总指向链中最后一个结点 p-link = NULL;采用递归方法实现时,需要通过引用参数将已建立的单链表各个结点链接起来。为此,在递归地扫描数组An的过程中,先建立单链表的各个结点,在退出递归时将结点地址p(被调用层的形参)带回上一层(调用层)的实参p-link。template void List : create ( Type A , int n, int i, ListNode *& p ) /私有函数:递归调用建立单链表 if ( i = n ) p = NULL; else p = new ListNode( Ai );/建立链表的新结点create ( A, n, i+1, p-link );/递归返回时p-link中放入下层p的内容 template void List : create ( Type A , int n ) /外部调用递归过程的共用函数 first = current = new ListNode;/建立表头结点 create ( A, n, 0, first-link );/递归建立单链表 (5) 实现在非递减有序的单链表中删除值相同的多余结点的函数如下:template void List : tidyup ( ) ListNode * p = first-link, temp;/检测指针, 初始时指向链表第一个结点 while ( p != NULL & p-link != NULL )/循环检测链表 if ( p-data = p-link-data ) /若相邻结点所包含数据的值相等 temp = p-first; p-link = temp-link; /为删除后一个值相同的结点重新拉链 delete temp; /删除后一个值相同的结点 else p = p-link;/指针p进到链表下一个结点3-3 设ha和hb分别是两个带表头结点的非递减有序单链表的表头指针, 试设计一个算法, 将这两个有序链表合并成一个非递增有序的单链表。要求结果链表仍使用原来两个链表的存储空间, 不另外占用其它的存储空间。表中允许有重复的数据。【解答】#include template class List;template class ListNode friend class List;public:ListNode ( ) : link ( NULL ) /构造函数, 仅初始化指针成员ListNode ( Type item, ListNde * next = NULL ) : data ( item ), link ( next ) private:/构造函数, 初始化数据与指针成员Type data;ListNode *link;template class List private:ListNode *first, *last;public:List ( Type finishied ) first = last = new ListNode( finished ); /建立链表, 在表头结点的data域中存放数据输入结束标志, 它是表中不可能出现的数据void Merge ( List &hb );/连接链表friend istream& operator ( istream& in, List inList ); /输入链表friend ostream& operator ( ostream& out, List outList );/输出链表istream& operator ( istream& in, List inList ) Type value;ListNode *p, *q, *s; in value; while ( value != inList.first-data ) /循环建立各个结点 s = new ListNode( value ); q = first; p = inList.first-link; /寻找新结点插入位置 while ( p != NULL & p-data link; q-link = s; s-link = p;/在q, p间插入新结点 if ( p = NULL ) inList.last = s; in value;ostream& operator ( ostream& out, List outList ) coutnThe List is : n; ListNode *p = outList.first-link; while ( p != NULL ) out data; if ( p != last ) out ; else out link; template void List : Merge ( List& hb ) /将当前链表this与链表hb按逆序合并,结果放在当前链表this中。ListNode *pa, *pb, *q, *p; pa = first-link; pb = hb.first-link;/检测指针跳过表头结点first-link = NULL;/结果链表初始化while ( pa != NULL & pb != NULL ) /当两链表都未结束时 if ( pa-data data ) q = pa; pa = pa-link; /从pa链中摘下 else q = pb; pb = pb-link; /从pb链中摘下 qlink = first-link; first-link = q;/链入结果链的链头p = ( pa != NULL ) ? pa : pb;/处理未完链的剩余部分while ( p != NULL ) q = p; p = p-link; q-link = first-link; first-link = q;3-4 设有一个表头指针为h的单链表。试设计一个算法,通过遍历一趟链表,将链表中所有结点的链接方向逆转,如下图所示。要求逆转结果链表的表头指针h指向原链表的最后一个结点。【解答1】template void List : Inverse ( ) if ( first = NULL ) return; ListNode *p = first-link, *pr = NULL; while ( p != NULL ) first-link = pr;/逆转first指针 pr = first; first = p; p = p-link;/指针前移 first-link = pr;【解答2】template void List : Inverse ( ) ListNode *p, *head = new ListNode ( );/创建表头结点, 其link域默认为NULL while ( first != NULL ) p = first; first = first-link;/摘下first链头结点 p-link = head-link; head-link = p;/插入head链前端 first = head-link; delete head;/重置first, 删去表头结点3-5 从左到右及从右到左遍历一个单链表是可能的,其方法是在从左向右遍历的过程中将连接方向逆转,如右图所示。在图中的指针p指向当前正在访问的结点,指针pr指向指针p所指结点的左侧的结点。此时,指针p所指结点左侧的所有结点的链接方向都已逆转。(1) 编写一个算法,从任一给定的位置(pr, p)开始,将指针p右移k个结点。如果p移出链表,则将p置为0,并让pr停留在链表最右边的结点上。(2) 编写一个算法,从任一给定的位置(pr, p)开始,将指针p左移k个结点。如果p移出链表,则将p置为0,并让pr停留在链表最左边的结点上。【解答】(1) 指针p右移k个结点template void List : siftToRight ( ListNode *& p, ListNode *& pr, int k ) if ( p = NULL & pr != first ) /已经在链的最右端 cout 已经在链的最右端,不能再右移。 endl; return; int i; ListNode *q; if ( p = NULL )/从链头开始 i = 1; pr = NULL; p = first; /重置p到链头也算一次右移 else i = 0; while ( p != NULL & i link; p-link = pr;/链指针plink逆转指向pr pr = p; p = q; i+;/指针pr, p右移 cout 右移了 i 个结点。 endl;(2) 指针p左移k个结点template void List :siftToLeft ( ListNode *& p, ListNode *& pr, int k ) if ( p = NULL & pr = first ) /已经在链的最左端 cout 已经在链的最左端,不能再左移。 endl; return; int i = 0; ListNode *q; while ( pr != NULL & i link; pr-link = p;/链指针pr-link逆转指向p p = pr; pr = q; i+;/指针pr, p左移 cout 左移了 i 个结点。 endl; if ( i k ) pr = p; p = NULL; /指针p移出表外,重置p, pr3-6 试写出用单链表表示的字符串类及字符串结点类的定义,并依次实现它的构造函数、以及计算串长度、串赋值、判断两串相等、求子串、两串连接、求子串在串中位置等7个成员函数。要求每个字符串结点中只存放一个字符。【解答】/用单链表表示的字符串类string1的头文件string1.h#include const int maxLen = 300;/字符串最大长度为300(理论上可以无限长)class string1 public: string1 ( );/构造空字符串 string1 ( char * obstr );/从字符数组建立字符串 string1 ( );/析构函数 int Length ( ) const return curLen; /求字符串长度 string1& operator = ( string1& ob );/串赋值 int operator = ( string1& ob );/判两串相等 char operator ( int i );/取串中字符 string1 operator ( ) ( int pos, int len );/取子串 string1& operator += ( string1& ob );/串连接 int Find ( string1& ob );/求子串在串中位置(模式匹配) friend ostream& operator ( istream& is, string1& ob );private: ListNode*chList;/用单链表存储的字符串 int curLen;/当前字符串长度/单链表表示的字符串类string1成员函数的实现,在文件string1.cpp中#include #include string1.hstring1 : string1( ) /构造函数 chList = new ListNode ( 0 ); curLen = 0;string1 : string1( char *obstr ) /复制构造函数 curLen = 0; ListNode *p = chList = new ListNode ( *obstr ); while ( *obstr != 0 ) obstr+; p = p-link = new ListNode ( *obstr ); curLen+; string1& string1 : operator = ( string1& ob ) /串赋值 ListNode *p = ob.chList; ListNode *q = chList = new ListNode ( p-data ); curLen = ob.curLen; while ( p-data != 0 ) p = p-link; q = q-link = new ListNode ( p-data ); return this; int string1 : operator = ( string1& ob ) /判两串相等 if ( curLen != ob.curLen ) return 0; ListNode *p = chList, *q = ob.chList; for ( int i = 0; i data != q-data ) return 0; else p = p-link; q = q-link; return 1; char string1 : operator ( int i ) /取串中字符 if ( i = 0 & i curLen ) ListNode *p = chList; int k = 0; while ( p != NULL & k link; k+; if ( p != NULL ) return p-data; return 0;string1 string1 : operator ( ) ( int pos, int len ) /取子串 string1 temp; if ( pos = 0 & len = 0 & pos curLen & pos + len - 1 curLen ) ListNode *q, *p = chList; for ( int k = 0; k link;/定位于第pos结点 q = temp.chList = new ListNode ( p-data ); for ( int i = 1; i link; q = q-link = new ListNode ( p-data ); q-link = new ListNode ( 0 );/建立串结束符 temp.curLen = len; else temp.curLen = 0; temp.chList = new ListNode ( 0 ); return temp;string1& string1 : operator += ( string1& ob ) /串连接 if ( curLen + ob.curLen maxLen ) len = maxLen - curLen; else len = ob.curLen;/传送字符数 ListNode *q = ob.chList, *p = chList; for ( int k = 0; k link;/this串的串尾 k = 0; for ( k = 0; k link = new ListNode ( q-data ); q = q-link; plink = new ListNode ( 0 ); return this;int string1 : Find ( string1& ob ) /求子串在串中位置(模式匹配) int slen = curLen, oblen = ob.curLen, i = slen - oblen; string1 temp = this; while ( i -1 ) if ( temp( i, oblen ) = ob ) break; else i- ; return i;3-7 如果用循环链表表示一元多项式,试编写一个函数Polynomial : Calc(x),计算多项式在x处的值。【解答】下面给出表示多项式的循环链表的类定义。作为私有数据成员,在链表的类定义中封装了3个链接指针:first、last和current,分别指示链表的表头结点、链尾结点和最后处理到的结点。class Polynomal;/多项式前视类定义class Term /项类定义friend class Polynomal;private: double coef; /系数 int expn;/指数 Term *link;/项链接指针public: Term ( double c = 0, int e = 0, Term * next = NULL ) : coef (c), expn(e), link (next) class Polynomal /多项式类定义private: Term *first, *current;/头指针, 当前指针 int n;/多项式阶数public: Polynomal ( );/构造函数 Polynomal ( );/析构函数 int Length ( ) const;/计算多项式项数 int IsEmpty ( ) return first-link = first; /判是否零多项式 int Find ( int value );/在多项式中寻找其指数值等于value的项 int getExpn ( ) const;/返回当前项中存放的指数值 double getCoef ( ) const;/返回当前项中存放的系数值 void Firster ( ) current = first; /将当前指针置于头结点 int First ( );/将当前指针指向链表的第一个结点 int Next ( );/将当前指针指到当前结点的后继结点 int Prior ( );/将当前指针指到当前结点的前驱结点 void Insert ( const double coef, int expn );/插入新结点 void Remove ( );/删除当前结点 double Calc ( double x );/求多项式的值 friend Polynomial operator + ( Polynomial &, Polynomial & ); friend Polynomial operator * ( Polynomial &, Polynomial & ); ;对于多项式Pn(x) = a0 + a1x + a2x2 + a3x3 + + an-1xn-1 + anxn,可用Horner规则将它改写求值:Pn(x) = a0 + (a1x + ( a2 + ( a3 + + ( an-1 + an*x )*x )*x )*x )*x因为不是顺序表,必须采用递归算法实现:返回求值Value(n) = a0 + Value(n-1)*xValue(n-1) = a1 + Value(n-2)*xValue(1) = an-1 + Value(0)Value(0) = an递归求解double Polynomal : Value ( Term *p, double x ) /私有函数:递归求子多项式的值 if ( p-link = first ) return p-coef; else return p-coef + x * Value ( p-link, x );double Polynomal : Calc ( double x ) /共有函数:递归求多项式的值 Term * pc = first-link; return ( pc = first ) ? 0.0 : Value ( pc, x ); 但当多项式中许多项的系数为0时变成稀疏多项式,如P50(x) = a0 + a13x13 + a35x35 + a50x50,为节省存储起见,链表中不可能保存有零系数的结点。此时,求值函数要稍加改变:#include double Polynomal : Value ( Term *p, double e, double x ) /私有函数:递归求子多项式的值。pow(x, y)是求x的y次幂的函数, 它的原型在“math.h”中 if ( p-link = first ) return p-coef; else return p-coef + pow( x, p-expn e ) * Value ( p-link, p-expn, x );double Polynomal : Calc ( double x ) /共有函数:递归求多项式的值 Term * pc = first-link; return ( pc = first ) ? 0.0 : Value ( pc, 0, x ); 3-8 设a和b是两个用带有表头结点的循环链表表示的多项式。试编写一个算法,计算这两个多项式的乘积c = a*b,要求计算后多项式a与b保持原状。如果这两个多项式的项数分别为n与m, 试说明该算法的执行时间为O(nm2)或O(n2m)。但若a和b是稠密的, 即其很少有系数为零的项, 那么试说明该乘积算法的时间代价为O(nm)。【解答】假设则它们的乘积为例如,a = 1 + 2x + 3x2 + 4x3 + 5x4, b = 6 + 7x + 8x2 + 9x3, 它们的乘积 c = (1+2x+3x2+4x3+5x4)*(6+7x+8x2+9x3) = = 1*6 + (1*7+2*6)x +(1*8+2*7+3*6)x2+(1*9+2*8+3*7+4*6)x3+ + (2*9+3*8+4*7+5*6)x4+ (3*9+4*8+5*7)x5+(4*9+5*8)x6+5*9x7在求解过程中,固定一个ai,用它乘所有bj,得到xi+j的系数的一部分。这是一个二重循环。1*61*71*81*9 i = 0 : 1*61*7+2*61*8+2*71*9+2*82*9 i = 1 : 1*61*7+2*61*8+2*7+3*61*9+2*8+3*72*9+3*83*9 i = 2 :1*61*7+2*61*8+2*7+3*61*9+2*8+3*7+4*62*9+3*8+4*73*9+4*84*9 i = 3 : 3*9+4*8+5*74*9+5*85*91*61*8+2*7+3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025按揭商品房买卖合同范本
- 农村生态旅游开发与资源保护协议
- 酒店管理项目合作协议
- 2025标准的合作合同书范文
- 物流运输规划与调度辅助工具
- 公证员任职面试经典题及答案
- 工程预算修正合同
- 企业年会活动策划协议
- 重阳节尊老精神的作文9篇
- 2025年甘肃特岗教师考试题库(附答案)
- 无呕吐病房的CINV管理
- 2025年福建南平市武夷山水茶业有限公司招聘笔试参考题库含答案解析
- 2025-2030年中国液压系统行业市场全景评估及未来趋势研判报告
- JCC工作循环检查流程与标准
- 牢记教师初心不忘育人使命作新时代合格人民教师课件
- 门窗工程采购相关知识
- 2025风电机组无人机巡检技术方案
- 浙江省台州市住在室内装修施工合同书
- 2025年高压电工资格考试国家总局模拟题库及答案(共四套)
- 《服务器安装与维护》课件
- 金蝶K3供应链操作手册
评论
0/150
提交评论