串的块链存储c语言栈,小蚂蚁学习数据结构(18)——串的块链的代码实现
感覺上塊鏈的代碼實現比數組的代碼實現要難一些,估計因為數組的實現書上有偽代碼,而塊鏈連偽代碼都木有,不過歸根到底還是水平不行……哭瞎……╥﹏╥...
/*
數據結構C語言版?串的塊鏈存儲表示和實現
*/
#?include?
#?include?
#?include?
/*?鏈表元素結構體?*/
typedef?struct?List
{
//數據域
char?data;
//指針域
struct?List?*?pNext;
}List,?*?PLIST;
/*?串結構體?*/
typedef?struct?String
{
PLIST?pHead,?pTail;
int?length;
}STRING,?*?PSTRING;
/*?函數前置聲明?*/
/*?初始化一個串?*/
void?InitString(?PSTRING?);
/*?為一個串賦值?*/
bool?StrAssign(?PSTRING,?char?*?);
/*?遍歷這個塊鏈串?*/
void?TravelerString(?PSTRING?);
/*?返回串的長度?*/
int?StrLength(?PSTRING?);
/*?拷貝一個串?*/
bool?StrCopy(?PSTRING,?PSTRING?);
/*?拼接兩個串常量編程一個塊鏈?*/
bool?Concat(?PSTRING,?char?*,?char?*?);
/*?初始化這個串?*/
void?InitString(?PSTRING?str?)
{
str?->?pHead??=?NULL;
str?->?pTail??=?NULL;
str?->?length?=?0;
}
/*
復制一個串常量
*/
bool?StrAssign(?PSTRING?str,?char?*?arr?)
{
int?i,?j;
PLIST?p,?q;
//串常量的長度
for(?i?=?0;?arr[i]?!=?'\0';?++i);
str?->?length?=?i;
for(?j?=?0;?j?
{
//如果j?等于?0,說明是首節點
if(?0?==?j?)
{
p?=?(?PLIST?)malloc(?sizeof(?List?)?);
if(?NULL?==?p?)
{
printf("動態內存分配失敗\n");
return?false;
}
p?->?data?=?arr[j];
p?->?pNext?=?NULL;
str?->?pHead?=?p;
}
else
{
q?=?(?PLIST?)malloc(?sizeof(?List?)?);
if(?NULL?==?q?)
{
printf("動態內存分配失敗\n");
return?false;
}
q?->?data?=?arr[j];
q?->?pNext?=?NULL;
p?->?pNext?=?q;
p?=?q;
}
}
str?->?pTail?=?p;
return?true;
}
/*?打印出這個串?*/
void?TravelerString(?PSTRING?str?)
{
PLIST?p?=?str?->?pHead;
while(?NULL?!=?p?)
{
printf(?"%c?",?p?->?data?);
p?=?p?->?pNext;
}
printf("\n");
}
/*?返回串的長度?*/
int?StrLength(?PSTRING?str?)
{
return?str?->?length;
}
/*?拷貝一個串的長度?*/
bool?StrCopy(?PSTRING?str,?PSTRING?str1?)
{
PLIST?p,?q,?r;
r?=?str1?->?pHead;
str?->?length?=?str1?->?length;
while(?NULL?!=?r?)
{
if(?r?==?str1?->?pHead?)
{
p?=?str?->?pHead?=?(?PLIST?)malloc(?sizeof(?List?)?);
p?->?data?=?r?->?data;
p?->?pNext?=?NULL;
r?=?r?->?pNext;
}
else
{
q?=??(?PLIST?)malloc(?sizeof(?List?)?);
q?->?data?=?r?->?data;
q?->?pNext?=?NULL;
p?->?pNext?=?q;
p?=?q;
r?=?r?->?pNext;
}
}
str?->?pTail?=?p;
return?true;
}
/*?拼接兩個字符串常量?*/
bool?Concat(?PSTRING?str,?char?*?s1,?char?*?s2?)
{
STRING?a1,?a2;
InitString(?&a1?);
InitString(?&a2?);
StrAssign(?&a1,?s1?);
StrAssign(?&a2,?s2?);
str?->?pHead?=?a1.pHead;
str?->?pTail?=?a2.pTail;
a1.pTail?->?pNext?=?a2.pHead;
return?true;
}
int?main(?void?)
{
//創建一個串
STRING?str,?str1,?str2;
InitString(?&str?);//初始化這個串
InitString(?&str1?);
InitString(?&str2?);
printf("將字符串常量“abcde”賦值給str\n");
StrAssign(?&str,?"abcde"?);
printf("打印出str的值:");
TravelerString(?&str?);
printf(?"打印出串str的長度:%d\n",?StrLength(?&str?)?);
//拷貝str?到?str1
printf("復制串str到str1,遍歷str1:\n");
StrCopy(?&str1,?&str?);
TravelerString(?&str1?);
//將兩個串常量,拼接成一個串塊鏈
Concat(?&str2,?"hello",?"world"?);
printf("將“hello”“world”拼接成一個新的塊鏈串:\n");
TravelerString(?&str2?);
return?0;
}
/*
在VC++6.0中輸出的結果是:
=============================
將字符串常量“abcde”賦值給str
打印出str的值:a?b?c?d?e
打印出串str的長度:5
復制串str到str1,遍歷str1:
a?b?c?d?e
將“hello”“world”拼接成一個新的塊鏈串:
h?e?l?l?o?w?o?r?l?d
=============================
總結:
無非都是線性表,跟操作線性表的感覺一樣一樣的。
有時間多把線性結構、棧、隊列那里再練練,考試的重點。
*/
扛不住了,我要吐了,不謝了,就這吧,估計考試也不會考這里的大題……
總結
以上是生活随笔為你收集整理的串的块链存储c语言栈,小蚂蚁学习数据结构(18)——串的块链的代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 连接linux工具Mtr,Linux常用
- 下一篇: html盒子居中的方式,CSS盒子居中三