运行截图。
自己太久没有这样用过指针了,总是用不好~~
下次自己申请了一个指针,就得初始化,不然在判断是否为空的操作下,会导致程序停止运行。(传说中的敲代码5分钟,debug2小时又被我碰上了,泪目)。
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<malloc.h> #define ERROR 0 #define OK 1 #define MAXSIZE 1000 typedef int Status; //------串的堆存储表示-------- typedef struct{ char *ch;若是非空串,则按串长分配存储区,否则ch为NULL int length;串长度 }HString; --------------------------------------基本操作的算法描述--------------------- 生成一个其值等于串常量chars的串T Status StrAssign(HString *T,char *chars) { int i,j; char *c; if(T->ch) free(T->ch);释放T原有的存储空间 for(i = 0,c = chars;*c; c++,i++);求chars串的长度 if(!i) { T->ch = NULL; T->length = 0; } else { T->ch = (char*)malloc(i*sizeof(char)); if(!T->ch) exit(0); j = 0; while(j < i) { T->ch[j] = chars[j++]; } T->length = i; } return OK; } 返回串S的长度 int StrLength(HString S) { return S.length; } 若S>T,返回值>0;若S==T,返回值=0;若S<T,返回值<0 int StrCompare(HString S,HString T) { for(int 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 ; } 用T返回由s1和s2连接而成的新串 Status Contact(HString &T,HString s1,HString s2) { if(T.ch) free(T.ch);释放旧空间 } 清空串S Status ClearString(HString &S) { if(S.ch) { free(S.ch); S.ch = NULL; } S.length = 0; 连接串s1和串s2,用T返回 Status Concat(HString &T,128)">0,0)">释放旧空间 T.ch = (malloc((s1.length + s2.length )*char)); if(!T.ch) exit(0); while(i < s1.length) { T.ch[i] = s1.ch[i++]; } T.length = s1.length + s2.length ; j = while(j < s2.length) { T.ch [i++] = s2.ch[j++]; } 返回串s的第pos个字符起长度为len的子串 Status SubString(HString &sub,HString s,255)">int pos,255)">int len) { if(pos < 1||pos > s.length || len < 0||len > s.length -1) return ERROR; if(sub.ch) free(sub.ch); if(!len)空子串 { sub.ch = NULL; sub.ch = else完整子串 { sub.ch = (malloc(len*while(i < len) { sub.ch[i] = s.ch[pos+i-1]; i++; } sub.length = len; } return OK; } 在S串的第pos个字符前插入串T Status StrInsert(HString &S,255)">int pos,128)">0||pos > S.length-1)pos 不合法 if(T.length)T非空,则重新分配存储空间,插入T { S.ch = (realloc(S.ch,(S.length + T.length)*if(!S.ch) exit(0); int i = S.length-1; i >= pos-1;i--)为插入T 腾出位置 S.ch[i+T.length] = S.ch[i]; 0; i < T.length ; i ++)插入T S.ch[i+pos-1] = T.ch[i]; S.length += T.length ; S.ch[S.length] = '\0'; } int main() { char s1[MAXSIZE],s2[MAXSIZE]; HString SS,T,sub,S1,S2; int flag,pos,len; printf("请输入串S1和串S2\n"); while(scanf(%s %s",s1,s2),s1[0]!=#'&&s2[') { T.ch = SS.ch = NULL; StrAssign(&SS,s1);创建串T StrAssign(&T,s2); 创建串S printf(S串为:\n"); 0;SS.ch[i]!=';i++) printf(%c",SS.ch[i]); printf(\n"); printf(T串为:\n0; T.ch[i]!=';i ++) printf(\n\n"); printf(S串的长度为%d\n\n比较两串 if(flag > 0) printf(S串>T串\n\nelse if(flag == S串=T串\n\nelse printf(S串<T串\n\n"); S1.ch = S2.ch = NULL; StrAssign(&S1,0)">创建串S1 StrAssign(&S2,s2);创建串S2 Concat(T,S2);将串s1和串s2连接 printf(连接后的串T为:\n0;T.ch[i]!=请输入要在S中输出的子串的位置pos和长度\n"); scanf(%d%d返回串s的第pos个字符起长度为len的子串 printf(子串为:\n0; sub.ch[i]!="); StrInsert(SS,T);在串S的第pos个位置前插入串T printf(在第%d个位置前入串T后的串S为:\n';i++) printf("); ClearString(SS);清空串S } return 0; }