下標為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 字...