一.简述

  传说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
4_2_part1.h

相关文章:

  • 2021-12-15
  • 2021-10-21
  • 2021-11-21
  • 2022-12-23
  • 2022-01-24
  • 2021-09-24
  • 2021-05-17
  • 2022-01-02
猜你喜欢
  • 2021-12-28
  • 2022-12-23
  • 2021-05-30
  • 2022-12-23
  • 2022-12-23
  • 2021-12-25
  • 2021-12-15
相关资源
相似解决方案