// 串的定長順序存儲實現.cpp : 定義控制檯應用程序的入口點。
//
#include "stdafx.h"
#include<iostream>
#include<stdio.h>
#include<string>
#include<iomanip>
#define STRING_SIZE 255
using namespace std;
typedef unsigned char SString[STRING_SIZE + 1];
//函數聲明部分
void Error(char *s); //錯誤處理函數
void Strassign_string(SString &S, char chars[]); //賦值函數
void Clear_string(SString &s); //清空函數
void Destroy_string(SString &S); //銷燬函數
int Getlength_string(SString &s); //得到定長順序串的長度
int Compare_string(SString &s, SString &t); //比較兩個訂場順序串的大小
void Concat_string(SString &t, SString &s1, SString &s2); //連接兩個順序串
void Substring_string(SString &sub, SString &s, int pos, int len); //得到主串的子串
void Insert_string(SString &S, SString &T, int pos); //插入函數
void Delete_string(SString &S, int t, int pos); //刪除函數
//函數實現部分
void Error(char *s) //錯誤處理函數
{
cout << s << endl;
exit(1);
}
/*賦值算法設計:1、先計算待賦值順序串的長度;2.如果待賦值字符串的長度爲0,則將主串設置爲空串
3.在待賦值字符串長度不爲零的情況下,如果長度大於申請的空間,將發生截斷現象,給出截斷提示
如果長度小於等於申請的空間,不發生截斷現象*/
void Strassign_string(SString &S, char chars[]) //賦值函數
{
int i = 0;
int chars_length = 0; //初始值設爲0
while (chars[i] != '\0') //計算待賦值串的長度
{
chars_length++;
i++;
}
if (!chars_length) S[0] = 0;
else
{
int j = 1;
int k = 0;
if (chars_length > STRING_SIZE)
{
while(j<=STRING_SIZE)
{
S[j++] = chars[k++];
}
S[0] = STRING_SIZE;
cout << "串常量長度大於給定空間,賦值發生截斷!" << endl;
}
else
{
while (j <= chars_length)
{
S[j++] = chars[k++];
}
S[0] = chars_length;
}
}
}
void Clear_string(SString &s) //清空函數
{
s[0] = 0;
}
void Destroy_string(SString &S) //銷燬函數
{
for (int i = 1; i <= S[0]; i++)
{
delete &S[i];
}
delete &S[0];
}
int Getlength_string(SString &s) //得到定長順序串的長度
{
return s[0];
}
/*定長順序串的大小比較算法設計:以此比較串1和串1對應位置上的字符
1.如果串1大於串2,返回正數;2.如果串1等於串2,返回0;3,如果串1小於串2,返回負數*/
int Compare_string(SString &s, SString &t) //比較兩個定長順序串的大小
{
for (int i = 1; (i <= s[0]) && (i <= t[0]); i++)
{
if (s[i] != t[i])
return (s[i] - t[i]);
else
return (s[0] - t[0]);
}
}
/*連接兩個定長順序串的算法設計:基於定產順序串S1和S2的連接操作,對超過預定義空間的部分需要實施截斷操作。
基於S1和s2長度的不同,連接時可能有以下四種情況:
1.S1[0]+S2[0]<=STRING_SIZE,則得到的串是正確的串;
2.S1[0]+S2[0]>STRING_SIZE,且S1[0]<STRING_SIZE,則得到的串是S1的全串,S2的部分,S2將發生截斷;
3.S1[0]=STRING_SIZE,則得到的串是S1串;
4.S1[0]>STRING_SIZE,則得到的串是S1的部分,S1將發生截斷;*/
void Concat_string(SString &t, SString &s1, SString &s2)//連接兩個順序串
{
if ((s1[0] + s1[0]) <= STRING_SIZE)
{
int j = 1;
int k = 1;
while (j <= s1[0])
{
t[k++] = s1[j++];
}
j = 1;
while (j <= s2[0])
{
t[k++] = s2[j++];
}
t[0] = s1[0] + s2[0];
cout << "正確連接,沒有發生截斷!" << endl;
}
else if ((s1[0]) <= STRING_SIZE)
{
int j = 1;
int k = 1;
while (j <= s1[0])
{
t[k++] = s1[j++];
}
j = 1;
while (j <= s2[0])
{
t[k++] = s1[j++];
}
t[0] = STRING_SIZE;
cout << "未正確連接,S2發生截斷!" << endl;
}
else if ((s1[0])== STRING_SIZE)
{
int j = 1;
int k = 1;
while (j <= s1[0])
{
t[k++] = s1[j++];
}
t[0] = STRING_SIZE;
cout << "未正確連接,S2沒有連接上!" << endl;
}
else
{
int j = 1;
int k = 1;
while (j <= s1[0])
{
t[k++] = s1[j++];
}
t[0] = s1[0];
cout << "未正確連接,S1發生截斷現象!" << endl;
}
}
void Substring_string(SString &sub, SString &s, int pos, int len) //得到主串的子串
{
if ((pos<1) || (pos>s[0]) || (len < 0) || (len>(s[0] - pos + 1)))
Error("參數輸入錯誤,請再次輸入!");
for (int i = 1; i <= len; i++)
{
sub[i] = s[pos + i - 1];
}
sub[0] = len;
}
void Insert_string(SString &S, SString &T, int pos)//將子串插入到主串pos位置後
{
if ((S[0] + T[0]) <= STRING_SIZE)
{
int j = 0;
for (int i = (S[0]+T[0]); i >= pos; i--) //將主串從後往前移動,騰出子串的位置
{
S[i] = S[S[0] - j];
j++;
}
j = 1;
for (int i = pos; i < (pos + T[0]); i++) //將子串插入到pos位置起的部分
{
S[i] = T[j];
j++;
}
S[0] = S[0] + T[0];
}
}
void Delete_string(SString &S, int t, int pos) //從主串中pos位置起刪除t個字符
{
for (int i = pos; i < (S[0] - pos + 1); i++)
{
S[i] = S[i+t];
}
S[0] = S[0] - t;
}
int _tmain(int argc, _TCHAR* argv[])
{
char a[50] = { "abc" };
SString S1;
Strassign_string(S1, a);
cout << "串S1的長度是:" << Getlength_string(S1) << endl;
char b[50] = { "ABCDEFGHIJKLMN"};
SString S2;
Strassign_string(S2, b);
cout << "串S2的長度是:" << Getlength_string(S2) << endl;
cout << "比較字符串的結果是:" << Compare_string(S1, S2) << endl;
Insert_string(S2, S1, 3);
cout << "插入後的字符串是:";
for (int i = 1; i <= S2[0]; i++)
{
cout << S2[i];
}
cout << endl;
Delete_string(S2, 3, 2);
cout << "刪除後的字符串是:";
for (int i = 1; i <= S2[0]; i++)
{
cout << S2[i];
}
cout << endl;
SString S3;
Concat_string(S3, S1, S2);
cout<<"連接後的字符串長度是:" << Getlength_string(S3) << endl;
cout << "連接後的字符串是:";
for (int i = 1; i <= S3[0]; i++)
{
cout << S3[i];
}
cout << endl;
SString S4;
Substring_string(S4, S3, 3, 5);
cout << "取出的子串是:";
for (int i = 1; i <= S4[0]; i++)
{
cout << S4[i];
}
cout << endl;
return 0;
}
c語言:定長順序串的基本操作實實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.