感受上塊鏈的代碼實現比數組的代碼實現要難一些,估計由於數組的實現書上有僞代碼,而塊鏈連僞代碼都木有,不過歸根到底仍是水平不行……哭瞎……╥﹏╥...編程
/* 數據結構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
數據結構