感受上块链的代码实现比数组的代码实现要难一些,估计由于数组的实现书上有伪代码,而块链连伪代码都木有,不过归根到底仍是水平不行……哭瞎……╥﹏╥...编程
/* 数据结构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
数据结构