串的块链存储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

=============================

总结:

无非都是线性表,跟操作线性表的感觉一样一样的。

有时间多把线性结构、栈、队列那里再练练,考试的重点。

*/

扛不住了,我要吐了,不谢了,就这吧,估计考试也不会考这里的大题……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值