一、 为字符串分配一个固定长度的存储空间,完成相关字符串的基本操作:字符串连接,字符串比较,取字符串长度,删除子串,字符串替换,定位子串及取子串操作(这些操作用函数来实现)。并演示相关操作。
字符串的数据结构如下:
#define Max_Size
15
Typedef struct{
Char buff[Max_Size];
Int len;
} StaticCString;
源程序:
#include
using namespace std;
#define MaxSize 15
typedef struct
{
char data[MaxSize];
int length;
}SeqString;
void Assign(SeqString &s, char str[])//对串赋值
{
int i = 0;
while (str[i] != ‘\0’)//遍历str的所有字符
{
s.data[i] = str[i];
i++;
}
s.length = i;
}
void InitString(SeqString &s)//初始化
{
s.length=0 ;
}
void DestroyStr(SeqString s)//销毁一个串
{}
int StrLength(SeqString s)//求串长
{
return(s.length);
}
int StrEqual(SeqString s, SeqString t)//判断串相等
{
int i = 0;
if (s.length != t.length)//串长不同时返回0
return 0;
else
{
for (i = 0; i < s.length; i++)//有对应字符不同时返回0
if (s.data[i] != t.data[i])
return 0;
return 1;
}
}
SeqString Concat(SeqString s, SeqString t)//串连接运算算法
{
SeqString r;
int i, j;
for (i = 0; i < s.length; i++)//将s复制到r
r.data[i] =
s.data[i];
for (j = 0; j < t.length; j++)//将t复制到r
r.data[s.length + j] = t.data[j];
r.length = i +
j;
return r;//返回r
}
SeqString Put(SeqString s)//串的输出
{
return s;
}
void OutputString(SeqString s)//输出串元素
{
int i;
for (i = 0; i <s.length; i++)
{
cout << s.data[i];
}
}
int Index(SeqString s, SeqString t)//定位字串的位置(输出第一个字符的序号)
{
int i=0, j=0;
while (i < s.length&&j
< t.length)
{
if (s.data[i] == t.data[j])
{
i++;
j++;
}
else
{
i = i -
j + 1;
j = 0;
}
}
if (j >= t.length)
return i - t.length + 1;
else
return 0;
}
int DelStr(SeqString &s, int i, int j)//删除主串中的某一字串
{
int k;
if (i<1 || i>s.length || j<1 || i + j>s.length + 1)
return 0;
else
for (k = i - 1 + j; k < s.length; k++)
s.data[k - j] = s.data[k];
s.length = s.length - j;
return 1;
}
int InsStr(SeqString &s, int i, SeqString t)//插入字串
{
int j;
if (i<1 || i>s.length + 1)
return 0; //位置参数错误返回0
else
{
for (j = s.length - 1; j >=
i - 1; j–)
//将s.data[i-1…s.length-1]后移t.length个位置
s.data[j + t.length] = s.data[j];
for (j = 0; j < t.length; j++) //插入子串t
s.data[i + j - 1] = t.data[j];
s.length = s.length + t.length; //修改s串长度
return 1; //成功插入返回1
}
}
SeqString RepStr(SeqString &s, SeqString t, SeqString q)//替换主串中的所有字串
{
int i;
i = Index(s, t);
while (i>0)
{
DelStr(s, i, t.length);
InsStr(s, i, q);
i = Index(s, t);
}
return s;
}
SeqString SubStr(SeqString s, int i, int j)//取出主串中某一字串
{
SeqString t;
int k;
if (i<1 || i>s.length || j<1 || i + j>s.length+1)
t.length =
0;
else
{
for (k = i - 1; k < i + j; k++)
t.data[k
- i + 1] = s.data[k];
t.length = j;
}
return t;
}
int main()
{
char a[MaxSize], b[MaxSize], c[MaxSize], d[MaxSize];
SeqString s, q, t, p;
InitString(s);
InitString(q);
InitString§;
int i, j, k, l;
cout << “请输入一个字符串” << endl;
cin >> a;
Assign(s, a);//录入一个串
cout << “请输入第二个字符串” << endl;
cin >> b;
Assign(q, b);
while (1)
{
cout << “请选择操作:1.字符串连接 2.字符串比较 3.取字符串长度 4.删除字串 5.字符串替换”
<< “6.定位字串 7.取字串 0.退出” << endl;
cin >> i;
switch (i)
{
case 1:t = Concat(s, q);
OutputString(t); cout << endl; break;
case 2:j = StrEqual(s,
q); if (j == 1)cout << “两个字符串相等” << endl; else cout << “两个字符串不相等” << endl; break;
case 3:j = StrLength(s);
k = StrLength(q); cout << “第一个字符串的长度为” << j; cout << “第二个字符串的长度为” << k << endl; break;
case 4:cout << “请输入字串的第一个序号与字串个数” << endl;
cin >> j >> k; l = DelStr(s, j,
k); if (l ==
1)OutputString(s); else cout << “删除失败!” << endl; break;
case 5:cout << “请输入想要替换的字符串” << endl; cin >> c; Assign(t, c);
cout << “请输入用来代替的字符串” << endl; cin >> d; Assign(p, d);
RepStr(s,
t, p); OutputString(s); break;
case 6:cout << “请输入字串:” << endl; cin >> c; Assign(t, c); j
= Index(s, t); cout << j << endl; break;
case 7:cout << “请输入字串的第一个序号与字串个数” << endl;
cin >> j >> k; t = SubStr(s, j, k);
OutputString(t); break;
case 0:return 0;
default:cout << “输入有误!请重新输入” << endl;
}
}
system(“pause”);
}
二、 从键盘输入一行以“,”分隔的一组整数,求数据的个数,数据的最大值,最小值,并输出。要求编写一个函数,将整数字符串分割到一个字符串链表中,然后将字符串链表中存储的整数串转换成整数,存储到一连续的存储空间中,最后输出整数的个数及最大数和最小数。
源程序:
#include
#include
using namespace std;
#define MaxSize 100
typedef struct
{
char data[MaxSize];
int length;
}SeqString;
typedef struct
{
int A[MaxSize];
int num;
}IntString;
void Assign(SeqString &s, char str[])//对串赋值
{
int i = 0;
while (str[i] != ‘\0’)//遍历str的所有字符
{
s.data[i] = str[i];
i++;
}
s.length = i;
}
void InitString(SeqString &s)//初始化
{
s.length=0 ;
}
void InitIntString(IntString &s)//初始化
{
s.num = 0;
}
void OutputIntString(IntString s)//输出串元素
{
int i;
for (i = 0; i < s.num; i++)
{
cout << s.A[i];
}
}
int StrLength(SeqString s)//求串长
{
return(s.length);
}
void Find(IntString &a1)//寻找最大值与最小值
{
int Max, Min;
Max = a1.A[0]; Min = a1.A[0];
for (int i = 1; i < a1.num; i++)
{
if (Max < a1.A[i])
Max = a1.A[i];
if (Min > a1.A[i])
Min = a1.A[i];
}
cout << “最大值为:” << Max << endl;
cout << “最小值为:” << Min << endl;
}
void Change(SeqString &s, IntString &q, char ch)//将char型字符串放入一个int字符串
{
SeqString t;
InitString(t);
int i, j = 0, n = 0, k,
m = 0, p, l;
for (i = 0; i < s.length; i++)
{
if (s.data[i] != ch)
{
t.data[j]
= s.data[i];
q.A[n] =
atoi(t.data);
n++;
}
}
for (k = 0; k < n;
k++)
{
if (q.A[k] == 0)
m++;
}
for (p = 0; p < n;
p++)//如果a[p]=n,则删除,同时将后面的值提前
{
if (q.A[p] == 0)
{
for (l = p; l < n;
l++)
q.A[l] = q.A[l + 1];
}
}
for (p = 0; p <
n-n/3; p++)//如果a[p]=n,则删除,同时将后面的值提前
{
if (q.A[p] == 0)
{
for (l = p; l <
n-n/3; l++)
q.A[l] = q.A[l + 1];
}
}
q.num = n - m;
}
void main()
{
char a[MaxSize];
SeqString s;
IntString q;
InitString(s);
cout << “请输入一组整数(以,隔开):” << endl;
cin >> a;
Assign(s, a);
Change(s, q, ‘,’);
cout << “调整后的整数串:”;
for (int i = 0; i <
q.num; i++)
cout << ’ ’ << q.A[i];
cout << endl;
Find(q);
system(“pause”);
}
三、 矩阵的基本运算:
分别用函数实现矩阵的输入,矩阵的输出,矩阵的转置函数,并演示。
数据结构如下:
#define
MAX_Row 10
#define Max_Col
10
Typedef struct{
Int row;
Int col;
Int
data[Max_Row][Max_Col];
} Matrix;
源程序:
#include
using namespace std;
#define MAX_Row 10
#define MAX_Col 10
typedef struct
{
int row;
int col;
int data[MAX_Row][MAX_Col];
}Matrix;
void InputMatrix(Matrix &s)//矩阵的输入
{
int i, j;
cout << “请分别输入矩阵的行数与列数(最大的行列数为[10][10]):”;
cin >> s.row >> s.col;
cout << “请输入矩阵元素” << endl;
for (i = 0; i < s.row; i++)
{
for (j = 0; j < s.col; j++)
{
cin >> s.data[i][j];
}
}
}
void OutputMatrix(Matrix &s)//矩阵的输出
{
int i, j;
cout << “该矩阵为:” << endl;
for (i = 0; i < s.row; i++)
{
for (j = 0; j < s.col; j++)
{
cout << s.data[i][j]<<" ";
}
cout << endl;//输出一行便换行
}
}
Matrix TransposeMatrix(Matrix &s, Matrix &q)//矩阵转置
{
int i, j;
for (i = 0; i < s.row; i++)
{
for (j = 0; j < s.col; j++)
{
q.data[j][i] = s.data[i][j];
}
}
q.row = s.col;
q.col = s.row;
return q;
}
void main()
{
Matrix x, y;
InputMatrix(x);
OutputMatrix(x);
TransposeMatrix(x,
y);
cout << “转置后”;
OutputMatrix(y);
system(“pause”);
}
四、 使用三元组存储一个稀疏矩阵,编写函数实现稀疏矩阵的输入,稀疏矩阵的输出,稀疏矩阵的转置,两个稀疏矩阵的加法。
数据结构如下:
三元组定义:
Typedef struct{
Int row,col;
Datatype data;
}TruNode;
#define MAX_NUM
1024
Typedef struct{
Int rows,cols;
Int num;
TruNode
data[MAX_NUM];
} TRUMATRIX;
矩阵中的非零元素按行序存储。
源代码:
#include
using namespace std;
#define MaxSize 100 //矩阵中非零元素的最多个数
const int M = 20, N = 20;
typedef int ElemType;
typedef struct
{
int r; //行号
int c; //列号
ElemType d; //元素值为ElemType类型
} TupNode; //三元组值
typedef struct
{
int rows; //行数
int cols; //列数
int nums; //非零元素个数
TupNode data[MaxSize];
} TSMatrix; //三元组顺序表定义
void Creat(TSMatrix &t)//从一个二维稀疏矩阵创建其三元组表示
{
int i, j, row, col,
A[M][N];
cout << “请输入稀疏矩阵的行、列数:” << endl;
cin >> row >> col;
cout << “请输入矩阵元素” << endl;
for (i = 0; i < row;
i++)
for (j = 0; j < col;
j++)
cin >> A[i][j];
//输入三元组
t.rows = row; t.cols = col; t.nums = 0;
for (i = 0; i < t.rows; i++)
{
for (j = 0; j < t.cols; j++)
if (A[i][j] != 0) //只存储非零元素
{
t.data[t.nums].r = i;
t.data[t.nums].c = j;
t.data[t.nums].d = A[i][j];
t.nums++;
}
}
}
int Value(TSMatrix &t, ElemType x, int i, int j)//三元组元素赋值
{
int k = 0, k1;
if (i >= t.rows || j >= t.cols) return 0; //参数错误
while (k<t.nums && i>t.data[k].r) k++; //查找行
while (k<t.nums && i == t.data[k].r
&& j>t.data[k].c)
k++; //查找列
if (t.data[k].r == i && t.data[k].c == j) //存在元素
t.data[k].d = x;
else //不存在这样的元素时插入一个元素
{
for (k1 = t.nums - 1; k1 >=
k; k1–)
{
t.data[k1 + 1].r = t.data[k1].r;
t.data[k1 + 1].c = t.data[k1].c;
t.data[k1 + 1].d = t.data[k1].d;
}
t.data[k].r = i; t.data[k].c = j;
t.data[k].d = x; t.nums++;
}
return 1; //成功时返回1
}
TSMatrix Tans(TSMatrix M)//转置
{
TSMatrix N;
int i;
N.rows = M.cols;
N.cols = M.rows;
N.nums = M.nums;
for (i = 0; i < M.nums; i++)
{
N.data[i].d
= M.data[i].d;
N.data[i].r
= M.data[i].c;
N.data[i].c
= M.data[i].r;
}
return N;
}
void Output(TSMatrix t)//输出
{
int i;
if (t.nums <= 0) //没有非零元素时返回
return;
cout << “行数” << " 列数" << " 非零元素个数 " << endl;
cout << t.rows << " " << t.cols << " " << t.nums << endl;
cout << “------------------\n”;
cout << “行号” << " 列号" << " 元素 " << endl;
for (i = 0; i < t.nums; i++)
cout << t.data[i].r << " " << t.data[i].c << " " << t.data[i].d << endl;
}
TSMatrix Add(TSMatrix A, TSMatrix B)//加法
{
TSMatrix N;
int i, j;
int num = A.nums;
if (A.rows != B.rows || A.cols != B.cols)
{
cout << “矩阵不匹配,无法相加”;
return A;
}
N.rows = A.rows;
N.cols = A.cols;
N.nums = A.nums;
for (i = 0; i < A.nums; i++)
{
N.data[i].d
= A.data[i].d;
N.data[i].r
= A.data[i].r;
N.data[i].c
= A.data[i].c;
}
for (i = 0; i < B.nums; i++)
{
for (j = 0; j < A.nums; j++)
if (N.data[j].r == B.data[i].r&&N.data[j].c
== B.data[i].c)
{
N.data[j].d
= N.data[j].d + B.data[i].d;
break;
}
if (j == A.nums)
{
N.data[N.nums].d
= B.data[i].d;
N.data[N.nums].r
= B.data[i].r;
N.data[N.nums].c
= B.data[i].c;
N.nums++;
}
}
return N;
}
int main()
{
TSMatrix t, s;
cout << “创建矩阵1:” << endl;
Creat(t);
cout << “三元组如下:” << endl;
Output(t);
cout << “若转置,则为:” << endl;
cout << “三元组如下:” << endl;
Output(Tans(t));
cout << “创建矩阵2:” << endl;
Creat(s);
cout << “三元组如下:” << endl;
Output(s);
cout << “两矩阵相加后:” << endl;
cout << “三元组如下:” << endl;
Output(Add(t,
s));
system(“pause”);
}