工學數(shù)據(jù)結構5-數(shù)組和字符串課件_第1頁
工學數(shù)據(jù)結構5-數(shù)組和字符串課件_第2頁
工學數(shù)據(jù)結構5-數(shù)組和字符串課件_第3頁
工學數(shù)據(jù)結構5-數(shù)組和字符串課件_第4頁
工學數(shù)據(jù)結構5-數(shù)組和字符串課件_第5頁
已閱讀5頁,還剩77頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第5講DATASTRUCTURE第5講DATASTRUCTUREDATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊矩陣2稀疏矩陣3字符串4數(shù)組1DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊DATASTRUCTURE§4.1.1

數(shù)組ADT數(shù)組的定義數(shù)組是下標index和值value組成的序對的集合。

(index,value)一維數(shù)組: A={(0,15),(1,24),(2,33),(3,21)}

012315243321DATASTRUCTURE§4.1.1

數(shù)組ADT數(shù)組的DATASTRUCTURE§4.1.1

數(shù)組ADT數(shù)組ADT

ADTArray{數(shù)據(jù):

下標index和元素值value組成的數(shù)據(jù)對集合,其中任意兩個數(shù)據(jù)對的下標index各不相同。運算:

Create():建立一個數(shù)組。

Retrieve(i):返回下標為i的元素值。

Store(i,x):將下標為i的數(shù)據(jù)對的值置為x。};

DATASTRUCTURE§4.1.1

數(shù)組ADT數(shù)組ADATASTRUCTURE§4.1.2

數(shù)組的順序表示一維數(shù)組的順序表示

loc(a[i])

=

loc(a[0])+i*k

(

i

=

0,

1,

2,

…,

n-1

)基地址:loc(a[0])每個元素占

k個存儲單元。

template<classT>A[]={a0,a1,…,ai,…,an-1};

pA=newT[100];//然后賦值Tb1=pA[i];//獲取第i個元素Tb2=*(pA+i);//獲取第i個元素DATASTRUCTURE§4.1.2

數(shù)組的順序表示一DATASTRUCTURE§4.1.2

數(shù)組的順序表示二維數(shù)組的順序表示二維數(shù)組a[m][n]映射到一維的存儲空間時有兩種順序:行優(yōu)先和列優(yōu)先。大多數(shù)語言如PASCAL、BASIC、C、C++等都是按行優(yōu)先順序存儲的,F(xiàn)ORTRAN是按列優(yōu)先順序存儲的。A[m][n]={{a0,0,a0,1,…a0,n-1},…,{ai,0,ai,1,…ai,n-1},…,{am-1,0,am-1,1,…am-1,n-1}};C/C++行優(yōu)先的存儲方法DATASTRUCTURE§4.1.2

數(shù)組的順序表示二DATASTRUCTURE§4.1.2

數(shù)組的順序表示二維數(shù)組的順序表示

loc(a[i][j])=loc(a[0][0])+(i*n+j)*k

(0i<m;0j<n)基地址:loc(a[0][0])每個元素占

k個存儲單元。

DATASTRUCTURE§4.1.2

數(shù)組的順序表示二DATASTRUCTURE§4.1.2

數(shù)組的順序表示C/C++中申請二維數(shù)組的方法:introw=3,col=4;//方法1:=====================================intMtrx[row][col]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//方法2:=====================================int**ppMtrx=new

int*[row];for(inti=0;i<row;i++) ppMtrx[i]=new

int[col];intn=0;for(i=0;i<row;i++)

for(intj=0;j<col;j++) ppMtrx[i][j]=++n;for(i=0;i<row;i++)

delete[]ppMtrx[i];delete[]ppMtrx;申請指針數(shù)組再為指針數(shù)組申請空間為二維數(shù)組賦值刪除二維數(shù)組DATASTRUCTURE§4.1.2

數(shù)組的順序表示DATASTRUCTURE§4.1.2

數(shù)組的順序表示//方法3:=====================================#definerow3#definecol4typedefintMtrx[row];

main(){

intn=0;

Mtrx*pMtrx=newMtrx[col];//用法與二維數(shù)組相同

for(inti=0;i<row;i++)

for(intj=0;j<col;j++) pMtrx[i][j]=++n;

delete[]pMtrx;}

定義二維數(shù)組將數(shù)組定義為數(shù)據(jù)類型DATASTRUCTURE§4.1.2

數(shù)組的順序表示/DATASTRUCTURE§4.1.2

