求一个数据结构的课程设计串基本操作的演示的源代码!!!

如题所述

第1个回答  2011-07-07
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  //定义顺序串
  #define MaxSize 30
  typedef struct
  {
  char data[MaxSize];
  int len;
  }SqString;

  //串的子串个数(顺序串)
  int SubNum(SqString s)
  {
  int n;

  n=1+(s.len+1)*s.len/2;
  return n;

  }
  //串的匹配查询(顺序串)
  int StrIndex(SqString s,SqString t)//s为主串,t为模式串
  {
  int i=0,j=0;
  while(i<s.len&&j<t.len)//是否到末尾
  {
  if(s.data[i]==t.data[j])//主串与模式串逐一匹配
  {
  i++;
  j++;
  }
  else //否则,回溯重新开始下一次匹配
  {
  i=i-j+1; //主串从下一个位置开始
  j=0; //模式串从头开始
  }
  }

  if(j>=t.len) //如果匹配成功
  return (i-t.len); //返回主串第一个下标
  else
  return -1; //匹配失败,返回-1
  }

  //串的连接
  //将串1和串2合并成新串,原串保留
  int Concat(SqString str1,SqString str2,SqString &str,int maxlen)
  {
  int i;
  if(str1.len + str2.len > maxlen)//长度之和不能超过maxlen
  {
  printf("两串合并后的长度超过规定长度.\n");
  return 0;
  }
  else
  {
  for(i=0;i<str1.len;i++)
  str.data[i]=str1.data[i];//将串1复制给新串

  for(i=0;i<str2.len;i++)
  str.data[str1.len+i]=str2.data[i];//将串2复制给新串

  str.data[str1.len+i]='\0';//置结束标志
  str.len=str1.len+str2.len;//计算长度和

  }

  return 1;

  }

  //串的替换
  //串1从第i字符开始的j个字符用串2替换,生成新串
  int Replace(SqString str1,int i,int j,SqString str2,SqString &str)
  {
  int m,n;

  if(j!=str2.len)//如果替换长度不等于串2,退出
  {
  printf("替换长度与串2不等.\n");
  return 0;
  }
  if(i+j-1<=str1.len)//i开始j的长度在串1之内
  {
  for(m=0;m<i-1;m++)//拷贝串1中0到i-1之间字符
  str.data[m]=str1.data[m];
  for(n=0;n<str2.len;n++)//拷贝串2的所有字符
  str.data[m++]=str2.data[n];

  for(n=i+j-1;n<str1.len;n++)//拷贝串1从i+j-1之后的所以字符
  str.data[m++]=str1.data[n];

  str.data[m]='\0';//置结束标志
  str.len=m;//置新串长度

  }
  else //超过,置长度为0
  {
  str.data[0]='\0';//置结束标志
  str.len=0;
  }

  return 1;
  }

  //串中删除字符ch
  void Delch(SqString &str,char ch)
  {
  int i,j;

  for(i=0;i<str.len;i++)//遍历元素
  {
  while(str.data[i]==ch)//如果为ch,将后面元素前移,直到不等于ch为止
  {
  for(j=i;j<str.len;j++)
  str.data[j]=str.data[j+1];//将后面元素前移
  str.len=str.len-1;//长度减一
  }
  }

  }

  //删除串中从第i个字符开始j个字符
  void Delsub(SqString &str,int i,int j)
  {
  int k;

  if(i+j-1>str.len)
  {
  printf("删除子串长度超过主串长度.\n");
  }
  else
  {
  for(k=i+j-1;k<str.len;k++)//遍历元素
  {
  str.data[k-j]=str.data[k];//后面元素前移
  }

  str.len=str.len-j; //长度减少
  str.data[str.len]='\0'; //置末尾结束
  }
  }

  //串逆序
  void ReverseSq(SqString &str)
  {
  int i,j;
  char t;

  i=0;
  j=str.len-1;//首尾调换
  while(i<j)
  {
  t=str.data[i];
  str.data[i]=str.data[j];
  str.data[j]=t;
  i++;
  j--;
  }
  }

  //子串只有一个通配符?,可以代表任意一个字符,返回匹配子串第一次出现位置
  int Patten_index(SqString &subs,SqString str)
  {
  int i,j,k;
  for(i=0;i<str.len;i++)
  {
  for(j=i,k=0;(str.data[j]==subs.data[k])||(subs.data[k]=='?');j++,k++)
  if(subs.data[k+1]=='\0')
  return(i+1);
  }
  return -1;
  }

  //求最长等值子串串头位置和子串
  void EqsubString(SqString str)
  {
  int i,j;
  int pos,max,count;

  pos=0;
  max=1;
  for(i=0,j=1;str.data[i]!='\0'&&str.data[j]!='\0';i=j,j++)
  {
  count=1;
  while(str.data[i]==str.data[j])
  {
  j++;
  count++;
  }
  if(count > max)
  {
  max=count;
  pos=i;
  }
  }

  if(max>1)
  {
  printf("位置为:%d的最大等值子串:",pos+1);
  for(i=pos;i<pos+max;i++)
  printf("%c",str.data[i]);
  }
  else
  printf("无最大等值子串.");
  printf("\n");
  }
  int main()
  {
  SqString str1,str2;
  SqString str;
  strcpy(str1.data,"abcdefghijkl");
  str1.len=strlen(str1.data);

  strcpy(str2.data,"aaad");
  str2.len=strlen(str2.data);

  printf("str1=%d,%s\nstr2=%d,%s\n",str1.len,str1.data,str2.len,str2.data);
  //1 串的匹配
  printf("串的匹配\n");
  if(StrIndex(str1,str2)!=-1)
  printf("匹配成功!\n");
  else
  printf("匹配失败!\n");
  printf("\n");

  //2 串的连接
  printf("串的连接\n");
  if(Concat(str1,str2,str,MaxSize))
  printf("合并后的新串%d,%s\n",str.len,str.data);
  else
  printf("合并出错.\n");
  printf("\n");

  //3 串的替换
  printf("串的替换\n");
  if(Replace(str1,9,4,str2,str))
  printf("替换后的新串长度%d,%s\n",str.len,str.data);
  printf("\n");

  //4 子串的个数
  printf("子串的个数\n");
  printf("%s子串个数为:%d\n",str.data,SubNum(str));
  printf("\n");
  //5 删除一个字符
  printf("删除一个字符'b'\n");
  printf("原串%s\n",str.data);
  Delch(str,'b');
  printf("删除后串长度%d,%s\n",str.len,str.data);
  printf("\n");
  //6 串中从第i个字符开始j个字符
  printf("删除从第2个位置删除3个字符\n");
  Delsub(str,2,3);
  printf("删除子串后串长度%d,%s\n",str.len,str.data);
  printf("\n");

  //7 串逆序
  printf("串逆序\n");
  ReverseSq(str);
  printf("串逆序长度%d,%s\n",str.len,str.data);
  printf("\n");

  //8 子串通配符?匹配
  printf("子串通配符?匹配:g?\n");
  int x;
  SqString subs;
  strcpy(subs.data,"g?");
  subs.len=strlen(subs.data);
  if((x=Patten_index(subs,str))>0)
  printf("在%d 匹配成功!\n",x);
  else
  printf("匹配失败!\n");
  printf("\n");

  //9 求最长等值子串串头位置和子串
  printf("求最长等值子串串头位置和子串\n");
  EqsubString(str);
  printf("\n");

  return 0;
  }本回答被网友采纳
第2个回答  2011-07-06
你是东秦的吗??