//用鍊錶儲存串值時,存在乙個「結點大小」的問題,即每個結點可以存放乙個字元,也可以//存放多個字元
//當結點大小大於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...