小螞蟻學習數據結構(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
數據結構

相關文章
相關標籤/搜索