字符串 堆實現

#ifndef _STRING_H_
#define _STRING_H_
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
typedef int Status;
typedef struct
{
 char *ch;
 int length;
}HString;
Status StrAssign(HString &T, char *chars);
Status ClearString(HString &S);
int Strlength(HString S);
Status Concat(HString &T,HString S1,HString S2);
Status SubString(HString &Sub,HString S,int pos,int len);
Status Strindex(HString S,HString T,int pos);
void print(HString S);

#endif

#include"string.h"
#include<iostream>
#include<string>
using namespace std;
//初始化字符串
 Status StrAssign(HString &T,char chars[])
{
 char *c;
 int i=0,j;
 if(T.ch)
 {
  T.ch = NULL;
 }
 for (i = 0, c = chars; *c; ++i, ++c);
 if(!(T.ch=(char*)malloc(i*sizeof(char))))
 {
  exit(OVERFLOW);
 }
 else
 {
  for(j=0;j<i;j++)
  {
   T.ch[j]=chars[j];
  }
  T.length=i;
 }
 return OK;
}
 //清空字符串
 Status ClearString(HString &S)
 {
  if(S.ch)
  {
   free(S.ch);
   S.ch=NULL;
  }
  S.length=0;
  return OK;
 }
 //求字符串的長度
 int Strlength(HString S)
 {
  return S.length;
 }
 //連接兩個字符串
 Status Concat(HString &T,HString S1,HString S2)
 {
  int i,j;
  if(T.ch)
  {
   free(T.ch);
  }
  if(!(T.ch=(char*)malloc((S1.length+S2.length)*sizeof(char))))
  {
   exit(OVERFLOW);
  }
  else
  {
   for(i=0;i<S1.length;i++)
   {
    T.ch[i]=S1.ch[i];
   }
   T.length=S1.length+S2.length;
   for(j=S1.length;j<T.length;j++)
   {
  
   T.ch[j] = S2.ch[j-S1.length];
   }
   return OK;
  }
 }
 //求子串
 Status SubString(HString &Sub,HString S,int pos,int len)
 {
 int i,j=0;
 if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
 {
  return ERROR;
 }
 if(Sub.ch)
 {
  free(Sub.ch);
 }
 if(!len)
 {
  Sub.ch=NULL;
  Sub.length=0;
 }
 else
 {
  Sub.ch=(char*)malloc(len*sizeof(char));
  for(i=pos-1,j=0;i<pos+len-2,j<len;i++,j++)
  {
   Sub.ch[j] = S.ch[i];
  }
  Sub.length = len;
 }
 return OK;
 }
 //模式匹配
 Status Strindex(HString S,HString T,int pos)
 {
  int i=pos-1,j=0;
  if(pos<1||pos>S.length)
  {
   return ERROR;
  }
 while(i<S.length&&j<T.length)
 {
  if(S.ch[i]==T.ch[j])
  {
   i++;
   j++;
  }
  else
  {
   i=i-j+1;
   j=0;
  }
 }
 if(j>T.length-1)
 {
  return i-T.length+1;
 }
 else
 {
  return ERROR;
 }
 }
 //遍歷
 void print(HString S)
 {
  int i;
  if(S.length!=0)
  {
   for(i=0;i<S.length;i++)
   {
    cout<<S.ch[i];
   }
  }
  cout << endl;
 }

#include"string.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
 char chars1[10], chars2[20] , chars3[20] ,chars4[20] ;
 int i, select, pos, len;
 HString T,S,S1,S2,Sub;
 T.ch = NULL;
 T.length = 0;
 S.ch = NULL;
 S.length = 0;
 S1.ch = NULL;
 S1.length = 0;
 S2.ch = NULL;
 S2.length = 0;
 Sub.ch = NULL;
 cout << "請輸入字符串chars1:" << endl;
 cin.get(chars1, 10);
 StrAssign(S, chars1);
 //print(S);
 do
 {
  cout << "1.連接兩個字符串!" << endl;
  cout << "2.求子串!" << endl;
  cout << "3.模式匹配!" << endl;
  cout << "0.操作結束!" << endl;
  cout << "請選擇:" << endl;
  cin >> select;
  cin.sync();//清空緩存區域
  switch (select)
  {
   case 1:
    cin.sync();
    cout << "請輸入字符串chars2:" << endl;
    cin.get(chars2, 5);
    StrAssign(S1, chars2);
    getchar();
    cout << "請輸入chars3:" << endl;
    cin.get(chars3, 4);
    StrAssign(S2, chars3);
    //print(S2);
    cin.sync();
    if (Concat(T, S1, S2) == OK)
    {
     print(T);
    }
    break;
   case 2:
    cout << "請輸入位置:" << endl;
    cin >> pos;
    cout << "請輸入子串的長度:" << endl;
    cin >> len;
    if (SubString(Sub, S, pos, len) == ERROR)
    {
     cout << "位置或長度輸入不合法!" << endl;
    }
    else
    {
     print(Sub);
    }
    break;
   case 3:
    cin.sync();
    cout << "請輸入chars4:" << endl;
    cin.get(chars4, 3);
    StrAssign(T, chars4);
    cin.sync();
    //print(T);
    cout << "請輸入位置:" << endl;
    cin >> pos;
    if (Strindex(S, T, pos) == ERROR)
    {
     cout << "位置輸入不合法或者不匹配!" << endl;
    }
    else
    {
     cout << "第一個匹配的位置爲:" << Strindex(S, T, pos) << endl;
    }
    break;
   case 0:
    cout << "操作結束!" << endl;
    break;
   default:
    cout << "輸入錯誤!" << endl;
  }
 } while (select != 0);
 ClearString(S);
 ClearString(Sub);
 ClearString(S1);
 ClearString(S2);
 return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章