版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录13.1线性群体13.2群体数据的组织13.3小结1线性群体线性群体的概念直接访问群体--数组类顺序访问群体--链表类栈类队列类213.1线性群体群体的概念群体是指由多个数据元素组成的集合体。群体可以分为两个大类:线性群体和非线性群体。线性群体中的元素按位置排列有序,可以区分为第一个元素、第二个元素等。非线性群体不用位置顺序来标识元素。313.1线性群体13.1.1线性群体的概念线性群体中的元素次序与其位置关系是对应的。在线性群体中,又可按照访问元素的不同方法分为直接访问、顺序访问和索引访问。在本章我们只介绍直接访问和顺序访问。413.1线性群体…第一个元素第二个元素第三个元素最后一个元素13.1.2直接访问群体——数组类静态数组是具有固定元素个数的群体,其中的元素可以通过下标直接访问。缺点:大小在编译时就已经确定,在运行时无法修改。动态数组由一系列位置连续的,任意数量相同类型的元素组成。优点:其元素个数可在程序运行时改变。vector就是用类模板实现的动态数组。动态数组类模板:例9-3(Array.h)513.1线性群体6例13-1(教材例9-3)
动态数组类模板程序#ifndefARRAY_H#defineARRAY_H#include<cassert>template<classT> //数组类模板定义classArray{private: T*list; //用于存放动态分配的数组内存首地址
intsize; //数组大小(元素个数)public: Array(intsz=50); //构造函数
Array(constArray<T>&a); //拷贝构造函数
~Array(); //析构函数
Array<T>&operator=(constArray<T>&rhs); //重载"=“ T&operator[](inti);//重载"[]” constT&operator[](inti)const; operatorT*(); //重载到T*类型的转换
operatorconstT*()const; intgetSize()const; //取数组的大小
voidresize(intsz); //修改数组的大小};13.1线性群体——13.1.2直接访问群体——数组类template<classT>Array<T>::Array(intsz){//构造函数 assert(sz>=0);//sz为数组大小(元素个数),应当非负
size=sz; //将元素个数赋值给变量size list=newT[size]; //动态分配size个T类型的元素空间}template<classT>Array<T>::~Array(){//析构函数 delete[]list;}//拷贝构造函数template<classT>Array<T>::Array(constArray<T>&a){
size=a.size;//从对象x取得数组大小,并赋值给当前对象的成员 //为对象申请内存并进行出错检查
list=newT[size]; //动态分配n个T类型的元素空间
for(inti=0;i<size;i++)//从对象X复制数组元素到本对象 list[i]=a.list[i];}713.1线性群体——13.1.2直接访问群体——数组类例13-1(续)//重载"="运算符,将对象rhs赋值给本对象。实现对象之间的整体赋值template<classT>Array<T>&Array<T>::operator=(constArray<T>&rhs){ if(&rhs!=this){//如果本对象中数组大小与rhs不同,则删除数组原有内存,然后重新分配
if(size!=rhs.size){ delete[]list; //删除数组原有内存
size=rhs.size; //设置本对象的数组大小
list=newT[size]; //重新分配n个元素的内存
} //从对象X复制数组元素到本对象
for(inti=0;i<size;i++) list[i]=rhs.list[i]; } return*this; //返回当前对象的引用}813.1线性群体——13.1.2直接访问群体——数组类例13-1(续)//重载下标运算符,实现与普通数组一样通过下标访问元素,并且具有越界检查功能template<classT>T&Array<T>::operator[](intn){ assert(n>=0&&n<size); //检查下标是否越界
returnlist[n]; //返回下标为n的数组元素}template<classT>constT&Array<T>::operator[](intn)const{ assert(n>=0&&n<size); //检查下标是否越界
returnlist[n]; //返回下标为n的数组元素}
//重载指针转换运算符,将Array类的对象名转换为T类型的指针template<classT>Array<T>::operatorT*(){ returnlist; //返回当前对象中私有数组的首地址}
913.1线性群体——13.1.2直接访问群体——数组类例13-1(续)template<classT>Array<T>::operatorconstT*()const{ returnlist; //返回当前对象中私有数组的首地址}//取当前数组的大小template<classT>intArray<T>::getSize()const{ returnsize;}//将数组大小修改为sztemplate<classT>voidArray<T>::resize(intsz){ assert(sz>=0); //检查sz是否非负
if(sz==size) //如果指定的大小与原有大小一样,什么也不做
return; T*newList=newT[sz]; //申请新的数组内存
intn=(sz<size)?sz:size;//将sz与size中较小的一个赋值给n //将原有数组中前n个元素复制到新数组中
for(inti=0;i<n;i++) newList[i]=list[i]; delete[]list; //删除原数组
list=newList; //使list指向新数组
size=sz; //更新size}#endif//ARRAY_H
1013.1线性群体——13.1.2直接访问群体——数组类例13-1(续)11浅拷贝13.1线性群体——13.1.2直接访问群体——数组类template<classT>Array<T>::Array(constArray<T>&x){size=x.size;list=x.list;}intmain(){Array<int>a(10);......Array<int>b(a);......}
listsizeaa的数组元素占用的内存拷贝前
listsizeaa的数组元素占用的内存拷贝后listsizeb12深拷贝13.1线性群体——13.1.2直接访问群体——数组类listsizeaa的数组元素占用的内存拷贝前listsizeaa的数组元素占用的内存拷贝后listsizebb的数组元素占用的内存为什么有的函数返回引用如果一个函数的返回值是一个对象的值,就不应成为左值。如果返回值为引用。由于引用是对象的别名,通过引用当然可以改变对象的值。1313.1线性群体——13.1.2直接访问群体——数组类指针转换运算符的作用举例#include<iostream>usingnamespacestd;voidread(int*p,intn){for(inti=0;i<n;i++)cin>>p[i];}intmain(){
inta[10];read(a,10);return0;}#include"Array.h"#include<iostream>usingnamespacestd;voidread(int*p,intn){for(inti=0;i<n;i++)cin>>p[i];}intmain(){
Array<int>a(10);read(a,10);return0;}1413.1线性群体——13.1.2直接访问群体——数组类Array类的应用例13-2(教材例9-4)求范围2~N中的质数,N在程序运行时由键盘输入。1513.1线性群体——13.1.2直接访问群体——数组类16#include<iostream>#include<iomanip>#include"Array.h"usingnamespacestd;intmain(){ Array<int>a(10); //用来存放质数的数组,初始状态有10个元素。
intn,count=0; cout<<"Enteravalue>=2asupperlimitforprimenumbers:"; cin>>n; for(inti=2;i<=n;i++){ boolisPrime=true; for(intj=0;j<count;j++) if(i%a[j]==0){ //若i被a[j]整除,说明i不是质数
isPrime=false;break; } if(isPrime){ if(count==a.getSize())a.resize(count*2); a[count++]=i; } } for(inti=0;i<count;i++) cout<<setw(8)<<a[i]; cout<<endl; return0;}13.1线性群体——13.1.2直接访问群体——数组类例13-2(续)13.1.3顺序访问群体——链表类链表是一种动态数据结构,可以用来表示顺序访问的线性群体。链表是由系列结点组成的,结点可以在运行时动态生成。每一个结点包括数据域和指向链表中下一个结点的指针(即下一个结点的地址)。如果链表每个结点中只有一个指向后继结点的指针,则该链表称为单链表。1713.1线性群体18单链表13.1线性群体——13.1.3顺序访问群体——链表类data1data2data3datanNULL…headrear19单链表的结点类模板template<classT>classNode{private:Node<T>*next;public:Tdata;Node(constT&item,Node<T>*next=0);voidinsertAfter(Node<T>*p);Node<T>*deleteAfter();Node<T>*nextNode()const;};13.1线性群体——13.1.3顺序访问群体——链表类20在结点之后插入一个结点13.1线性群体——13.1.3顺序访问群体——链表类data1data2…pdata…template<classT>voidNode<T>::insertAfter(Node<T>*p){//p节点指针域指向当前节点的后继节点
p->next=next;next=p;//当前节点的指针域指向p}21
删除结点之后的结点13.1线性群体——13.1.3顺序访问群体——链表类data1data2data3…tempPtrNode<T>*Node<T>::deleteAfter(void){Node<T>*tempPtr=next;if(next==0)return0;next=tempPtr->next;returntempPtr;}例13-3(教材例9-5)结点类模扳//Node.h#ifndefNODE_H#defineNODE_H//类模板的定义template<classT>classNode{private: Node<T>*next; //指向后继结点的指针public: Tdata; //数据域
Node(constT&data,Node<T>*next=0);//构造函数
voidinsertAfter(Node<T>*p); //在本结点之后插入一个同类结点p Node<T>*deleteAfter(); //删除本结点的后继结点,并返回其地址
Node<T>*nextNode(); //获取后继结点的地址
constNode<T>*nextNode()const; //获取后继结点的地址};2213.1线性群体——13.1.3顺序访问群体——链表类//类的实现部分//构造函数,初始化数据和指针成员template<classT>Node<T>::Node(constT&data,Node<T>*next/*=0*/):data(data),next(next){}
//返回后继结点的指针template<classT>Node<T>*Node<T>::nextNode(){ returnnext;}
//返回后继结点的指针template<classT>constNode<T>*Node<T>::nextNode()const{ returnnext;}2313.1线性群体——13.1.3顺序访问群体——链表类例13-3(续)//在当前结点之后插入一个结点ptemplate<classT>voidNode<T>::insertAfter(Node<T>*p){p->next=next;//p结点指针域指向当前结点的后继结点
next=p; //当前结点的指针域指向p}//删除当前结点的后继结点,并返回其地址template<classT>Node<T>*Node<T>::deleteAfter(){ Node<T>*tempPtr=next; //将欲删除的结点地址存储到tempPtr中
if(next==0) //如果当前结点没有后继结点,则返回空指针
return0; next=tempPtr->next; //使当前结点的指针域指向tempPtr的后继结点
returntempPtr; //返回被删除的结点的地址}#endif//NODE_H2413.1线性群体——13.1.3顺序访问群体——链表类例13-3(续)链表的基本操作生成结点插入结点查找结点删除结点遍历链表清空链表2513.1线性群体——13.1.3顺序访问群体——链表类例13-4(教材例9-6)
链表类模板#ifndefLINKEDLIST_H#defineLINKEDLIST_H#include"Node.h"template<classT>classLinkedList{private: //数据成员:
Node<T>*front,*rear Node<T>*prevPtr,*currPtr; intsize; intposition; Node<T>*newNode(constT&item,Node<T>*ptrNext=NULL); voidfreeNode(Node<T>*p); voidcopy(constLinkedList<T>&L);public: LinkedList(); LinkedList(constLinkedList<T>&L); ~LinkedList(); LinkedList<T>&operator=(constLinkedList<T>&L); intgetSize()const; boolisEmpty()const; voidreset(intpos=0); voidnext(); boolendOfList()const; intcurrentPosition(void)const; voidinsertFront(constT&item); voidinsertRear(constT&item); voidinsertAt(constT&item); voidinsertAfter(constT&item); TdeleteFront(); voiddeleteCurrent(); T&data(); constT&data()const voidclear();};#endif//LINKEDLIST_H2613.1线性群体——13.1.3顺序访问群体——链表类例13-5(教材例9-7)
链表类应用举例//9_7.cpp#include<iostream>#include"LinkedList.h"usingnamespacestd;intmain(){ LinkedList<int>list; for(inti=0;i<10;i++){ intitem; cin>>item; list.insertFront(item); } cout<<"List:"; list.reset(); while(!list.endOfList()){ cout<<list.data()<<""; list.next(); } cout<<endl; intkey; cout<<"Pleaseentersomeintegerneededtobedeleted:"; cin>>key; list.reset(); while(!list.endOfList()){ if(list.data()==key) list.deleteCurrent(); list.next(); } cout<<"List:"; list.reset(); while(!list.endOfList()){ cout<<list.data()<<""; list.next } cout<<endl; return0;}2713.1线性群体——13.1.3顺序访问群体——链表类例13-5(续)运行结果如下:36575245910List:10954257563Pleaseentersomeintegerneededtobedeleted:5List:109427632813.1线性群体——13.1.3顺序访问群体——链表类13.1.4栈类栈是只能从一端访问的线性群体,可以访问的这一端称栈顶,另一端称栈底。2913.1线性群体an┆a2a1入栈出栈栈顶栈底栈的应用举例——表达式处理3013.1线性群体——13.1.4栈类ba/a/b+c*d(a)t1+a/b+c*dt1=a/b(b)dct1*+a/b+c*d(c)t3a/b+c*dt3=t1+t2(e)t2t1+a/b+c*dt2=c*d(d)栈的基本状态栈空栈中没有元素栈满栈中元素个数达到上限一般状态栈中有元素,但未达到栈满状态3113.1线性群体——13.1.4栈类3213.1线性群体——13.1.4栈类栈顶┆an┆a1a0入栈出栈数组下标maxn10一般状态栈顶入栈出栈数组下标初始状态(栈空)maxn10栈顶amax┆an┆a1a0入栈出栈数组下标maxn10栈满状态栈的基本操作初始化入栈出栈清空栈访问栈顶元素检测栈的状态(满、空)3313.1线性群体——13.1.4栈类例13-6(教材例9-8)
栈类模板//Stack.h#ifndefSTACK_H#defineSTACK_H#include<cassert>template<classT,intSIZE=50>classStack{private: Tlist[SIZE]; inttop;public: Stack(); voidpush(constT&item); Tpop(); voidclear(); constT&peek()const; boolisEmpty()const; boolisFull()const;};3413.1线性群体——13.1.4栈类例13-6(续)//模板的实现template<classT,intSIZE>Stack<T,SIZE>::Stack():top(-1){} template<classT,intSIZE>voidStack<T,SIZE>::push(constT&item){
assert(!isFull());
list[++top]=item; }template<classT,intSIZE>TStack<T,SIZE>::pop(){
assert(!isEmpty());
returnlist[top--]; }template<classT,intSIZE>constT&Stack<T,SIZE>::peek()const{
assert(!isEmpty());
returnlist[top]; //返回栈顶元素}template<classT,intSIZE>boolStack<T,SIZE>::isEmpty()const{
returntop==-1;}template<classT,intSIZE>boolStack<T,SIZE>::isFull()const{
returntop==SIZE-1;}
template<classT,intSIZE>voidStack<T,SIZE>::clear(){
top=-1;}
#endif //STACK_H3513.1线性群体——13.1.4栈类栈的应用例13-7(教材例9.9)
一个简单的整数计算器
实现一个简单的整数计算器,能够进行加、减、乘、除和乘方运算。使用时算式采用后缀输入法,每个操作数、操作符之间都以空白符分隔。例如,若要计算"3+5"则输入"35+"。乘方运算符用"^"表示。每次运算在前次结果基础上进行,若要将前次运算结果清除,可键入"c"。当键入"q"时程序结束。Calculator.hCalculator.cpp9_9.cpp3613.1线性群体——13.1.4栈类37例13-7//Calculator.h#ifndefCALCULATOR_H#defineCALCULATOR_H#include"Stack.h" //包含栈类模板定义文件classCalculator{ //计算器类private: Stack<double>s; //操作数栈
voidenter(doublenum); //将操作数num压入栈
//连续将两个操作数弹出栈,放在opnd1和opnd2中
boolgetTwoOperands(double&opnd1,double&opnd2); voidcompute(charop); //执行由操作符op指定的运算public: voidrun(); //运行计算器程序
voidclear(); //清空操作数栈};#endif//CALCULATOR_H13.1线性群体——13.1.4栈类38例13-7(续)//Calculator.cpp#include"Calculator.h"#include<iostream>#include<sstream>#include<cmath>usingnamespacestd;//工具函数,用于将字符串转换为实数inlinedoublestringToDouble(conststring&str){ istringstreamstream(str); //字符串输入流
doubleresult; stream>>result; returnresult;}voidCalculator::enter(doublenum){ //将操作数num压入栈
s.push(num);}13.1线性群体——13.1.4栈类39例13-7(续)boolCalculator::getTwoOperands(double&opnd1,double&opnd2){ if(s.isEmpty()){ //检查栈是否空
cerr<<"Missingoperand!"<<endl; returnfalse; } opnd1=s.pop(); //将右操作数弹出栈
if(s.isEmpty()){ //检查栈是否空
cerr<<"Missingoperand!"<<endl; returnfalse; } opnd2=s.pop(); //将左操作数弹出栈
returntrue;}13.1线性群体——13.1.4栈类40voidCalculator::compute(charop){ //执行运算
doubleoperand1,operand2; boolresult=getTwoOperands(operand1,operand2); if(result){ //如果成功,执行运算并将运算结果压入栈
switch(op){ case'+':s.push(operand2+operand1);break; case'-':s.push(operand2-operand1);break; case'*':s.push(operand2*operand1);break; case'/': if(operand1==0){ //检查除数是否为0 cerr<<"Dividedby0!"<<endl; s.clear(); //除数为0时清空栈
}else s.push(operand2/operand1); break; case'^':s.push(pow(operand2,operand1));break; default: cerr<<"Unrecognizedoperator!"<<endl; break; } cout<<"="<<s.peek()<<""; //输出本次运算结果
}else s.clear(); //操作数不够,清空栈}13.1线性群体——13.1.4栈类例13-7(续)41voidCalculator::run(){//读入并处理后缀表达式
stringstr; while(cin>>str,str!="q"){ switch(str[0]){ case'c':s.clear();break; case'-'://遇'-'需判断是减号还是负号
if(str.size()>1) enter(stringToDouble(str)); else compute(str[0]); break; case'+': //遇到其它操作符时
case'*': case'/': case'^': compute(str[0]); default://若读入的是操作数,转换为整型后压入栈
enter(stringToDouble(str));break; } }}voidCalculator::clear(){ //清空操作数栈
s.clear();}13.1线性群体——13.1.4栈类例13-7(续)42例13-7(续)//9_9.cpp#include"Calculator.h"intmain(){ Calculatorc; c.run(); return0;}13.1线性群体——13.1.4栈类13.1.5队列类队列是只能向一端添加元素,从另一端删除元素的线性群体4313.1线性群体a1a2an-1an……队头队尾入队出队a0队列的基本状态队空队列中没有元素队满队列中元素个数达到上限一般状态队列中有元素,但未达到队满状态4413.1线性群体——13.1.5队列类4513.1线性群体——13.1.5队列类a0a1an-1an……队头队尾入队出队数组下标01n-1nmax(一般状态)……队头队尾入队出队数组下标01n-1nmax(队空状态)a0a1an-1anamax……队头队尾入队出队数组下标01n-1nmax(队满状态)元素移动方向元素移动方向45循环队列在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头。4613.1线性群体——13.1.5队列类4713.1线性群体——13.1.5队列类1234……m-1m-2m-30amam+1am+2a3队头队尾a4am-2am-3am-1队满状态元素个数=m1234……m-1m-2m-30队尾队头队空状态元素个数=0队尾1234……m-1m-2m-30a0a1a2a3队头一般状态47例13-8(教材例9-10)
队列类模板//Queue.h#ifndefQUEUE_H#defineQUEUE_H#include<cassert>//类模板的定义template<classT,intSIZE=50>classQueue{private: intfront,rear,count; //队头指针、队尾指针、元素个数
Tlist[SIZE]; //队列元素数组public: Queue();//构造函数,初始化队头指针、队尾指针、元素个数
voidinsert(constT&item); //新元素入队
Tremove(); //元素出队
voidclear(); //清空队列
constT&getFront()const; //访问队首元素4813.1线性群体——13.1.5队列类
//测试队列状态
intgetLength()const;//求队列长度
boolisEmpty()const;//判队队列空否
boolisFull()const;//判断队列满否};//构造函数,初始化队头指针、队尾指针、元素个数template<classT,intSIZE>Queue<T,SIZE>::Queue():front(0),rear(0),count(0){}template<classT,intSIZE>voidQueue<T,SIZE>::insert(constT&item){//向队尾插入元素
assert(count!=SIZE); count++; //元素个数增1 list[rear]=item; //向队尾插入元素
rear=(rear+1)%SIZE; //队尾指针增1,用取余运算实现循环队列}template<classT,intSIZE>TQueue<T,SIZE>::remove(){
assert(count!=0); inttemp=front; //记录下原先的队首指针
count--; //元素个数自减
front=(front+1)%SIZE;//队首指针增1。取余以实现循环队列
returnlist[temp]; //返回首元素值}4913.1线性群体——13.1.5队列类例13-8(续)template<classT,intSIZE>constT&Queue<T,SIZE>::getFront()const{
returnlist[front];}template<classT,intSIZE>intQueue<T,SIZE>::getLength()const{ //返回队列元素个数
returncount;}template<classT,intSIZE>boolQueue<T,SIZE>::isEmpty()const{ //测试队空否
returncount==0;}template<classT,intSIZE>boolQueue<T,SIZE>::isFull()const{ //测试队满否
returncount==SIZE;}template<classT,intSIZE>voidQueue<T,SIZE>::clear(){ //清空队列
count=0; front=0; rear=0;}#endif//QUEUE_H5013.1线性群体——13.1.5队列类例13-8(续)13.2群体数据的组织插入排序选择排序交换排序顺序查找折半查找5113.2群体数据的组织排序(sorting)排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素的任意序列,重新排列成一个按关键字有序的序列。数据元素:数据的基本单位。在计算机中通常作为一个整体进行考虑。一个数据元素可由若干数据项组成。关键字:数据元素中某个数据项的值,用它可以标识(识别)一个数据元素。在排序过程中需要完成两种基本操作:比较两个数的大小调整元素在序列中的位置5213.2群体数据的组织内部排序与外部排序内部排序:待排序的数据元素存放在计算机内存中进行的排序过程。外部排序:待排序的数据元素数量很大,以致内存存中一次不能容纳全部数据,在排序过程中尚需对外存进行访问的排序过程。5313.2群体数据的组织内部排序方法插入排序选择排序交换排序5413.2群体数据的组织插入排序的基本思想每一步将一个待排序元素按其关键字值的大小插入到已排序序列的适当位置上,直到待排序元素插入完为止。5513.2群体数据的组织——13.2.1插入排序初始状态:[5]41020123插入操作:1[4][45]10201232[10][4510]201233[20][451020]1234[12][45101220]35[3][345101220]直接插入排序在插入排序过程中,由于寻找插入位置的方法不同又可以分为不同的插入排序算法,这里我们只介绍最简单的直接插入排序算法。例13-9(教材例9-11)直接插入排序函数模板(9_11.h)5613.2群体数据的组织——13.2.1插入排序57例13-9直接插入排序函数模板template<classT>voidinsertionSort(Ta[],intn){ inti,j; Ttemp; for(inti=1;i<n;i++){ intj=i; Ttemp=a[i]; while(j>0&&temp<a[j-1]){ a[j]=a[j-1]; j--; } a[j]=temp; }}13.2群体数据的组织——13.2.1插入排序选择排序的基本思想每次从待排序序列中选择一个关键字最小的元素,(当需要按关键字升序排列时),顺序排在已排序序列的最后,直至全部排完。5813.2群体数据的组织——13.2.2选择排序[541020123]初始状态:3[41020125]34[1020125]第i次选择后,将选出的那个记录与第i个记录做交换。345[201210]......直接选择排序在选择类排序方法中,从待排序序列中选择元素的方法不同,又分为不同的选择排序方法,其中最简单的是通过顺序比较找出待排序序列中的最小元素,称为直接选择排序。例13-10(教材例9-12
直接选择排序函数模板(9-12.h)5913.2群体数据的组织——13.2.2选择排序60例13-10直接选择排序函数模板template<classT>voidmySwap(T&x,T&y){ Ttemp=x; x=y; y=temp;}template<classT>voidselectionSort(Ta[],intn){ for(inti=0;i<n-1;i++){ intleastIndex=i; for(intj=i+1;j<n;j++) if(a[j]<a[leastIndex]) leastIndex=j; mySwap(a[i],a[leastIndex ]); }}13.2群体数据的组织——13.2.2选择排序交换排
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026全球供应链金融发展趋势研究与投资战略规划报告
- 2026能源天然气行业市场供需预测及投资决策分析规划研究报告
- 2027届山西省忻州市三上数学期末学业质量监测试题含解析
- 2026中国休闲食品电商销售模式创新与竞争策略探讨
- 2026氢燃料电池核心部件行业现状供需分析及投资评估战略布局规划报告
- 2026中国智能碎纸机行业市场趋势与投资评估分析研究报告
- 2026人工智能领域知识产权保护与行业竞争生态分析
- 2026中国数码相机行业市场竞争现状与前景发展深入分析分析报告
- 2026中国通信基础设施行业市场供需特点分析及投资评估规划分析研究结果
- 2026人工智能芯片产业发展趋势规划前景深度研究报告
- 架线跨越果林施工方案
- 16G362钢筋混凝土结构预埋件(详细书签)图集
- 湖北省武汉市2024年中考英语模拟试卷(含答案)
- T-CECS120-2021套接紧定式钢导管施工及验收规程
- 2024届福建省漳州市台商投资区六年级下学期小升初真题数学试卷含解析
- 薛生白《湿热病篇》经典条文46条2022.9整理
- MR355.臂丛神经规范化扫描方案
- 劳务合同模板电子下载
- 中式烹调工艺与实训(第三版) 课件全套 (刘致良) 第1-13章 绪论、烹饪文化- 成本控制
- 天疱疮病人护理查房
- 蒋争:英语词汇的奥秘(词根词缀)
评论
0/150
提交评论