数据结构C语言实现之串
来源:互联网 发布:linux arp高速缓存表 编辑:程序博客网 时间:2024/05/16 00:58
#include <stdio.h>#include <stdlib.h>#include <string.h>//定义函数结果状态码#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0//定义数据类型//typedef int ElemType ;//定义顺序串空间大小,最多存放40个字符#define STRINGSIZE 20//定义程序返回状态类型typedef int State;// 定义顺序串结构体typedef struct{ char ch[STRINGSIZE];//按串长分配存储空间 int length;//存放串长}String;/*************************************************Function: StrAssignDescription: 生成一个其值等于字符串常量s的串TInput: 串 String T 字符串指针 char *sOutput:Return: 成功返回OK,失败返回ERROROthers:*************************************************/State StrAssign(String *T, char *s){ int i,length = strlen(s); if(length > STRINGSIZE) { printf("The s is too long!"); return ERROR; } for(i = 0; i < length; i++) { T->ch[i] = s[i]; } T->length = length; return OK;}/*************************************************Function: StrCopyDescription: 由串S复制得串TInput: 串 String *T 串 String *SOutput:Return: 成功返回OK,失败返回ERROROthers:*************************************************/State StrCopy(String *T, String *S){ int i,length = S->length; for(i = 0; i < length; i++) T->ch[i] = S->ch[i]; T->length = length; return OK;}/*************************************************Function: StrEmptyDescription: 判断T是否为空串Input: 串 String *TOutput:Return: 为空返回TRUE,不为空返回FALSEOthers:*************************************************/State StrEmpty(String *T){ if(T->length == 0) return TRUE; else return FALSE;}/*************************************************Function: StrCompareDescription: 比较两个非空串的大小Input: 串 String *T 串 String *SOutput:Return: 若S>T,返回值>0, S<T,返回值<0, S=T,返回值=0Others:*************************************************/int StrCompare(String *S,String *T){ int i; //如果有非空串,程序退出,若返回相关标志怕与下面返回的差值冲突 if((S->length == 0) || (T->length == 0)) exit(1); for(i=0;(i<S->length) && (i<T->length);i++) if(S->ch[i] != T->ch[i]) return S->ch[i] - T->ch[i]; return S->length - T->length;}/*************************************************Function: StrLengthDescription: 返回串的长度Input: 串 String *SOutput:Return: intOthers:*************************************************/int StrLength(String *S){ return S->length;}/*************************************************Function: StrClearDescription: 清空串Input: 串 String *SOutput:Return: 成功返回OKOthers:*************************************************/State StrClear(String *S){ S->length = 0; return OK;}/*************************************************Function: ConcatDescription: 用T返回由S1和S2连接而成的串Input: String *T String *S1 String *S2Output:Return: 成功返回OK,若T装不下则装入截断后的内容,返回ERROROthers:*************************************************/State Concat(String *T,String *S1,String *S2){ int i,j; if(S1->length+S2->length <= STRINGSIZE) { for(i=0;i<S1->length;i++) T->ch[i] = S1->ch[i]; for(j=0;j<S2->length;i++,j++) T->ch[i] = S2->ch[j]; T->length = S1->length + S2->length; return OK; } else //截断S2 { for(i=0;i<S1->length;i++) { T->ch[i] = S1->ch[i]; } for(j=0;i < STRINGSIZE;i++,j++) { T->ch[i] = S2->ch[j]; } T->length = STRINGSIZE; return ERROR; }}/*************************************************Function: SubStringDescription: 用Sub返回串S中自pos位置开始长度为len的字串Input: String *Sub String *S int pos pos>=1 && pos<=S->length int len len>=0 && pos+len <= S->length+1 //注意要+1Output:Return: 成功返回OK,pos与len不合适返回ERROROthers:*************************************************/State SubString(String *Sub,String *S,int pos,int len){ int i,j; if((pos>=1 && pos<=S->length) && (len>=0 && len+pos<=S->length+1)) { for(i=0,j=pos-1;i<len;i++,j++) { Sub->ch[i]=S->ch[j]; } Sub->length = len; return TRUE; } return ERROR;}/*************************************************Function: IndexDescription: 若主串S中第pos个字符之后存在与T相等的子串 则返回第一个这样的子串在S中的位置,否则返回0Input: String *S 非空,不做检查 String *T 非空,不做检查 int pos pos>=1 && pos<=S->lengthOutput:Return:Others:*************************************************/int Index(String *S,String *T,int pos){ int m,n,i; String sub; if(pos>0) { n = S->length; m = T->length; i = pos; while(i <= n-m+1) { SubString(&sub,S,i,m); if(0 != StrCompare(&sub,T)) { ++i; } else { return i; } } } return 0;}/*************************************************Function: StrInsertDescription: 在串S的自第pos个字符处插入串TInput: String *S int pos 1<= pos <= S->length+1 String *T 非空Output:Return: 完全插入且原串无溢出返回OK, 部分插入 全部插入但原串溢出 返回ERROROthers: 不满意*************************************************/State StrInsert(String *S,int pos,String *T){ int len=T->length,i,j; //插入位置不合法 if(pos<1 && pos>S->length+1) return ERROR; // 完全插入 if(S->length+len <= STRINGSIZE) { for(i=S->length-1; i >= pos-1; i--) S->ch[i+len]=S->ch[i]; for(i=0; i<len; i++) S->ch[pos-1+i] = T->ch[i]; S->length = S->length+T->length; return TRUE; } else if(pos-1+len <= STRINGSIZE)// 完全插入但原串溢出 { for(i=STRINGSIZE-1-len; i>=pos-1; i--) S->ch[i+len] = S->ch[i]; for(i=0; i<len; i++) S->ch[pos-1+i]=T->ch[i]; S->length = STRINGSIZE; return FALSE; } else //部分插入 { for(i=pos-1,j=0; i<STRINGSIZE; i++,j++) S->ch[i] = T->ch[j]; S->length = STRINGSIZE; return FALSE; }}/*************************************************Function: StrDeleteDescription: 删除串S中从pos位置起长度为len的子串Input: String *S 非空,不判断 int pos pos>0 && pos<=S->length-len+1 int len len>0 && pos<=S->length-len+1Output:Return: 成功返回OK,否则返回ERROROthers:*************************************************/State StrDelete(String *S,int pos,int len){ int i; //验证pos 和 len的范围 if(pos<1 || pos>S->length-len+1 || len<0)return ERROR; for(i=pos-1+len; i<S->length; i++)S->ch[i-len] = S->ch[i];S->length -= len;return OK;}/*************************************************Function: StrDestroyDescription: 销毁串Input: String *S 非空,不判断Output:Return: 成功返回OKOthers:*************************************************/State StrDestroy(String *S){ free(S); return OK;}