串的链式存储表示与实现

头文件:函数的声明

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CHUNKSIZE 10
#define stuff '#'
typedef struct Chunk
{
	char ch[CHUNKSIZE];
	struct Chunk *next;
}Chunk;//串的结点类型定义
typedef struct
{
	Chunk *head;
	Chunk *tail;
	int length;
}LinkString;

void InitString(LinkString *S);//初始化字符串
int StrAssign(LinkString *S,char *cstr);//生成串
int StrEmpty(LinkString S);//判断出串是否为空
int StrLength(LinkString S);//求串长度
int StrCopy(LinkString *T,LinkString S);//串的复制操作
int ToChars(LinkString S,char **cstr);//串的转换操作
int StrCompare(LinkString S,LinkString T);//串的比较操作
int StrConcat(LinkString *T,LinkString S);//串的连接操作
int StrInsert(LinkString *S,int pos,LinkString T);//串的插入操作
int StrDelete(LinkString *S,int pos,int len);//串的删除操作
int SubString(LinkString *Sub,LinkString S,int pos,int len);//取子串操作
void ClearString(LinkString *S);//清空串操作


函数的定义

#include "串.h"

void InitString(LinkString *S)//初始化字符串
{
	S->length = 0;
	S->head = NULL;
	S->tail = NULL;
}
int StrAssign(LinkString *S,char *cstr)//生成串
{
	Chunk *p,*q;
	int i,j,k,len;
	len = strlen(cstr);
	if(!len)
	{
		return 0;
	}
	S->length = len;
	j = len/CHUNKSIZE;
	if(len % CHUNKSIZE)
	{
		j++;
	}
	for(i = 0;i < j;i++)
	{
		p = (Chunk*)malloc(sizeof(Chunk));
		if(!p)
		{
			return 0;
		}
		for(k = 0;k < CHUNKSIZE && *cstr;k++)
		{
			*(p->ch + k) = *cstr++;
		}
		if(0 == i)
		{
			S->head = q;
			q = p;
		}
		else
		{
			q->next = p;
			q = p;
		}
		if(!*cstr)
		{
			S->tail = q;
			q->next = NULL;
			for(;k < CHUNKSIZE;k++)
			{
				*(q->ch + k) = stuff;
			}
		}
	}
	return 1;
}
int StrEmpty(LinkString S)//判断出串是否为空
{
	if(S.length == 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
int StrLength(LinkString S)//求串长度
{
	return S.length;
}
int StrCopy(LinkString *T,LinkString S)//串的复制操作
{
	char *str;
	int flag;
	if(!ToChars(S,&str))
	{
		return 0;
	}
	flag = StrAssign(T,str);
	free(str);
	return flag;
}
int ToChars(LinkString S,char **cstr)//串的转换操作
{
	Chunk *p = S.head ;
	int i;
	char *q;
	*cstr = (char*)malloc((S.length + 1)*sizeof(char));
	if(!cstr||!S.length)
	{
		return 0;
	}
	q = *cstr;
	while(p)
	{
		for(i = 0;i < CHUNKSIZE;i++)
		{
			if(p->ch[i] != stuff)
			{
				*q++ = (p->ch[i]);
			}
		}
		p = p->next ;
	}
	(*cstr)[S.length] = 0;
	return 1;
}
int StrCompare(LinkString S,LinkString T)//串的比较操作
{
	char *p,*q;
	int flag;
	if(!ToChars(S,&p))
	{
		return 0;
	}
	if(!ToChars(T,&q))
	{
		return 0;
	}
	for(;*p != '\0'&&*q != '\0';)
	{
		if(*p == *q)
		{
			p++;
			q++;
		}
		else
		{
			flag = *p - *q;
		}
	}
	free(p);
	free(q);
	if(*p == '\0'||*q == '\0')
	{
		return S.length - T.length ;
	}
	else
	{
		return flag;
	}
}
int StrConcat(LinkString *T,LinkString S)//串的连接操作
{
	int flag1,flag2;
	LinkString S1,S2;
	InitString(&S1);
	InitString(&S2);
	flag1 = StrCopy(&S1,*T);
	flag2 = StrCopy(&S2,S);
	if(flag1 == 0 || flag2 == 0)
	{
		return 0;
	}
	T->head = S1.head ;
	S1.tail->next = S2.head ;
	T->tail = S2.tail ;
	T->length = S1.length + S2.length ;
	return 1;
}
int StrInsert(LinkString *S,int pos,LinkString T)//串的插入操作
{
	char *t1,*s1;
	int i,j;
	int flag;
	if(pos < 1 || pos > S->length-1)
	{
		return 0;
	}
	if(!ToChars(*S,&s1))
	{
		return 0;
	}
	if(!ToChars(T,&t1))
	{
		return 0;
	}
	j = strlen(s1);
	s1 = (char*)realloc(s1,(j+strlen(t1)+1)*sizeof(char));
	for(i = j;i >= pos-1;i--)
	{
		s1[i+strlen(t1)] = s1[i];
	}
	for(i = 0;i <(int)strlen(t1);i++)
	{
		s1[pos+i-1] = t1[i];
	}
	InitString(S);
	flag = StrAssign(S,s1);
	free(s1);
	free(t1);
	return flag;
}
int StrDelete(LinkString *S,int pos,int len)//串的删除操作
{
	char *str;
	int i;
	int flag;
	if(pos < 1 || len < 0 || pos > S->length-len+1)
	{
		return 0;
	}
	if(!ToChars(*S,&str))
	{
		return 0;
	}
	for(i = pos+len-1;i <= (int)strlen(str);i++)
	{
		str[i-len] = str[i];
	}
	InitString(S);
	flag = StrAssign(S,str);
	free(str);
	return flag;
}
int SubString(LinkString *Sub,LinkString S,int pos,int len)
{
	char *t,*str;
	int flag;
	if(pos < 1||pos > S.length||len < 0||len > S.length - pos + 1)
	{
		return 0;
	}
	if(!ToChars(S,&str))
	{
		return 0;
	}
	t = pos+str-1;
	t[len] = '\0';
	flag = StrAssign(Sub,t);
	free(str);
	return flag;
}//取子串操作
void ClearString(LinkString *S)//清空串操作
{
	Chunk *p,*q;
	p = S->head ;
	while(p)
	{
		q = p->next ;
		free(p);
		p = q;
	}
	S->head = NULL;
	S->tail = NULL;
	S->length = 0;
}



  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值