數(shù)組的順序表示多維數(shù)組的順序表示推廣到多維數(shù)組a[m1][m2]…[mn],數(shù)組元素a[i1][i2]…[in]的存儲地址為:

loc(a[i1][i2]…[in])=

loc(a[0]…[0])+(i1*m2*m3*…*mn+i2*m3*m4*…*mn+…+in-1*mn+in)*k

=DATASTRUCTURE§4.1.2

數(shù)組的順序表示多DATASTRUCTURE§4.1.3

一維數(shù)組的C++類用C++的模板類定義的一維數(shù)組抽象數(shù)據(jù)類型。公有成員函數(shù)包括:

構造函數(shù)析構函數(shù)重載下標操作符:[]

重載下標操作符用來返回指向第i個元素的引用

重載數(shù)組賦值:=

賦值操作符實現(xiàn)數(shù)組的整體賦值。DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTURE§4.1.3

一維數(shù)組的C++類#include<assert.h>template<classT>classArray1D{public:Array1D(intsz=0);~Array1D(){delete[]elements;}T&operator[](inti)const;Array1D<T>&operator=(constArray1D<T>&r);friendistream&operator>>(istream&in,Array1D<T>&r);friendostream&operator<< (ostream&out,constArray1D<T>&r);private:

intsize; T*elements;};取元素值整體賦值缺少拷貝構造函數(shù)!DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTURE§4.1.3

一維數(shù)組的C++類構造函數(shù),申請數(shù)組空間template<classT>Array1D<T>::Array1D(intsz){

assert(sz>=0);//越界檢查

size=sz; elements=newT[sz];}運算符[],獲取第i個元素template<classT>T&Array1D<T>::operator[](inti)const{

assert(i>=0&&i<size);//越界檢查

returnelements[i];}

DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTURE§4.1.3

一維數(shù)組的C++類重載運算符=

template<classT>Array1D<T>&Array1D<T>::operator=(constArray1D<T>&r)

//數(shù)組r整體賦值給this{

if(this!=&r){//防止自我賦值

size=r.size;

delete[]elements;//釋放原空間

elements=newT[size];//重新分配空間

for(inti=0;i<size;i++) elements[i]=r.elements[i];}

return*this;}DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTURE§4.1.3

一維數(shù)組的C++類重載流運算符>>和<<template<classT>istream&operator>>(istream&in,Array1D<T>&r){

cout<<"Intputarray\n";

for(inti=0;i<r.size;i++)in>>r.elements[i];

returnin;}template<classT>ostream&operator<<(ostream&out,constArray1D<T>&r){

cout<<"Array=";

for(inti=0;i<r.size;i++)out<<r.elements[i]<<''; out<<endl; returnout;}

DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTUREmain中測試該類的效果#include"array1d.h"main(){Array1D<int>a(5),b(8); Array1D<int>c;//采用缺省長度0

cin>>a;cout<<"a"<<a;

cin>>b;cout<<"b"<<b;

cout<<"c"<<c;

cout<<"a[0]="<<a[0]<<“;“<<"b[5]="<<b[5]<<endl;c=b;cout<<"c=b,c"<<c;b=a;cout<<"b=a,b"<<b;}§4.1.3

一維數(shù)組的C++類DATASTRUCTUREmain中測試該類的效果§4.1DATASTRUCTURE§1

C++中有關數(shù)組的類classArray{public: Array(intsize=0,char*ptr=NULL);

//defaultconstructor Array(constArray&);//copyconstructor ~Array();//destructor

char*getPtr()const{returnm_ptr;}

voidSetArray(intsize,char*ptr);private:

int*m_ptr;//pointertothe //firstelementofthearray.

intm_size;};DATASTRUCTURE§1

C++中有關數(shù)組的類cDATASTRUCTURE§1

C++中有關數(shù)組的類Array::Array(intsize,char*ptr/*=NULL*/){m_ptr=NULL; SetArray(size,ptr);}Array::Array(constArray&ar){SetArray(ar.m_size,ar.m_ptr);}Array::~Array(){if(m_ptr!=NULL)delete[]m_ptr;}voidArray::SetArray(intsize,char*ptr)

//有問題的函數(shù)!{m_size=size;m_ptr=ptr;}淺拷貝!要改成深拷貝。DATASTRUCTURE§1

C++中有關數(shù)組的類ADATASTRUCTURE§1

C++中有關數(shù)組的類#include<iostream.h>#include<string.h>main(){

charstr[9]; strcpy(str,“Software”);

