一.简述
传说Lisp的基本数据结构就是广义表,广义表也是具有典型递归属性的数据结构,此外,由于建表要处理字符串,用C语言处理起来也是一脸懵逼.....最后自己还想写一个将广义表还原成字符串的函数,一是使其可视化,而是验证算法5.6。花了不少功夫才写出来(强烈建议自己动手写一写),最后是借助树形结构的角度才找到一个不错的解决办法。按照《数据结构编程实验》的分类,数据结构无非线性结构、树状结构、图结构,可以说树是特殊的图(图的最小生成树),线性表示特殊的树。。。。。扯远了!
二.头文件
补充版字符串处理头文件
1 //4_2_part1.h 2 /** 3 author:zhaoyu 4 */ 5 //2016-6-10 6 //----串的定长顺序存储表示---- 7 #ifndef _4_2_PART1_H_ 8 #define _4_2_PART1_H_ 9 #include "head.h" 10 #define MAXSTRLEN 255//用户可以在255以内定义最大串长 11 //这语法还不是很熟悉 12 typedef unsigned char SString[MAXSTRLEN+1];//0 号单元存放串的长度 13 int StrLength(SString T) 14 { 15 for (int i = 1; i <= MAXSTRLEN; ++i) 16 { 17 if ('\0' == T[i]) 18 { 19 return i-1; 20 } 21 } 22 return MAXSTRLEN; 23 } 24 25 /** 26 algorithm 4.2 27 */ 28 Status Concat(SString &T, SString S1, SString S2) 29 { 30 //用 T 返回由 S1 和 S2 连接而成的新串。 31 //若未截断,则返回 TRUE,否则返回 FALSE 32 Status uncut; 33 if (S1[0] + S2[0] < MAXSTRLEN) 34 {//未截断 35 int i = 1; 36 for (i = 1; i <= S1[0]; ++i) 37 { 38 T[i] = S1[i]; 39 } 40 for (i = 1; i <= S2[0]; ++i) 41 { 42 T[S1[0]+i] = S2[i]; 43 } 44 T[0] = S1[0] + S2[0]; 45 uncut = TRUE; 46 } 47 else if (S1[0] < MAXSTRLEN) 48 { 49 int i = 1; 50 for (i = 1; i <= S1[0]; i++) 51 { 52 T[i] = S1[i]; 53 } 54 for (i = S1[0]+1; i <= MAXSTRLEN; i++) 55 { 56 T[i] = S2[i-S1[0]]; 57 } 58 T[0] = MAXSTRLEN; 59 uncut = FALSE; 60 } 61 else 62 { 63 for (int i = 1; i <= MAXSTRLEN; i++) 64 { 65 T[i] = S1[i]; 66 } 67 T[0] = S1[0] = MAXSTRLEN; 68 uncut = FALSE; 69 } 70 return uncut; 71 } 72 /** 73 algorithm 4.3 74 */ 75 Status SubString(SString &Sub, SString S, int pos, int len) 76 { 77 //用 Sub 返回串 S 的第 pos 个字符起长度为 len 的字串 78 //其中, 1<= pos <<= SreLength(S) 且 0 <= len <= StrLength(S)-pos+1 79 if (pos < 1 || pos > S[0] || len < 0 || len > S[0]-pos+1) 80 { 81 return ERROR; 82 } 83 for (int i = 1; i <= len; i++) 84 { 85 Sub[i] = S[i+pos-1]; 86 } 87 Sub[len+1] = '\0'; 88 Sub[0] = len; 89 return OK; 90 } 91 /** 92 add for chapter 5 / page 116.117 93 */ 94 Status StrCompare(SString S, SString T) 95 { 96 for (int i = 1; i <= S[0] && i <=T[0]; i++) 97 { 98 if (S[i]-T[i] > 0){ 99 return 1; 100 } 101 if (S[i]-T[i] < 0) 102 { 103 return -1; 104 } 105 } 106 if (S[0] == T[0]) 107 { 108 return 0; 109 } 110 return S[0]>T[0]?1:-1; 111 } 112 Status StrEmpty(SString S) 113 { 114 if (0 == StrLength(S)) 115 { 116 return TRUE; 117 } 118 else 119 { 120 return FALSE; 121 } 122 } 123 Status StrCopy(SString &T, SString S) 124 {//健壮性并不够 125 for (int i = 0; i <= S[0]+1; i++) 126 { 127 T[i] = S[i]; 128 } 129 return OK; 130 } 131 Status ClearString(SString S) 132 { 133 S[0] = 0; 134 S[1] = '\0'; 135 return OK; 136 } 137 void PrintSString(SString T) 138 { 139 //if(T[]) 140 for (int i = 1; i <= T[0]; ++i) 141 { 142 printf("%c", *(T+i)); 143 } 144 printf("\n"); 145 } 146 #endif