串结构的特殊性------结构中的每个数据元素是一个字符,则用链表存储串值时,存在一个“结点大小”的问题,即每个结点可以存放一个字符,也可以存放多个字符。
/* c4-3.h 串的块链存储表示 */
#define CHUNK_SIZE 4 /* 可由用户定义的块大小 */
typedef struct Chunk
{
char ch[CHUNK_SIZE];
struct Chunk *next;
}Chunk;
typedef struct
{
Chunk *head,*tail; /* 串的头和尾指针 */
int curlen; /* 串的当前长度 */
}LString;
/* bo4-3.c 串采用块链存储结构(由c4-3.h定义)的基本操作(15个) */
#define DestroyString ClearString /* DestroyString()与ClearString()作用相同 */
void InitString(LString *T)
{ /* 初始化(产生空串)字符串T。另加 */
(*T).curlen=0;
(*T).head=(*T).tail=NULL;
}
Status StrAssign(LString *T,char *chars)
{ /* 生成一个其值等于chars的串T(要求chars中不包含填补空余的字符)。成功返回OK,否则返回ERROR */
int i,j,k,m;
Chunk *p,*q;
i=strlen(chars); /* i为串的长度 */
if(!i||strchr(chars,blank)) /* 串长为0或chars中包含填补空余的字符 */
return ERROR;
(*T).curlen=i;
j=i/CHUNK_SIZE; /* j为块链的结点数 */
if(i%CHUNK_SIZE)
j++;
for(k=0;k<j;k++)
{
p=(Chunk*)malloc(sizeof(Chunk)); /* 生成块结点 */
if(!p) /* 生成块结点失败 */
return ERROR;
for(m=0;m<CHUNK_SIZE&&*chars;m++) /* 给块结点的数据域赋值 */
*(p->ch+m)=*chars++;
if(k==0) /* 第一个链块 */