一、实验目的:
通过本实验,旨在掌握链串存储结构的基本操作,以及设计一个算法将数字字符移动到字母字符前面,同时保持字符的相对次序不变。通过实验,加深对链表操作的理解和应用能力。
二、实验内容:
- 计并实现一个算法,将串s中所有的数字字符移动到字母字符的前面,要求所有字符的相对次序不发生改变。。
- 使用链串存储结构表示字符串,并实现串赋值、串销毁等操作。
- 编写测试代码,使用相关数据进行测试,验证算法的正确性。
三、实验过程:
实现思路:
- 首先定义链串结构,包含字符数据和指向下一个节点的指针。
- 编写串赋值运算Assign函数,将输入的字符串转换为链串。
- 编写销毁串运算DestroyStr函数,释放链串的内存。
- 编写MoveDigitsToFront函数,遍历链串,将数字字符移动到字母字符的前面。
实验步骤/实现代码:
#include <iostream>
using namespace std;
#define MaxSize 100
typedef struct node
{
char data;
struct node *next;
} LinkString;
// 串赋值运算
void Assign(LinkString *&s, char str[])
{
int i = 0;
LinkString *p, *tc;
s = (LinkString *)malloc(sizeof(LinkString));
tc = s;
while (str[i] != '\0')
{
p = (LinkString *)malloc(sizeof(LinkString));
p->data = str[i];
tc->next = p;
tc = p;
i++;
}
tc->next = NULL;
}
// 销毁串运算
void DestroyStr(LinkString *&s)
{
LinkString *pre = s, *p = pre->next;
while (p != NULL)
{
free(pre);
pre = p;
p = p->next;
}
free(pre);
}
// 移动数字字符到字母字符前面
void MoveDigitsToFront(LinkString *&s)
{
LinkString *alphaStr, *numStr;
alphaStr = (LinkString *)malloc(sizeof(LinkString));
alphaStr->data = '\0';
alphaStr->next = NULL;
numStr = (LinkString *)malloc(sizeof(LinkString));
numStr->data = '\0';
numStr->next = NULL;
LinkString *p = s->next;
LinkString *alphaPtr = alphaStr;
LinkString *numPtr = numStr;
while (p != NULL)
{
if (isalpha(p->data))
{
alphaPtr->next = p;
alphaPtr = p;
}
else if (isdigit(p->data))
{
numPtr->next = p;
numPtr = p;
}
p = p->next;
}
alphaPtr->next = numStr->next;
numPtr->next = NULL;
s->next = alphaStr->next;
free(alphaStr);
free(numStr);
}
int main()
{
LinkString *s;
char str[] = "a1b2c3d4e5";
Assign(s, str);
cout << "原始字符串: ";
LinkString *p = s->next;
while (p != NULL)
{
cout << p->data;
p = p->next;
}
cout << endl;
MoveDigitsToFront(s);
cout << "移动后的字符串: ";
p = s->next;
while (p != NULL)
{
cout << p->data;
p = p->next;
}
cout << endl;
DestroyStr(s);
return 0;
}
实验结果/运行图:
运行图: