看数据结构写代码(17) 串的堆式存储

在写这个串的定义的时候,,觉得 有几点问题:1.各种释放内存, 2. 操作的效率 和步骤有点麻烦 3. 各种出错。

希望以后完善,

欢迎指出代码不足

// seqString.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <stdlib.h>enum E_State{E_State_Error = 0,E_State_Ok,};struct String{char * base;int len;//串长度};void StringInit(String * s){s->base = NULL;s->len = 0;}void StringClear(String * s){s->base = NULL;s->len = 0;}void StringDestory(String * s){free(s->base);StringClear(s);}E_State StringAssign(String * to,const char * from){int len = 0;const char * p = from;while (*p != '\0') {len++,p++;}free(to->base);if (len != 0){to->base = (char *)malloc(sizeof(char)*len);if (to->base == NULL){return E_State_Error;}//赋值..for (int i = 0; i < len; i++) to->base[i] = from[i];to->len = len;}else{StringClear(to);}return E_State_Ok;}int StringLen(String s){return s.len;}bool StringEmpty(String s){return s.len == 0 ? true : false;}E_State StringCopy(String * to,String from){int len = from.len;free(to->base);if (len != 0){to->base = (char *)malloc(sizeof(char)*len);if (to->base == NULL){return E_State_Error;}//赋值..for (int i = 0; i < len; i++) to->base[i] = from.base[i];to->len = len;}else{StringClear(to);}return E_State_Ok;}int StringCmp(String s1,String s2){int len1 = s1.len;int len2 = s2.len;for (int i = 0; i < len1 && i < len2; i++){char c1 = s1.base[i];char c2 = s2.base[i];if (c1 != c2 ){return c1 – c2;}}return len1 – len2;}E_State StringConcat(String * dst,String src1,String src2){int len = src1.len + src2.len;free(dst->base);if (len != 0){dst->base = (char *) malloc(sizeof(char) * len);if (dst->base == NULL){return E_State_Error;}//赋值..int i = 0;for (; i < src1.len; i++) dst->base[i] = src1.base[i];for (i = 0; i < src2.len; i++) dst->base[src1.len+i] = src2.base[i];dst->len = len;}else{StringClear(dst);}return E_State_Ok;}E_State StringSubString(String src,int pos,int len,String * sub){int stringLen = src.len;if (pos < 1 || pos > stringLen || len < 0 || len > stringLen – pos + 1){return E_State_Error;}free(sub->base);if (len == 0){StringClear(sub);}else{sub->base = (char *) malloc(sizeof(char) * len);if (sub->base == NULL){return E_State_Error;}for (int i = 0; i < len; i++) sub->base[i] = src.base[pos-1+i];sub->len = len;}return E_State_Ok;}int StringIndex(String s,String sub,int pos){if (pos >= 1){for (int i = pos; i <= s.len – sub.len + 1; i++){String subStr;StringInit(&subStr);StringSubString(s,i,sub.len,&subStr);if (StringCmp(sub,subStr) == 0){return i;}}}return 0;}E_State StringInsert(String * s,int pos,String insert){if (pos >= 1){s->base = (char*)realloc(s->base,sizeof(char)* (s->len + insert.len));if (s->base == NULL){return E_State_Error;}for (int i = s->len – 1; i >= pos -1; i–)//后退{s->base[i+insert.len] = s->base[i];}for (int i = 0; i < insert.len; i++)//拷贝{s->base[pos-1+i] = insert.base[i];}s->len += insert.len;}return E_State_Ok;}E_State StringDelete(String * s,int pos,int len){if (pos < 1 || pos > s->len || pos+len-1 > s->len){return E_State_Error;}for (int i = pos+len-1; i < s->len; i++){s->base[i-len] = s->base[i];}s->len -= len;return E_State_Ok;}E_State StringReplace(String * s,String find,String replace){if (find.len > 0){for (int i = 1; i <= s->len – find.len + 1;){int index = StringIndex(*s,find,i);if (index == 0){break;}else{i = index + find.len;}StringDelete(s,index,find.len);StringInsert(s,index,replace);}}return E_State_Ok;}void StringTraverse(String s){printf("——-遍历开始————-\n");for (int i = 0; i < s.len; i++){printf("%c",s.base[i]);}printf("\n——-遍历结束————-\n");}int _tmain(int argc, _TCHAR* argv[]){String test1,test2;StringInit(&test1);StringInit(&test2);StringAssign(&test1,"Hello,World!");StringTraverse(test1);StringCopy(&test2,test1);StringConcat(&test2,test1,test1);StringInsert(&test2,2,test1);StringTraverse(test2);StringDelete(&test2,3,test1.len);StringTraverse(test2);printf("index : %d\n",StringIndex(test2,test1,1));String test3;StringInit(&test3);StringAssign(&test3,"test");StringReplace(&test2,test1,test3);StringTraverse(test2);//最后释放内存StringDestory(&test2);StringDestory(&test1);return 0;}

最糟糕的行为是抱怨,最易见效 的努力是从自己做起。

看数据结构写代码(17) 串的堆式存储

相关文章:

你感兴趣的文章:

标签云: