《資料結構》 4陣列和字串

2022-08-20 11:42:09 字數 4419 閱讀 3663

下標為i(0≤iloc(arrname[i])=loc(arrname[0])+i*sizeof(elemtype)    (0≤i陣列元素arrname[i][j]的儲存位址loc(arrname[i][j])為

loc(arrname[i][j])=loc(arrname[0][0])+(i*n+j)sizeof(elemtype)    (0≤i三維整型陣列

#include #define error 0

#define ok 1

#define notpresent 2

#define duplicate 3

#define illegalindex 4typedef

intstatus;

typedef

struct

triplearray

triplearray;

status createarray (triplearray *triplearray,int m1,int m2,int

m3)status destroyarray(triplearray *triplearray)

status retrievearray (triplearray triplearray,

int i1,int i2,int i3,int *x)

status storearrayitem(triplearray *triplearray,int i1,int i2,int i3,int

x)void

outputarray(triplearray triplearray)}}

return

ok;}

status copyarray(triplearray *triplearraya,triplearray *triplearrayb)

return

ok;}

void main(void

) outputarray(triplearraya);

outputarray(triplearrayb);

copyarray(&triplearraya,&triplearrayb);

outputarray(triplearraya);

outputarray(triplearrayb);

}

特點aij=aji

儲存的時候,需要約定儲存規則:行優先或列優先

①按行優先順序儲存主對角線(包括對角線)以下的元素

即按 次序存放在乙個向量sa[

0...n(n+1)/2-1]中(下三角矩陣中,元素總數為n(n+1)/2

)。其中:

sa[0]=a0,0

sa[1]=a1,0

……sa[n(n+1)/2-1]=an-1,n-1

②元素aij的存放位置

aij元素前有i行(從第0行到第i-1行),一共有:

1+2+…+i=i×(i+1)/2個元素。

在第i行上, 之前恰有j個元素,即ai0,ai1,…,ai,j-1

,因此有:

sa[i×(i+1)/2+j]=aij

③aij和sa[k]之間的對應關係:

若i≥j,k=i×(i+1)/2+j0≤k1)/2

若i1)/2+i0≤k1)/2

令i=max(i,j),j=min(i,j),則k和i,j的對應關係可統一為:

k=i×(i+1)/2+j0≤k1)/2(3

)對稱矩陣的位址計算公式

loc(aij)=loc(sa[k])

=loc(sa[0])+k×d=loc(sa[0])+[i×(i+1)/2+j]×d

通過下標變換公式,能立即找到矩陣元素aij在其壓縮儲存表示sa中的對應位置k。因此是隨機訪問結構。

【例】a21和a12均儲存在sa[

4]中,這是因為

k=i×(i+1)/2+j=2×(2+1)/2+1=4

上三角矩陣和下三角矩陣

使用三元組ij>,分為行三元組表和列三元組表,分別按照行號和列號從小到大的順序排列。

如果使用基本的轉置演算法,直接對行列進行互換,那麼演算法複雜度為o(m*n)

使用簡單轉置演算法:

依次訪問行三元組,交換元素行列號後,進行儲存。

對新生成的行三元組由小到大排序。

演算法複雜度為o(t2)

第二種簡單轉置演算法:

對行三元組進行掃瞄,掃瞄出列為0的三元組,交換行列號填入三元組表中。

進行第二次掃瞄,掃瞄出列為1的三元組,交換行列號後填入三元組表中。

繼續進行···

演算法複雜度為o(t*n)

借助乙個一維輔助陣列和k。

掃瞄a的行三組表,即統計出a的每一列非零元素數。

借助陣列k,直接將列變為行調到對應的轉置三元組表的格仔。

演算法複雜度為o(m+n)

在此不多做介紹,使用這篇引用的部落格的**。

#include #include 

#include

//sstring是陣列,故不需引用型別

#define ok 1

#define true 1

#define false 0

#define error 0

#define infeasible -1

#define destroystring clearstring //

destroystring()與clearstring()作用相同

#define max_str_len 40 //

使用者可在255(1個位元組)以內定義最大串長

typedef

char sstring[max_str_len+1]; //

0號單元存放串的長度

typedef int status; //

status是函式的型別,其值是函式結果狀態**,如ok等

status strassign(sstring t,

char *chars)

} void

strcopy(sstring t,sstring s)

status strempty(sstring s)

intstrcompare(sstring s,sstring t)

intstrlength(sstring s)

void

clearstring(sstring s)

status concat(sstring t,sstring s1,sstring s2)

//演算法4.2改

else

} status substring(sstring sub,sstring s,

int pos,int

len)

int index(sstring s,sstring t,int

pos)

else

//指標後退重新開始匹配

if(j>t[0

])

return i-t[0

];

else

return

0;

} else

return

0;

}

status strinsert(sstring s,

intpos,sstring t)

else

} status strdelete(sstring s,

int pos,int

len)

status replace(sstring s,sstring t,sstring v)

//此函式與串的儲存結構無關

}while

(i);

return

ok;

}

void

strprint(sstring t)

void get_next(sstring t,int

next)

else

j=next[j];

}

void get_nextval(sstring t,int

nextval)

else

j=nextval[j];

}

int index_kmp(sstring s,sstring t,int pos,int

next)

else

//模式串向右移動

j=next[j];

if(j>t[0]) //

匹配成功

return i-t[0

];

else

return

0;

}

void

main()

資料結構4 陣列與字串

list item 動態陣列vector的使用 好難好難,一臉懵逼.以對角線入手進行觀察 vector int finddiagonalorder vector int matrix 矩陣行列 k用於控制對角線行數的的奇偶 int m matrix.size n matrix 0 size r 0,...

資料結構 陣列,字串

陣列 字串是兩種最基本的資料結構,使用連續記憶體分別存數字和字元,並按照順序儲存。str indexofnew str indexoforiginal str indexofnew str indexoforiginal indexofnew bool duplicate int numbers,i...

資料結構 字串和多維陣列

第 4 章 字串和多維陣列 本章的基本內容是 字串。在程式語言中大都有串變數的概念,而且實現了基本的串操作,本章重點討論串的儲存結構及模式匹配演算法。陣列。在程式語言中大都提供了陣列作為構造資料型別,本章重點討論陣列以及特殊矩陣的儲存與定址。4.1 字串 主要內容 4.11 字串的定義 4.12 字...