第四章(3) 塊鏈儲存表示

2021-07-02 01:51:44 字數 3053 閱讀 9732

//用鍊錶儲存串值時,存在乙個「結點大小」的問題,即每個結點可以存放乙個字元,也可以

//存放多個字元

//當結點大小大於1時,由於串長不一定是結點大小的整倍數,則鍊錶中的最後乙個節點不一定

//完全被串值佔滿,此時通常補上「#」或其他的非串值字元(「#」是個特殊符號)

#include

#include

#include

#define chunksize 4   //由使用者定義塊的大小

typedef struct  chunk    //鍊錶結點,塊結點

chunk;

typedef struct

lstring;

//一般情況下,對串操作只需要從頭到尾順序掃瞄即可,則對串值不必建立雙向鍊錶

void initlstring(lstring *t)

void strassign(lstring *t, char *chars)

(*t).curlen = i;

j = i/chunksize;      //j為結點數,即為塊數

if(i%chunksize)

for(k = 0; k < j; ++k)

for(m = 0; m < chunksize && *chars; ++m)

if(k == 0)      //第乙個結點(鏈塊)

else            //其他結點(鏈塊)  (包括最後乙個結點)

//跳出原因如果是*chars不存在,則如下。如果是 m = chunksize,則繼續迴圈

if(!*chars)   //最後乙個結點(鏈塊)}}

}void strprint(lstring t)

}p = p->next;

}printf("\n");

}int strlength(lstring t)

int strempty(lstring t)

return 0;

}void clearlstring(lstring *t)

p = (*t).head->next;

for( k = 0 ; k < j -1 ; ++k)

free((*t).head); */

p = (*t).head;  

while(p)

(*t).head = (*t).tail = null;

(*t).curlen = 0;

}//這個函式很重要,因為塊鏈的其他操作如果仍以塊鏈為單位的話,那可想而知會有多複雜,所以必須先把塊鏈的字元轉為字串

int tochars(lstring t,char **chars)  //*chars為字串,再指標*則是為了返回字串首位址

q = *chars;  //q指向chars的第1個字元(注意此處的*chars為指向char的指標位址)

while(p)

}p = p->next;

}(*chars)[t.curlen] = 0;  //串結束,第t.curlen + 1個元素為結束符

return 1;

}void strcopy(lstring *t,lstring s)

// printf("%s\n",*c);

strassign(t,*c);

free(c);

}void concat(lstring *t, lstring sa, lstring sb)

void substring(lstring *sub, lstring t, int pos, int len)

if( pos < 1 || pos >t.curlen || len < 0 || len >t.curlen - pos + 1)

c = ch + pos - 1;    //*c指向串sub的首位址   *c = *ch[pos-1];

c[len] = 0;   //字串中間不允許有『0』,如果遇到,則表示字串結尾。此處直接截掉的len以後的字元。

strassign(sub,c);

free(ch);

}int index(lstring t, lstring s, int pos)

n = t.curlen;

m = s.curlen;

i = pos;

while(i <= n - m + 1)

else

}return 0;

}int strcompare(lstring t,lstring s)

i = strcmp(*c,*ch);

free(c);

free(ch);

return i;

}void strinsert(lstring *t, int pos, lstring s)

if(!tochars((*t),ch) || !tochars(s,c))

//take care!

*ch = (char *)realloc(*ch, ((*t).curlen + s.curlen + 1)*sizeof(char));  //多乙個結束符

if(! *ch)  //分配不成功

for(i = (*t).curlen; i >= pos - 1; --i)

for(i = 0; i < s.curlen; ++i)

initlstring(t);

strassign(t,*ch);

free(ch);

free(c);

}void strdelete(lstring *t,int pos, int len)

if(!tochars(*t,c))

for( i = pos + len - 1; i <= (int)strlen(*c); ++i)  

initlstring(t);   //釋放t的原有儲存空間

strassign(t,*c);   //由*c生成新的串t

free(c);

}void replace(lstring *t,lstring sa,lstring sb)

do}while(i);

}void main(void)

第四章資料儲存

android中的資料傳輸方式有五種,分別是檔案儲存,sharedpreferences,sqlite資料庫,contentprovider以及網路儲存。sharedpreferences是android平台上乙個輕量級的儲存類,用於儲存一些應用程式的配置引數。如使用者名稱密碼等。儲存資料 shar...

第四章棧(3)

3.現實生活中棧的乙個例子是佩茲糖果盒。想象一下你有一盒佩茲糖果,裡面塞滿了紅色 黃色和白色的糖果,但是你不喜歡黃色的糖果。使用棧 有可能用到多個棧 寫一段程式,在不改變盒內其他糖果疊放順序的基礎上,將黃色糖果移出。let candybox new stack candybox.push red c...

第四章儲存器管理

問題 基本分頁機制下,一次指令需兩次記憶體訪問,處理機速度降低1 2,分頁空間效率的提高以如此的速度為代價,得不償失。改進 減少第1步訪問記憶體的時間。增設乙個具有 並行查詢 能力的高速緩衝暫存器,稱為 快表 也稱 聯想暫存器 associative memory ibm系統稱為tlb transl...