用串的堆式存储,并且没有#include<string.h>这条语句,编写串的插入代码
时间: 2024-03-02 08:53:39 浏览: 84
好的,我可以为您提供一个基于堆式存储的串插入代码示例,不需要使用`<string.h>`库函数。具体实现方式如下:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100 // 串的最大长度
typedef struct {
char *data; // 存储串的字符数组指针
int length; // 串的当前长度
int max_size; // 串的最大长度
} String;
// 创建空串
void init_string(String *s) {
s->data = (char *) malloc(MAX_SIZE * sizeof(char));
s->length = 0;
s->max_size = MAX_SIZE;
}
// 销毁串
void destroy_string(String *s) {
free(s->data);
s->data = NULL;
s->length = 0;
s->max_size = 0;
}
// 插入子串
void insert_string(String *s, int pos, char *t) {
int len_t = 0; // 子串的长度
while (t[len_t] != '\0') {
len_t++;
}
// 判断插入位置是否合法
if (pos < 1 || pos > s->length + 1) {
printf("Error: invalid position!\n");
return;
}
// 判断是否需要扩容
if (s->length + len_t > s->max_size) {
s->data = (char *) realloc(s->data, (s->length + len_t) * sizeof(char));
s->max_size = s->length + len_t;
}
// 从插入位置开始,将后面的字符往后移
for (int i = s->length - 1; i >= pos - 1; i--) {
s->data[i + len_t] = s->data[i];
}
// 将子串插入到指定位置
for (int i = 0; i < len_t; i++) {
s->data[pos + i - 1] = t[i];
}
// 更新串的长度
s->length += len_t;
}
int main() {
String s;
init_string(&s);
s.data[0] = 'H';
s.data[1] = 'e';
s.data[2] = 'l';
s.data[3] = 'l';
s.data[4] = 'o';
s.length = 5;
printf("Before insertion: ");
for (int i = 0; i < s.length; i++) {
printf("%c", s.data[i]);
}
printf("\n");
insert_string(&s, 3, "lucky");
printf("After insertion: ");
for (int i = 0; i < s.length; i++) {
printf("%c", s.data[i]);
}
printf("\n");
destroy_string(&s);
return 0;
}
```
在该示例中,我们首先定义了一个结构体 `String`,其中包含了一个字符数组指针 `data`,串的长度 `length` 和最大长度 `max_size`。使用 `init_string` 函数可以创建一个空的串,使用 `destroy_string` 函数可以销毁串。
插入子串的函数为 `insert_string`,其中 `pos` 表示要插入的位置,`t` 表示要插入的子串。该函数先判断插入位置是否合法,然后判断是否需要扩容,接着将插入位置后面的字符往后移,最后将子串插入到指定位置。在本例中,我们将一个已有的串 "Hello",在第三个位置插入子串 "lucky",得到的新串为 "Heluckylo"。
阅读全文