小蚂蚁学习数据结构(18)——串的块链的代码实现

    感受上块链的代码实现比数组的代码实现要难一些,估计由于数组的实现书上有伪代码,而块链连伪代码都木有,不过归根到底仍是水平不行……哭瞎……╥﹏╥...编程

/*
	数据结构C语言版 串的块链存储表示和实现
*/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

/* 链表元素结构体 */
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 < i; ++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
	=============================
	总结:
		无非都是线性表,跟操做线性表的感受同样同样的。
		有时间多把线性结构、栈、队列那里再练练,考试的重点。
*/

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


    学PHP的小蚂蚁 博客 http://my.oschina.net/woshixiaomayi/blog
数据结构

相关文章
相关标签/搜索