//注意:此處不能用char*str=”Software”;//因為這樣的字符串是只讀的。 Arrayar1(8,str); Arrayar2(ar1);

//調用拷貝構造函數(shù),其中調用了SetArray() str[0]=‘6’;//改變數(shù)組內容

cout<<ar1.getPtr()<<“”;

cout<<ar2.getPtr()<<endl;}輸出:6oftware6oftware淺拷貝的后果。DATASTRUCTURE§1

C++中有關數(shù)組的類#DATASTRUCTURE§1

C++中有關數(shù)組的類voidArray::SetArray(intsize,char*ptr){

if(size==0||ptr==NULL)return;

if(m_ptr!=NULL)delete[]m_ptr;

//釋放原數(shù)組

m_size=size; m_ptr=new

char[size];//申請新的空間

strncpy(m_ptr,ptr,size);//拷貝}

輸出:Software6oftwareDATASTRUCTURE§1

C++中有關數(shù)組的類vDATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊矩陣2稀疏矩陣3字符串4數(shù)組1特殊矩陣2DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊DATASTRUCTURE§4.2.1

對稱矩陣對稱矩陣和三角矩陣在n×n的矩陣A中,若aij=aji(0<i,j<n),則稱其為n階對稱矩陣。對于對稱矩陣,可以只存儲上三角(或下三角)中的元素(包括對角線上的元素)。DATASTRUCTURE§4.2.1

對稱矩陣對稱矩陣DATASTRUCTURE§4.2.1

對稱矩陣如果采用二維數(shù)組,n維對稱矩陣的元素為n2。如果只存儲三角中元素,則元素個數(shù)為

n(n+1)/2其中行列序號與元素序號的對應關系:0123…num-1a0,0a1,0a1,1a2,0…an-1,0…an-1,n-1DATASTRUCTURE§4.2.1

對稱矩陣如果采用DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊矩陣2稀疏矩陣3字符串4數(shù)組1特殊矩陣2稀疏矩陣3DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊DATASTRUCTURE§4.3.1

稀疏矩陣ADT稀疏矩陣大多數(shù)元素為零的矩陣稱為稀疏矩陣。對于稀疏矩陣可只存非零元素。DATASTRUCTURE§4.3.1

稀疏矩陣ADT稀DATASTRUCTURE§4.3.1

稀疏矩陣ADT稀疏矩陣ADT

ADTSparseMatrix{數(shù)據(jù):絕大多數(shù)元素為零的矩陣。運算:

Create():建立一個稀疏矩陣。

Destroy():撤消一個稀疏矩陣。

Add(B,C):當前矩陣對象與B相加,C中返回相加和。

Mul(B,C):當前矩陣對象與B相乘,C中返回相乘積。

Transpose(B):B中返回當前矩陣對象的轉置矩陣。}

DATASTRUCTURE§4.3.1

稀疏矩陣ADT稀DATASTRUCTURE§4.3.1

稀疏矩陣ADT#include<iostream.h>template<classT>classSparseMatrix{public: SparseMatrix(intmaxRowSize,intmaxColSize){} ~SparseMatrix(){}

virtualvoidAdd(constSparseMatrix<T>&B,SparseMatrix<T>&C)const;

virtualvoidMul(constSparseMatrix<T>&B,SparseMatrix<T>&C)const;

virtualvoidTranspose(SparseMatrix<T>&B)const;private:

intmaxRows,maxCols;};稀疏矩陣的C++類DATASTRUCTURE§4.3.1

稀疏矩陣ADT#DATASTRUCTURE§4.3.2

稀疏矩陣的順序表示三元組表示法按照壓縮存儲的思想,稀疏矩陣Am

n中的每一個非零元素aij

的值、行號和列號可以用一個三元組(i,j,v)表示。三元組可以按行或按列的順序存儲。三元組的Term類template

<classT>structTerms{

introw,col;Tvalue;};DATASTRUCTURE§4.3.2

稀疏矩陣的順序表DATASTRUCTURE§4.3.2

稀疏矩陣的順序表示0016032205-16111212323-840916215DATASTRUCTURE§4.3.2

稀疏矩陣的順序表DATASTRUCTURE§4.3.2

稀疏矩陣的順序表示#include<iostream.h>template<classT>classSeqTriple{public: SeqTriple(intmSize); ~SeqTriple(){delete[]trip;};

voidAdd(constSeqTriple<T>&B,SeqTriple<T>&C)const;

