数据结构 串与数组

一、 为字符串分配一个固定长度的存储空间,完成相关字符串的基本操作:字符串连接,字符串比较,取字符串长度,删除子串,字符串替换,定位子串及取子串操作(这些操作用函数来实现)。并演示相关操作。

字符串的数据结构如下:

#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”);

}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值