S是用结点大小为4的单链表存储的串,用C语言分别编写算法,实现在第k个字符后插入串T,并从第k个字符起删除len个字符。
时间: 2023-06-19 10:05:17 浏览: 121
以下是用单链表实现插入和删除操作的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义节点结构体
typedef struct Node {
char data;
struct Node *next;
} Node;
// 定义串结构体
typedef struct String {
Node *head;
int length;
} String;
// 创建节点
Node* createNode(char data) {
Node *node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
return node;
}
// 初始化串
void initString(String *str) {
str->head = createNode(' '); // 头结点存储空格字符
str->length = 0;
}
// 销毁串
void destroyString(String *str) {
Node *p = str->head;
while (p != NULL) {
Node *q = p;
p = p->next;
free(q);
}
}
// 插入串T
void insertString(String *str, int k, char *T) {
int len = strlen(T);
if (k < 1 || k > str->length + 1) {
printf("Error: invalid position %d\n", k);
return;
}
Node *p = str->head;
for (int i = 1; i < k; i++) {
p = p->next;
}
for (int i = 0; i < len; i++) {
Node *node = createNode(T[i]);
node->next = p->next;
p->next = node;
str->length++;
p = node;
}
}
// 删除len个字符
void deleteString(String *str, int k, int len) {
if (k < 1 || k > str->length - len + 1) {
printf("Error: invalid position %d\n", k);
return;
}
Node *p = str->head;
for (int i = 1; i < k; i++) {
p = p->next;
}
Node *q = p->next;
for (int i = 0; i < len; i++) {
Node *tmp = q;
q = q->next;
free(tmp);
str->length--;
}
p->next = q;
}
// 输出串
void printString(String *str) {
Node *p = str->head->next;
while (p != NULL) {
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
int main() {
String str;
initString(&str);
insertString(&str, 1, "hello");
printString(&str); // 输出: hello
insertString(&str, 3, "world");
printString(&str); // 输出: he worldllo
deleteString(&str, 6, 5);
printString(&str); // 输出: he wo
destroyString(&str);
return 0;
}
```
使用示例:
```c
String str;
initString(&str);
insertString(&str, 1, "hello");
insertString(&str, 3, "world");
deleteString(&str, 6, 5);
printString(&str); // 输出: he wo
destroyString(&str);
```
阅读全文