voidMul(constSeqTriple<T>&B,SeqTriple<T>&C)const;

voidTranspose(SeqTriple<T>&B)const; friendistream&operator>>(istream&input, constSeqTriple<T>&); friendostream&operator<<(ostream&output,

constSeqTriple<T>&);private:

intmaxSize;//最大元素個數(shù)

intm,n,t;//行數(shù)、列數(shù)和非零元素個數(shù)

Term<T>*trip;//動態(tài)一維數(shù)組的指針};行三元組表的C++類DATASTRUCTURE§4.3.2

稀疏矩陣的順序表DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊矩陣2稀疏矩陣3字符串4數(shù)組1特殊矩陣2稀疏矩陣3字符串4DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊DATASTRUCTURE§4.4.1

字符串ADT字符串的定義字符串(簡稱為串)是由n(≥0)個字符組成的有限序列。S=“a0

a1…an-1”(n≥0)其中,S

是串名,單引號括起來的字符序列是串S的值。n是串中字符個數(shù),又稱串長度,n=0的串稱為空串。要注意區(qū)分空串和空白串。串中任意連續(xù)個字符組成的子序列稱為該串的子串,包含子串的串稱為主串。通常以子串的首字符在主串中的位置作為子串在主串中的位置。

S=“abcabcaabcbcde”

P=“aabc”DATASTRUCTURE§4.4.1

字符串ADT字符DATASTRUCTURE§4.4.1

字符串ADT字符串ADTADTString{數(shù)據(jù):字符串是由n(≥0)個字符組成的有限序列

S

=

“a0a1…an-1”,0

i

<n。運算:

Create():建立一個空串。Destroy():撤消一個串。Length():返回當前串對象的長度。Clear():置為空串。

Assign(S):串S的值賦給當前串對象。

Concat(b):將串b連接在當前串對象之后。DATASTRUCTURE§4.4.1

字符串ADT字符DATASTRUCTURE§4.4.1

字符串ADTInsert(P,i):將串P插在當前串對象的位置i處。

Delete(i,len):從當前串對象的位置i起刪除len個字符。

Substr(i,len):返回當前串對象中,從位置i開始的len個字符組成的子串。Find(i,P):返回子串P在當前串對象中的位置。若當前串對象不包含串P,則返回-1。}DATASTRUCTURE§4.4.1

字符串ADTDATASTRUCTURE§4.4.2

字符串的存儲表示順序表示串的順序表示可用C++的一維字符數(shù)組來描述。

#include<string.h>chars[20]=“cdabcde“;鏈接表示…ABCI∧firstfirstABCDEFGHI∧\0

DATASTRUCTURE§4.4.2

字符串的存儲表示DATASTRUCTURE§4.4.2

字符串的存儲表示#include<string.h>classString{public: String();String(const

char*p);~String(){delete[]str;} intFind(inti,String&P);private:

intn;//當前串長

char*str;//動態(tài)一維字符數(shù)組的指針};String::String(const

char*p){ n=strlen(p);str=newchar[n+1];strcpy(str,p);}DATASTRUCTURE§4.4.2

字符串的存儲表示DATASTRUCTURE§4.4.2

字符串的存儲表示C語言中字符串操作函數(shù)函數(shù)原型:char*strdup(constchar*s)函數(shù)功能:字符串拷貝,目的空間由該函數(shù)分配函數(shù)返回:指向拷貝后的字符串指針函數(shù)原型:char*strcpy(char*str1,char*str2);函數(shù)功能:把str2指向的字符串拷貝到str1中去函數(shù)返回:返回str1,即指向str1的指針函數(shù)原型:char*strncpy(char*dest, constchar*src,intcount)

函數(shù)功能:將字符串src中的count個字符拷貝到字符串dest中去函數(shù)返回:指向dest的指針函數(shù)原型:unsignedintstrlen(char*str);函數(shù)功能:統(tǒng)計字符串str中字符的個數(shù)(不包括終止符''\0'')函數(shù)返回:返回字符串的長度.DATASTRUCTURE§4.4.2

字符串的存儲表示DATASTRUCTURE§4.4.2

字符串的存儲表示C語言中字符串操作函數(shù)函數(shù)原型:

char*strchr(char*str,charch);函數(shù)功能:找出str指向的字符串中第一次出現(xiàn)字符ch的位置函數(shù)返回:返回指向該位置的指針,如找不到,則返回空指針函數(shù)原型:char*

