串的一些基礎操作(c語言)~DS筆記⑤

先來看看下面這幾句:

黃山落葉松葉落山黃,上海自來水來自海上,還有小嶽嶽春晚的那句:山西運煤車煤運西山。

諸如此類的句子很多人都聽過,他們有一個共同的特點:順着讀,倒着讀都一樣。他們也有一個共同的名字:迴文
在這裏插入圖片描述
再看下面的這三組英文單詞,很有意思。
lover–over
friend–end
believe–lie
愛人中有結束,朋友中有完結,信任中有謊言。
如果我們把這些單詞看成串,那麼,我們就可以給出這些單詞一個新的稱呼了。左邊的叫主串,右邊的叫子串

子串與主串串中任意個數的連續字符組成的子序列,稱爲該串的字串,相應的,包含子串的串稱爲主串。

順便一提空格串只包含空格的串。空格串不等於空串。

說了這麼多終於回到主題,串,什麼是串?下面這個?
在這裏插入圖片描述
(一直覺得串這個字很有意思,很形象。就好像一個籤子穿了兩塊肉?!)
咳咳~,扯遠了,回到正題。

字符串串是由零個或多個字符組成的有限序列,又名叫字符串。

這裏有一個需要明白的事,如何判斷兩個字符串的大小
其實很簡單,就類似我們查字典的過程。哪個單詞越靠前,它就越小。

下面是關於串的一些基本操作的代碼。

頭文件與宏定義:

(數組下標爲零的單元存放串長)

#include<stdio.h>
#include "string.h"
#define MAXSIZE 40 /* 存儲空間初始分配量 */
typedef int ElemType;
typedef char String[MAXSIZE + 1]; /*  0號單元存放串的長度 */
typedef enum{ False = 0, True = 1 }Bool;

生成:

Bool StrAssign(String T, char *chars)
{/* 生成一個其值等於chars的串T */
 int i;
 if (strlen(chars) > MAXSIZE)
  return False;//chars不能大於存儲空間初始分配量
 else
 {
  T[0] = strlen(chars);//第一個單元存入chars大小
  for (i = 1; i <= T[0]; ++i)
  {
   T[i] = *(chars + i - 1);//順序賦值
  }
  return True;
 }
}

清空:

Bool ClearString(String S)
{/* 將S清爲空串 */
 S[0] = 0;
 return True;
}

複製:

Bool StrCopy(String T, String S)
{/* 由串S複製得串T */
 for (int i = 0; i <= S[0]; ++i)
 {
  T[i] = S[i];
 }
 return True;
}

是否爲空:

Bool StrEmpty(String S)
{/* 若S爲空串,則返回True,否則返回False */
 if (0 == S[0])
  return True;
 else
  return False;
}

串長:

int StrLength(String S)
{/* 返回串的元素個數 */
 return S[0];
}

比較:

int StrCompare(String S, String T)
{/* 若S>T,則返回值>0;若S=T,則返回值=0;若S<T,則返回值<0 */
 for (int i = 0; i <= S[0] && i <= T[0]; ++i)
 {
  if (S[i] != T[i])
  {
   return S[i] - T[i];
  }
 }
 return S[0] - T[0];
}

拼接:

Bool Concat(String T, String S1, String S2)
{/* 若未截斷,則返回True,否則False */
 if (S1[0] + S2[0] <= MAXSIZE)
 {//兩字符串長度和小於最大長度時
  for (int i = 1; i <= S1[0]; ++i)
  {
   T[i] = S1[i];
  }
  for (int i = 1; i <= S2[0]; ++i)
  {
   T[S1[0] + i] = S2[i];
  }
  T[0] = S1[0] + S2[0];
  return True;
 }
 else
 {//兩字符串長度和大於最大長度時
  for (int i = 1; i <= S1[0]; ++i)
  {
   T[i] = S1[i];
  }
  for (int i = 1; i <= MAXSIZE-S1[0]; ++i)
  {
   T[S1[0] + i] = S2[i];
  }
  T[0] = MAXSIZE;
  return False;
 }
}

查找子串:

int Index(String S, String T, int pos)
{/*返回子串T在主串S中第pos個字符之後的位置。若不存在,則函數返回值爲0*/
 int i = pos;
 int j = 1;
 while (i <= S[0] && j <= T[0])
 {
  if (S[i] == T[j])
  {
   i++;
   j++;
  }
  else
  {
   i = i - j + 2;
   j = 1;
  }
 }
 if (j > T[0])
  return i - T[0];
 else
  return 0;
}

返回子串:

Bool SubString(String Sub, String S, int pos, int len)
{/* 用Sub返回串S的第pos個字符起長度爲len的子串。 */
 if (pos > S[0] || pos < 1 || len<0 || len>S[0] - pos + 1)
 {
  return False;
 }
 for (int i = 1; i <= len; ++i)
 {
  Sub[i] = S[pos + i - 1];
 }
 Sub[0] = len;
 return True;
}

替換子串:

Bool Replace(String S, String T, String V)
{/* 用V替換主串S中出現的所有與T相等的不重疊的子串 */
 if (StrEmpty(S) || StrEmpty(T))
 {
  return False;
 }
 int i = 1;
 do
 {
  i = Index(S, T, i);
  if (i)
  {
   StrDelete(S, i, StrLength(T));
   StrInsert(S, i, V);
   i += StrLength(V);
  }
 }while (i);
 return True;
}

插入子串:

Bool StrInsert(String S, int pos, String T)
{/*在串S的第pos個字符之前插入串T。插入返回True,否則返回False */
 int i;
 if (pos<1 || T[0] + S[0]>MAXSIZE || pos > S[0] + 2)
  return False;
 if (pos == S[0] + 2)
 {
  for (i = 1; i <= T[0]; ++i)
  {
   S[S[0] + i] = T[i];
  }
 }
 else
 {
  for (i = S[0]; i >= pos;i--)
  {
   S[i + T[0]] = S[i];
  }
  for (i = pos; i < pos + T[0]; i++)
  {
   S[i] = T[i - pos + 1];
  }
 }
 S[0] = S[0] + T[0];
 return True;
}

刪除子串:

Bool StrDelete(String S, int pos, int len)
{/* 從串S中刪除第pos個字符起長度爲len的子串 */
 if (pos<1 || pos>S[0] + 1 - len || len < 0)
 {
  return False;
 }
 for (int i = pos + len; i <= S[0]; i++)
 {
  S[i - len] = S[i];
 }
 S[0] = S[0] - len;
 return True;
}

輸出:

Bool StrShow(String T)
{/* 輸出串T */
 if (0 == T[0])
  return False;
 int i = 1;
 while (T[i])
 {
  printf("%c", T[i]);
  ++i;
 }
 printf("\n");
 return True;
}

謝觀~
(:з)∠)

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