写代码:1、定义一个存储顺序串的类型。 2、编写插入、 删除、 查找、 比较、 取子串、 连接、 子串替换等所有基本函数。 3、设计选择式菜单,以选择菜单方式进行操作,将上述各种算法实现。
时间: 2024-12-16 08:27:27 浏览: 9
算法与数据结构:第2章 串(讲解).ppt
在C语言中,我们可以使用数组或链表来实现一个简单的字符串类型。这里我们选择数组作为基础数据结构,因为它们更直接、简单。然而,请注意,对于大型字符串,数组可能会导致性能问题,特别是当我们频繁添加或删除元素时。
首先,让我们定义一个`string`类型,代表顺序存储字符串的结构体:
```c
#include <stdio.h>
#include <string.h>
// 定义一个大小为MAX_LEN的字符数组表示字符串
#define MAX_LEN 100
typedef char String[MAX_LEN];
// 定义一个指向String类型的指针,用于指向动态分配的空间(在实际项目中可选)
typedef String* String_Ptr;
```
接下来,我们将实现一些基本操作的函数:
1. 插入:
```c
void insert(String_Ptr str, int index, char new_char) {
if (index >= 0 && index < MAX_LEN - 1) {
memmove(str + index + 1, str + index, strlen(str) - index);
str[index] = new_char;
} else {
printf("Insertion index out of range.\n");
}
}
```
2. 删除:
```c
void delete(String_Ptr str, int index) {
if (index >= 0 && index < MAX_LEN) {
memmove(str + index, str + index + 1, strlen(str) - index);
str[strlen(str) - 1] = '\0'; // 结尾'\0'被移动了,需要更新
} else {
printf("Deletion index out of range.\n");
}
}
```
3. 查找:
```c
int find(String_Ptr str, char target) {
for (int i = 0; i < MAX_LEN; i++) {
if (str[i] == target)
return i;
}
return -1; // 如果没找到,返回-1
}
```
4. 比较:
```c
int compare(String_Ptr str1, String_Ptr str2) {
if (strlen(str1) != strlen(str2))
return strlen(str1) < strlen(str2) ? -1 : 1;
return strcmp(str1, str2); // 使用strcmp比较字符串内容
}
```
5. 取子串、连接、子串替换:
```c
String sub_string(String_Ptr str, int start, int end) {
if (start >= 0 && end <= MAX_LEN && start <= end) {
String sub_str = str + start;
sub_str[end - start] = '\0';
return sub_str;
}
return NULL;
}
// 连接两个字符串
String_concat(String_Ptr result, String_Ptr str1, String_Ptr str2) {
int len1 = strlen(str1), len2 = strlen(str2);
result[len1] = '\0';
strcat(result + len1, str2);
return result;
}
// 替换子串
void replace(String_Ptr str, int start, int end, const char* replacement) {
int length = strlen(replacement);
memmove(str + start + length, str + start + end, strlen(str) - start - end);
strncpy(str + start, replacement, length);
str[start + length] = '\0';
}
```
现在,为了实现选择式菜单,你可以创建一个主函数,循环显示各个功能并接收用户的输入:
```c
int main() {
String_Ptr input;
printf("Enter a string: ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = '\0';
while (true) {
printf("\nChoose an operation:\n");
printf("1. Insert\n2. Delete\n3. Find\n4. Compare\n5. Substring\n6. Concatenate\n7. Replace\n8. Exit\n");
int choice;
scanf("%d", &choice);
switch (choice) {
// 实现每个选项对应的函数调用
case 1:
// 插入操作
break;
// ...重复以上模式,为其他选项提供相应处理...
case 8:
free(input); // 注意释放内存
return 0;
default:
printf("Invalid choice.\n");
break;
}
}
return 0;
}
```
请记住,在实际项目中,可能还需要考虑错误处理和内存管理。在上面的示例中,`free(input)`只在`main`函数结束前执行,如果在中间退出程序,则需要确保正确清理内存。
阅读全文