strrchr(constchar*s,intc)函數(shù)功能:得到字符串s中最后一個含有c字符的位置指針函數(shù)返回:位置指針函數(shù)原型:char*strstr(char*str1,char*str2);函數(shù)功能:找出str2字符串在str1字符串中第一次出現(xiàn)的位置(不包括str2的串結束符)函數(shù)返回:返回該位置的指針,如找不到,返回空指針函數(shù)原型:char*strpbrk(constchar*s1,constchar*s2)

函數(shù)功能:得到s1中第一個“同時也出現(xiàn)在s2中”字符的位置指針函數(shù)返回:位置指針DATASTRUCTURE§4.4.2

字符串的存儲表示DATASTRUCTURE§4.4.2

字符串的存儲表示C語言中字符串操作函數(shù)函數(shù)原型:char*

strnset(char*

s,intch,size_tn)函數(shù)功能:將字符串s中前n個字符設置為ch的值函數(shù)返回:指向s的指針函數(shù)原型:char*

strset(char*s,intch)函數(shù)功能:將字符串s中所有字符設置為ch的值函數(shù)返回:指向s的指針函數(shù)原型:char*

strupr(char*s)

函數(shù)功能:將字符串s中的字符變?yōu)榇髮懞瘮?shù)返回:指向s的指針函數(shù)原型:char*

strlwr(char*s)

函數(shù)功能:將字符串中的字符變?yōu)樾懽址瘮?shù)返回:指向s的指針DATASTRUCTURE§4.4.2

字符串的存儲表示DATASTRUCTURE§4.4.2

字符串的存儲表示C語言中字符串操作函數(shù)還有:intmemcmp(constvoid*s1,constvoid*s2,size_tn)intmemicmp(constvoid*s1,constvoid*s2,size_tn)void*memmove(void*dest,constvoid*src,size_tn)DATASTRUCTURE§4.4.2

字符串的存儲表示DATASTRUCTURE習題

p.52實現(xiàn)書上程序4.1與程序4.2一維數(shù)組類(要求:增加拷貝構造函數(shù),并在main中增加適當測試代碼)===============================================文件名:

D+學號后兩位+姓名+布置作業(yè)日期例如

D01張三0422

工程名:

D+學號后兩位+姓名縮寫+布置作業(yè)日期例如

D01ZS0422最后把debug目錄刪除,打包按文件名發(fā)送===============================================§作業(yè)0422DATASTRUCTURE習題§作業(yè)0422第5講DATASTRUCTURE第5講DATASTRUCTUREDATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊矩陣2稀疏矩陣3字符串4數(shù)組1DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊DATASTRUCTURE§4.1.1

數(shù)組ADT數(shù)組的定義數(shù)組是下標index和值value組成的序對的集合。

(index,value)一維數(shù)組: A={(0,15),(1,24),(2,33),(3,21)}

012315243321DATASTRUCTURE§4.1.1

數(shù)組ADT數(shù)組的DATASTRUCTURE§4.1.1

數(shù)組ADT數(shù)組ADT

ADTArray{數(shù)據(jù):

下標index和元素值value組成的數(shù)據(jù)對集合,其中任意兩個數(shù)據(jù)對的下標index各不相同。運算:

Create():建立一個數(shù)組。

Retrieve(i):返回下標為i的元素值。

Store(i,x):將下標為i的數(shù)據(jù)對的值置為x。};

DATASTRUCTURE§4.1.1

數(shù)組ADT數(shù)組ADATASTRUCTURE§4.1.2

數(shù)組的順序表示一維數(shù)組的順序表示

loc(a[i])

=

loc(a[0])+i*k

(

i

=

0,

1,

2,

…,

n-1

)基地址:loc(a[0])每個元素占

k個存儲單元。

template<classT>A[]={a0,a1,…,ai,…,an-1};

pA=newT[100];//然后賦值Tb1=pA[i];//獲取第i個元素Tb2=*(pA+i);//獲取第i個元素DATASTRUCTURE§4.1.2

數(shù)組的順序表示一DATASTRUCTURE§4.1.2

數(shù)組的順序表示二維數(shù)組的順序表示二維數(shù)組a[m][n]映射到一維的存儲空間時有兩種順序:行優(yōu)先和列優(yōu)先。大多數(shù)語言如PASCAL、BASIC、C、C++等都是按行優(yōu)先順序存儲的,F(xiàn)ORTRAN是按列優(yōu)先順序存儲的。A[m][n]={{a0,0,a0,1,…a0,n-1},…,{ai,0,ai,1,…ai,n-1},…,{am-1,0,am-1,1,…am-1,n-1}};C/C++行優(yōu)先的存儲方法DATASTRUCTURE§4.1.2

