大家来找茬!!
鄙人刚学数据结构,日前编写一串堆分配操作程序,编译无错,但运行时总是会出现发送错误报告,请各位高手找茬!ps:具体问题是由键盘输入串问题,main函数中指针问题,以下是程序代码:
程序代码:
#include <iostream> #include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <string> using namespace std; typedef struct { char *ch; // 若是非空串,则按串长分配存储区,否则ch为NULL int length; // 串长度 }HString; // 初始化(产生空串)字符串T void InitString(HString *T) { (*T).length=0; (*T).ch=NULL; } int StrLength(HString S) { return S.length; } // 生成一个其值等于串常量chars的串T int StrAssign(HString *T, char *chars) { int i,j; if((*T).ch) free((*T).ch); // 释放T原有空间 i =strlen(chars); // 求chars的长度i if(!i) { // chars的长度为0 (*T).ch = NULL; (*T).length = 0; } else { // chars的长度不为0 (*T).ch = (char*)malloc(i*sizeof(char)); // 分配串空间 if(!(*T).ch) // 分配串空间失败 exit(0); for(j = 0; j < i; j++) // 拷贝串 (*T).ch[j] = chars[j]; (*T).length = i; } return 0; } int StrEmpty(HString S) { if(S.length == 0 && S.ch == NULL) return 1; else return 0; } // 用Sub返回串S的第pos个字符起长度为len的子串。 int SubString(HString *Sub, HString S,int pos,int len) { int i; if(pos<1||pos>S.length||len<0||len>S.length-pos+1) return 0; if((*Sub).ch) free((*Sub).ch); // 释放旧空间 if(!len) // 空子串 { (*Sub).ch=NULL; (*Sub).length=0; } else { // 完整子串 (*Sub).ch=(char*)malloc(len*sizeof(char)); if(!(*Sub).ch) exit(0); for(i=0;i<=len-1;i++) (*Sub).ch[i]=S.ch[pos-1+i]; (*Sub).length=len; } return 0; } // 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 int StrCompare(HString S,HString T) { int i; 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; } // T为非空串。若主串S中第pos个字符之后存在与T相等的子串, 则返回第一个这样的子串在S中的位置,否则返回0 int Index(HString S,HString T,int pos) { int n,m,i; HString sub; InitString(&sub); if(pos>0) { n=StrLength(S); //n为串s的长度 m=StrLength(T); //m为串t的长度 i=pos; while(i<=n-m+1) //从第i个位置开始求与T等长的子串,循环直到找到 { SubString(&sub,S,i,m); //从第i个位置开始求得子串 if(StrCompare(sub,T)!=0)//将求得的子串与T对比,若不等则i++ ++i; else return i; } } return 0; } int Concat(HString *T,HString S1,HString S2) { int i; if((*T).ch) free((*T).ch); // 释放旧空间 (*T).length=S1.length+S2.length; (*T).ch=(char *)malloc((*T).length*sizeof(char)); //分配新串的长度 if(!(*T).ch) exit(0); for(i=0;i<S1.length;i++) //将S1接到新串T的后面 (*T).ch[i]=S1.ch[i]; for(i=0;i<S2.length;i++) //将S2接到新串T的后面 (*T).ch[S1.length+i]=S2.ch[i]; return 0; } // 从串S中删除第pos个字符起长度为len的子串 int StrDelete(HString *S,int pos,int len) { int i; if((*S).length<pos+len-1) //若串长度小于pos长度与删除字符长度之和则退出 exit(0); for(i=pos-1;i<=(*S).length-len;i++) (*S).ch[i]=(*S).ch[i+len]; (*S).length-=len; (*S).ch=(char*)realloc((*S).ch,(*S).length*sizeof(char)); return 0; } // 在串S的第pos个字符之前插入串Ts int StrInsert(HString *S,int pos,HString T) { int i; if(pos<1||pos>(*S).length+1) // pos不合法 return 0; if(T.length) // T非空,则重新分配空间,插入T { (*S).ch = (char*)realloc((*S).ch, ((*S).length+T.length)*sizeof(char)); if(!(*S).ch) exit(0); for(i=(*S).length-1;i>=pos-1;--i) // 为插入T而腾出位置 (*S).ch[i+T.length]=(*S).ch[i]; for(i=0;i<T.length;i++) (*S).ch[pos-1+i]=T.ch[i]; // 插入T (*S).length+=T.length; } return 0; } // 用V替换主串S中出现的所有与T相等的不重叠的子串 int Replace(HString *S,HString T,HString V) { int i=1; // 从串S的第一个字符起查找串T if(StrEmpty(T)) // T是空串 return 0; do { i=Index(*S,T,i); // 结果i为从上一个i之后找到的子串T的位置 if(i) // 串S中存在串T { StrDelete(S,i,StrLength(T)); // 删除该串T StrInsert(S,i,V); // 在原串T的位置插入串V i+=StrLength(V); // 在插入的串V后面继续查找串T } }while(i); return 0; } // 输出T字符串 void StrPrint(HString T) { int i; for(i=0;i<T.length;i++) cout<<T.ch[i]; cout<<endl; } int main() { int i; char c,*p,*q,*m,*n; HString t,s,r; InitString(&t); InitString(&s); InitString(&r); cout<<"请输入串t:"; cin>>p; StrAssign(&t,p); cout<<"串t为:"; StrPrint(t); cout<<"请输入串s:"; cin>>q; StrAssign(&s,q); cout<<"串s为:"; StrPrint(s); i=StrCompare(s,t); if(i<0) c='<'; else if(i==0) c='='; else c='>'; printf("串s%c串t\n",c); Concat(&r,t,s); cout<<"串t联接串s产生的串r为: "; StrPrint(r); cout<<"重新定义串s,请输入串s: "; cin>>m; StrAssign(&s,m); StrPrint(s); cout<<"重新定义串t,请输入串t: "; cin>>n; StrAssign(&t,n); StrPrint(t); Replace(&r,t,s); cout<<"把串r中和串t相同的子串用串s代替后,串r为:"; StrPrint(r); StrInsert(&r,6,s); cout<<"在串t的第6个字符前插入串s后,串r为: "; StrPrint(r); return 0; }