您的位置:首页 > 理论基础 > 数据结构算法

数据结构 - C语言版 - 串 所有基本操作

2013-11-19 20:27 721 查看
题目:要求输入两个字符串,实现字符串的连接,以及判断这两个串是否相等;
#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 255

typedef struct String{
int data[MAXSIZE];
int next;
}String;

String * Init_String(String * S)
{
S = (String *) malloc( sizeof(String) );
S->next = 0;
return S;
}

void Create_String(String * S, int e)
{
S->data[S->next] = e;
}

int LengthS_String(String * S)
{
return S->next;
}

int LengthQ_String(String * Q)
{
return Q->next;
}

int LengthAll_String(String * S, String * Q)
{
int s = LengthS_String(S);
int q = LengthQ_String(Q);
return (s + q);
}

int isSame_String(String * S, String * Q)
{
int i;
int count = 0;

if( LengthS_String(S) == LengthQ_String(Q) )
{
for(i=0; i < (Q->next); i++)
{
if(S->data[i] == Q->data[i])
{
count++;
}
else
{
count = 0;
}
}
}
else
{
count = 0;
}

if(count == 0)
{
return 0;
}
else
{
return 1;
}
}

void Cat_String(String * S, String * Q)
{
int countS = S->next - 1;
int len = LengthAll_String(S, Q)-2;

for(S->next=0; S->next < len; S->next++)
{
if(S->next > (countS-1))
{
S->data[S->next] = Q->data[S->next - countS];
}
}
}

void Get_Anyone_String(String * S, String * Q, int i)
{
printf("    第 %d 个字符: %c\n", i+1, S->data[i]);
}

void Print_String(String * S, int i)
{
printf("%c", S->data[i]);
}

void fun(void)
{
printf("\n");
}

int main(void)
{
int i;
String * S, * Q;
//int len;

S = Init_String(S);
Q = Init_String(Q);

printf("请输入第一个要保存的字符串(S):");
while((S->data[S->next++] = getchar()) != '\n')
{
Create_String(S, S->data[S->next]);
}

printf("请输入第二个要保存的字符串(Q):");
while((Q->data[Q->next++] = getchar()) != '\n')
{
Create_String(Q, Q->data[Q->next]);
}fun();

printf("保存的第一个字符串(S):");
for(i=0; i<S->next-1; i++)
{
Print_String(S, i);
}fun();

printf("保存的第二个字符串(Q):");
for(i=0; i<Q->next-1; i++)
{
Print_String(Q, i);
}fun();fun();

if(isSame_String(S,Q))
{
printf("√ Pass: String.S is the same as String.Q");
}
else
{
printf("× Warning: String.S is not the same as String.Q");
}fun();fun();

Cat_String(S, Q);                        // 连接后,S 数组中,S 的长度就是连接后的长度,因为被调函数从 0 开始循环,最后得到的 S->next 是长度
printf("两个字符串连接后(Strcat):");    // 在这个后面 S->next 就取代了 26 行的 int LengthS_String(String * S);
for(i=0; i < S->next; i++)
{
Print_String(S, i);
}fun();fun();

printf("合并后详细参数:\n");
printf("    字符串长度为: %d 位\n", S->next);
for(i=0; i < S->next; i++)
{
Get_Anyone_String(S, Q, i);
}

printf("\n");
system("pause");
return 0;
}


/*
----------在VC++ 6.0 显示结果为:----------
请输入第一个要保存的字符串(S):My name is WangJiping.
请输入第二个要保存的字符串(Q):My TeamName is J.Wong.

保存的第一个字符串(S):My name is WangJiping.
保存的第二个字符串(Q):My TeamName is J.Wong.

× Warning: String.S is not the same as String.Q

两个字符串连接后(Strcat):My name is WangJiping. My TeamName is J.Wong.

合并后详细参数:
    字符串长度为: 45 位
    第 1 个字符: M
    第 2 个字符: y
    第 3 个字符:
    第 4 个字符: n
    第 5 个字符: a
    第 6 个字符: m
    第 7 个字符: e
    第 8 个字符:
    第 9 个字符: i
    第 10 个字符: s
    第 11 个字符:
    第 12 个字符: W
    第 13 个字符: a
    第 14 个字符: n
    第 15 个字符: g
    第 16 个字符: J
    第 17 个字符: i
    第 18 个字符: p
    第 19 个字符: i
    第 20 个字符: n
    第 21 个字符: g
    第 22 个字符: .
    第 23 个字符:
    第 24 个字符: M
    第 25 个字符: y
    第 26 个字符:
    第 27 个字符: T
    第 28 个字符: e
    第 29 个字符: a
    第 30 个字符: m
    第 31 个字符: N
    第 32 个字符: a
    第 33 个字符: m
    第 34 个字符: e
    第 35 个字符:
    第 36 个字符: i
    第 37 个字符: s
    第 38 个字符:
    第 39 个字符: J
    第 40 个字符: .
    第 41 个字符: W
    第 42 个字符: o
    第 43 个字符: n
    第 44 个字符: g
    第 45 个字符: .

请按任意键继续. . .

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息