數(shù)組的順序表示二DATASTRUCTURE§4.1.2

數(shù)組的順序表示二維數(shù)組的順序表示

loc(a[i][j])=loc(a[0][0])+(i*n+j)*k

(0i<m;0j<n)基地址:loc(a[0][0])每個元素占

k個存儲單元。

DATASTRUCTURE§4.1.2

數(shù)組的順序表示二DATASTRUCTURE§4.1.2

數(shù)組的順序表示C/C++中申請二維數(shù)組的方法:introw=3,col=4;//方法1:=====================================intMtrx[row][col]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};//方法2:=====================================int**ppMtrx=new

int*[row];for(inti=0;i<row;i++) ppMtrx[i]=new

int[col];intn=0;for(i=0;i<row;i++)

for(intj=0;j<col;j++) ppMtrx[i][j]=++n;for(i=0;i<row;i++)

delete[]ppMtrx[i];delete[]ppMtrx;申請指針數(shù)組再為指針數(shù)組申請空間為二維數(shù)組賦值刪除二維數(shù)組DATASTRUCTURE§4.1.2

數(shù)組的順序表示DATASTRUCTURE§4.1.2

數(shù)組的順序表示//方法3:=====================================#definerow3#definecol4typedefintMtrx[row];

main(){

intn=0;

Mtrx*pMtrx=newMtrx[col];//用法與二維數(shù)組相同

for(inti=0;i<row;i++)

for(intj=0;j<col;j++) pMtrx[i][j]=++n;

delete[]pMtrx;}

定義二維數(shù)組將數(shù)組定義為數(shù)據(jù)類型DATASTRUCTURE§4.1.2

數(shù)組的順序表示/DATASTRUCTURE§4.1.2

數(shù)組的順序表示多維數(shù)組的順序表示推廣到多維數(shù)組a[m1][m2]…[mn],數(shù)組元素a[i1][i2]…[in]的存儲地址為:

loc(a[i1][i2]…[in])=

loc(a[0]…[0])+(i1*m2*m3*…*mn+i2*m3*m4*…*mn+…+in-1*mn+in)*k

=DATASTRUCTURE§4.1.2

數(shù)組的順序表示多DATASTRUCTURE§4.1.3

一維數(shù)組的C++類用C++的模板類定義的一維數(shù)組抽象數(shù)據(jù)類型。公有成員函數(shù)包括:

構造函數(shù)析構函數(shù)重載下標操作符:[]

重載下標操作符用來返回指向第i個元素的引用

重載數(shù)組賦值:=

賦值操作符實現(xiàn)數(shù)組的整體賦值。DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTURE§4.1.3

一維數(shù)組的C++類#include<assert.h>template<classT>classArray1D{public:Array1D(intsz=0);~Array1D(){delete[]elements;}T&operator[](inti)const;Array1D<T>&operator=(constArray1D<T>&r);friendistream&operator>>(istream&in,Array1D<T>&r);friendostream&operator<< (ostream&out,constArray1D<T>&r);private:

intsize; T*elements;};取元素值整體賦值缺少拷貝構造函數(shù)!DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTURE§4.1.3

一維數(shù)組的C++類構造函數(shù),申請數(shù)組空間template<classT>Array1D<T>::Array1D(intsz){

assert(sz>=0);//越界檢查

size=sz; elements=newT[sz];}運算符[],獲取第i個元素template<classT>T&Array1D<T>::operator[](inti)const{

assert(i>=0&&i<size);//越界檢查

returnelements[i];}

DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTURE§4.1.3

一維數(shù)組的C++類重載運算符=

template<classT>Array1D<T>&Array1D<T>::operator=(constArray1D<T>&r)

//數(shù)組r整體賦值給this{

if(this!=&r){//防止自我賦值

size=r.size;

delete[]elements;//釋放原空間

elements=newT[size];//重新分配空間

for(inti=0;i<size;i++) elements[i]=r.elements[i];}

return*this;}DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTURE§4.1.3

一維數(shù)組的C++類重載流運算符>>和<<template<classT>istream&operator>>(istream&in,Array1D<T>&r){

cout<<"Intputarray\n";

for(inti=0;i<r.size;i++)in>>r.elements[i];

returnin;}template<classT>ostream&operator<<(ostream&out,constArray1D<T>&r){

cout<<"Array=";

for(inti=0;i<r.size;i++)out<<r.elements[i]<<''; out<<endl; returnout;}

