链串实现建串、输入串(键盘输入)、输出串、插入串、删除串、取子串、串连接、串替换(指定位置替换)、求串长等运算。程序设计完整代码含函数设计思想,详细注释
时间: 2023-08-15 08:06:24 浏览: 42
好的,下面是链串的完整代码,包含各种基本操作的实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义链式存储结构体
typedef struct node {
char data;
struct node *next;
} Node, *LinkStr;
// 初始化链串
void InitLinkStr(LinkStr *s) {
*s = (LinkStr) malloc(sizeof(Node));
(*s)->next = NULL;
}
// 从键盘输入字符串
void StrInput(LinkStr s) {
char c;
LinkStr p = s;
while ((c = getchar()) != '\n') {
LinkStr tmp = (LinkStr) malloc(sizeof(Node));
tmp->data = c;
tmp->next = NULL;
p->next = tmp;
p = p->next;
}
}
// 输出链串
void StrOutput(LinkStr s) {
LinkStr p = s->next;
while (p != NULL) {
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
// 插入链串
void StrInsert(LinkStr s, int pos, LinkStr t) {
int i = 0;
LinkStr p = s;
while (p != NULL && i < pos - 1) {
p = p->next;
i++;
}
if (p == NULL || i > pos - 1) {
printf("Insert failed!\n");
return;
}
LinkStr q = t->next;
while (q != NULL) {
LinkStr tmp = (LinkStr) malloc(sizeof(Node));
tmp->data = q->data;
tmp->next = p->next;
p->next = tmp;
p = p->next;
q = q->next;
}
}
// 删除链串
void StrDelete(LinkStr s, int pos, int len) {
int i = 0;
LinkStr p = s;
while (p != NULL && i < pos - 1) {
p = p->next;
i++;
}
if (p == NULL || i > pos - 1) {
printf("Delete failed!\n");
return;
}
LinkStr q = p->next;
i = 0;
while (q != NULL && i < len) {
LinkStr tmp = q;
q = q->next;
free(tmp);
i++;
}
p->next = q;
}
// 取子串
void SubStr(LinkStr s, int pos, int len, LinkStr *t) {
int i = 0;
LinkStr p = s->next;
*t = (LinkStr) malloc(sizeof(Node));
LinkStr q = *t;
while (p != NULL && i < pos - 1) {
p = p->next;
i++;
}
if (p == NULL || i > pos - 1) {
printf("SubStr failed!\n");
return;
}
i = 0;
while (p != NULL && i < len) {
LinkStr tmp = (LinkStr) malloc(sizeof(Node));
tmp->data = p->data;
tmp->next = NULL;
q->next = tmp;
q = q->next;
p = p->next;
i++;
}
}
// 串连接
void Concat(LinkStr s, LinkStr t, LinkStr *r) {
LinkStr p = s->next;
*r = (LinkStr) malloc(sizeof(Node));
LinkStr q = *r;
while (p != NULL) {
LinkStr tmp = (LinkStr) malloc(sizeof(Node));
tmp->data = p->data;
tmp->next = NULL;
q->next = tmp;
q = q->next;
p = p->next;
}
p = t->next;
while (p != NULL) {
LinkStr tmp = (LinkStr) malloc(sizeof(Node));
tmp->data = p->data;
tmp->next = NULL;
q->next = tmp;
q = q->next;
p = p->next;
}
}
// 串替换
void StrReplace(LinkStr s, int pos, int len, LinkStr t) {
int i = 0;
LinkStr p = s;
while (p != NULL && i < pos - 1) {
p = p->next;
i++;
}
if (p == NULL || i > pos - 1) {
printf("Replace failed!\n");
return;
}
LinkStr q = t->next;
i = 0;
while (q != NULL) {
LinkStr tmp = (LinkStr) malloc(sizeof(Node));
tmp->data = q->data;
tmp->next = p->next;
p->next = tmp;
p = p->next;
q = q->next;
i++;
}
StrDelete(s, pos+i, len);
}
// 求串长
int StrLength(LinkStr s) {
int len = 0;
LinkStr p = s->next;
while (p != NULL) {
len++;
p = p->next;
}
return len;
}
int main() {
LinkStr s, t, r;
InitLinkStr(&s);
InitLinkStr(&t);
printf("Please input string s:\n");
StrInput(s);
printf("Please input string t:\n");
StrInput(t);
printf("String s is: ");
StrOutput(s);
printf("String t is: ");
StrOutput(t);
printf("After insert t into s from position 3:\n");
StrInsert(s, 3, t);
StrOutput(s);
printf("After delete 3 characters from position 3:\n");
StrDelete(s, 3, 3);
StrOutput(s);
printf("The sub string of s from position 2 with length 4 is:\n");
SubStr(s, 2, 4, &r);
StrOutput(r);
printf("The concat string of s and t is:\n");
Concat(s, t, &r);
StrOutput(r);
printf("After replace 3 characters from position 4 with t:\n");
StrReplace(s, 4, 3, t);
StrOutput(s);
printf("The length of s is %d\n", StrLength(s));
printf("The length of t is %d\n", StrLength(t));
return 0;
}
```
以上代码实现了链串的初始化、输入、输出、插入、删除、子串、连接、替换、求长度等基本操作。