DATASTRUCTURE§4.1.3

一維數(shù)組的C++DATASTRUCTUREmain中測試該類的效果#include"array1d.h"main(){Array1D<int>a(5),b(8); Array1D<int>c;//采用缺省長度0

cin>>a;cout<<"a"<<a;

cin>>b;cout<<"b"<<b;

cout<<"c"<<c;

cout<<"a[0]="<<a[0]<<“;“<<"b[5]="<<b[5]<<endl;c=b;cout<<"c=b,c"<<c;b=a;cout<<"b=a,b"<<b;}§4.1.3

一維數(shù)組的C++類DATASTRUCTUREmain中測試該類的效果§4.1DATASTRUCTURE§1

C++中有關數(shù)組的類classArray{public: Array(intsize=0,char*ptr=NULL);

//defaultconstructor Array(constArray&);//copyconstructor ~Array();//destructor

char*getPtr()const{returnm_ptr;}

voidSetArray(intsize,char*ptr);private:

int*m_ptr;//pointertothe //firstelementofthearray.

intm_size;};DATASTRUCTURE§1

C++中有關數(shù)組的類cDATASTRUCTURE§1

C++中有關數(shù)組的類Array::Array(intsize,char*ptr/*=NULL*/){m_ptr=NULL; SetArray(size,ptr);}Array::Array(constArray&ar){SetArray(ar.m_size,ar.m_ptr);}Array::~Array(){if(m_ptr!=NULL)delete[]m_ptr;}voidArray::SetArray(intsize,char*ptr)

//有問題的函數(shù)!{m_size=size;m_ptr=ptr;}淺拷貝!要改成深拷貝。DATASTRUCTURE§1

C++中有關數(shù)組的類ADATASTRUCTURE§1

C++中有關數(shù)組的類#include<iostream.h>#include<string.h>main(){

charstr[9]; strcpy(str,“Software”);

//注意:此處不能用char*str=”Software”;//因為這樣的字符串是只讀的。 Arrayar1(8,str); Arrayar2(ar1);

//調用拷貝構造函數(shù),其中調用了SetArray() str[0]=‘6’;//改變數(shù)組內容

cout<<ar1.getPtr()<<“”;

cout<<ar2.getPtr()<<endl;}輸出:6oftware6oftware淺拷貝的后果。DATASTRUCTURE§1

C++中有關數(shù)組的類#DATASTRUCTURE§1

C++中有關數(shù)組的類voidArray::SetArray(intsize,char*ptr){

if(size==0||ptr==NULL)return;

if(m_ptr!=NULL)delete[]m_ptr;

//釋放原數(shù)組

m_size=size; m_ptr=new

char[size];//申請新的空間

strncpy(m_ptr,ptr,size);//拷貝}

輸出:Software6oftwareDATASTRUCTURE§1

C++中有關數(shù)組的類vDATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊矩陣2稀疏矩陣3字符串4數(shù)組1特殊矩陣2DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊DATASTRUCTURE§4.2.1

對稱矩陣對稱矩陣和三角矩陣在n×n的矩陣A中,若aij=aji(0<i,j<n),則稱其為n階對稱矩陣。對于對稱矩陣,可以只存儲上三角(或下三角)中的元素(包括對角線上的元素)。DATASTRUCTURE§4.2.1

對稱矩陣對稱矩陣DATASTRUCTURE§4.2.1

對稱矩陣如果采用二維數(shù)組,n維對稱矩陣的元素為n2。如果只存儲三角中元素,則元素個數(shù)為

n(n+1)/2其中行列序號與元素序號的對應關系:0123…num-1a0,0a1,0a1,1a2,0…an-1,0…an-1,n-1DATASTRUCTURE§4.2.1

對稱矩陣如果采用DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊矩陣2稀疏矩陣3字符串4數(shù)組1特殊矩陣2稀疏矩陣3DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊DATASTRUCTURE§4.3.1

稀疏矩陣ADT稀疏矩陣大多數(shù)元素為零的矩陣稱為稀疏矩陣。對于稀疏矩陣可只存非零元素。DATASTRUCTURE§4.3.1

稀疏矩陣ADT稀DATASTRUCTURE§4.3.1

稀疏矩陣ADT稀疏矩陣ADT

ADTSparseMatrix{數(shù)據(jù):絕大多數(shù)元素為零的矩陣。運算:

Create():建立一個稀疏矩陣。

Destroy():撤消一個稀疏矩陣。

Add(B,C):當前矩陣對象與B相加,C中返回相加和。

Mul(B,C):當前矩陣對象與B相乘,C中返回相乘積。

Transpose(B):B中返回當前矩陣對象的轉置矩陣。}

DATASTRUCTURE§4.3.1

稀疏矩陣ADT稀DATASTRUCTURE§4.3.1

稀疏矩陣ADT#include<iostream.h>template<classT>classSparseMatrix{public: SparseMatrix(intmaxRowSize,intmaxColSize){} ~SparseMatrix(){}

virtualvoidAdd(constSparseMatrix<T>&B,SparseMatrix<T>&C)const;

virtualvoidMul(constSparseMatrix<T>&B,SparseMatrix<T>&C)const;

virtualvoidTranspose(SparseMatrix<T>&B)const;private:

intmaxRows,maxCols;};稀疏矩陣的C++類DATASTRUCTURE§4.3.1

稀疏矩陣ADT#DATASTRUCTURE§4.3.2

稀疏矩陣的順序表示三元組表示法按照壓縮存儲的思想,稀疏矩陣Am

n中的每一個非零元素aij

的值、行號和列號可以用一個三元組(i,j,v)表示。三元組可以按行或按列的順序存儲。三元組的Term類template

<classT>structTerms{

introw,col;Tvalue;};DATASTRUCTURE§4.3.2

稀疏矩陣的順序表DATASTRUCTURE§4.3.2

稀疏矩陣的順序表示0016032205-16111212323-840916215DATASTRUCTURE§4.3.2

稀疏矩陣的順序表DATASTRUCTURE§4.3.2

稀疏矩陣的順序表示#include<iostream.h>template<classT>classSeqTriple{public: SeqTriple(intmSize); ~SeqTriple(){delete[]trip;};

voidAdd(constSeqTriple<T>&B,SeqTriple<T>&C)const;

voidMul(constSeqTriple<T>&B,SeqTriple<T>&C)const;

voidTranspose(SeqTriple<T>&B)const; friendistream&operator>>(istream&input, constSeqTriple<T>&); friendostream&operator<<(ostream&output,

constSeqTriple<T>&);private:

intmaxSize;//最大元素個數(shù)

intm,n,t;//行數(shù)、列數(shù)和非零元素個數(shù)

Term<T>*trip;//動態(tài)一維數(shù)組的指針};行三元組表的C++類DATASTRUCTURE§4.3.2

稀疏矩陣的順序表DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊矩陣2稀疏矩陣3字符串4數(shù)組1特殊矩陣2稀疏矩陣3字符串4DATASTRUCTURE第4章數(shù)組和字符串數(shù)組1特殊DATASTRUCTURE§4.4.1

字符串ADT字符串的定義字符串(簡稱為串)是由n(≥0)個字符組成的有限序列。S=“a0

a1…an-1”(n≥0)其中,S

是串名,單引號括起來的字符序列是串S的值。n是串中字符個數(shù),又稱串長度,n=0的串稱為空串。要注意區(qū)分空串和空白串。串中任意連續(xù)個字符組成的子序列稱為該串的子串,包含子串的串稱為主串。通常以子串的首字符在主串中的位置作為子串在主串中的位置。

S=“abcabcaabcbcde”

P=“aabc”DATASTRUCTURE§4.4.1

字符串ADT字符DATASTRUCTURE§4.4.1

字符串ADT字符串ADTADTString{數(shù)據(jù):字符串是由n(≥0)個字符組成的有限序列

S

=

“a0a1…an-1”,0

i

<n。運算:

Create():建立一個空串。Destroy():撤消一個串。Length():返回當前串對象的長度。Clear():置為空串。

Assign(S):串S的值賦給當前串對象。

Concat(b):將串b連接在當前串對象之后。DATASTRUCTURE§4.4.1

字符串ADT字符DATASTRUCTURE§4.4.1

字符串ADTInsert(P,i):將串P插在當前串對象的位置i處。

Delete(i,len):從當前串對象的位置i起刪除len個字符。

Substr(i,len):返回當前串對象中,從位置i開始的len個字符組成的子串。Find(i,P):返回子串P在當前串對象中的位置。若當前串對象不包含串P,則返回-1。}DATASTRUCTURE§4.4.1

字符串ADTDA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論