链串实现建串、输入串、输出串、插入串、删除串、取子串、串连接、 串替换、求串长等。程序设计完整代码含注释
时间: 2023-08-09 22:10:45 浏览: 51
好的,我可以为您提供链串实现的代码,但是需要您先确定使用哪种编程语言。以下是使用C语言实现链串操作的代码,包含详细的注释说明:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//定义链表结构体
typedef struct node {
char data;
struct node *next;
} Node;
//定义链串结构体(链表头指针和串长)
typedef struct {
Node *head;
int length;
} LString;
//初始化链串(创建链表头结点)
void InitLString(LString *s) {
s->head = (Node *)malloc(sizeof(Node));
s->head->next = NULL;
s->length = 0;
}
//销毁链串(释放链表空间)
void DestroyLString(LString *s) {
Node *p = s->head->next, *q;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
free(s->head);
s->head = NULL;
s->length = 0;
}
//清空链串(删除所有结点,只剩下头结点)
void ClearLString(LString *s) {
Node *p = s->head->next, *q;
while (p != NULL) {
q = p->next;
free(p);
p = q;
}
s->head->next = NULL;
s->length = 0;
}
//判断链串是否为空
int LStringEmpty(LString *s) {
if (s->length == 0) {
return 1;
}
return 0;
}
//求链串长度
int LStringLength(LString *s) {
return s->length;
}
//输出链串
void PrintLString(LString *s) {
Node *p = s->head->next;
while (p != NULL) {
printf("%c", p->data);
p = p->next;
}
printf("\n");
}
//根据字符串创建链串
void CreateLString(LString *s, char *str) {
int len = strlen(str);
Node *p, *q = s->head;
for (int i = 0; i < len; i++) {
p = (Node *)malloc(sizeof(Node));
p->data = str[i];
p->next = NULL;
q->next = p;
q = p;
s->length++;
}
}
//插入子串(在指定位置插入一个链串)
int LStringInsert(LString *s, int pos, LString *t) {
if (pos < 1 || pos > s->length + 1) {
return 0;
}
Node *p = s->head, *q = t->head->next, *r;
for (int i = 1; i < pos; i++) {
p = p->next;
}
while (q != NULL) {
r = (Node *)malloc(sizeof(Node));
r->data = q->data;
r->next = p->next;
p->next = r;
p = r;
q = q->next;
s->length++;
}
return 1;
}
//删除子串(删除指定位置和长度的子串)
int LStringDelete(LString *s, int pos, int len) {
if (pos < 1 || pos + len - 1 > s->length) {
return 0;
}
Node *p = s->head, *q;
for (int i = 1; i < pos; i++) {
p = p->next;
}
for (int i = 0; i < len; i++) {
q = p->next;
p->next = q->next;
free(q);
s->length--;
}
return 1;
}
//取子串(返回指定位置和长度的子串)
int SubString(LString *s, int pos, int len, LString *t) {
if (pos < 1 || pos + len - 1 > s->length) {
return 0;
}
Node *p = s->head->next, *q = t->head;
for (int i = 1; i < pos; i++) {
p = p->next;
}
for (int i = 0; i < len; i++) {
Node *r = (Node *)malloc(sizeof(Node));
r->data = p->data;
r->next = NULL;
q->next = r;
q = r;
p = p->next;
t->length++;
}
return 1;
}
//连接链串(将两个链串连接在一起)
int Concat(LString *s, LString *t) {
Node *p = s->head;
while (p->next != NULL) {
p = p->next;
}
p->next = t->head->next;
s->length += t->length;
return 1;
}
//替换子串(将链串中指定位置和长度的子串替换为另一个链串)
int Replace(LString *s, int pos, int len, LString *t) {
if (pos < 1 || pos + len - 1 > s->length) {
return 0;
}
Node *p = s->head, *q;
for (int i = 1; i < pos; i++) {
p = p->next;
}
for (int i = 0; i < len; i++) {
q = p->next;
p->next = q->next;
free(q);
s->length--;
}
p = p->next;
Node *r = t->head->next;
while (r != NULL) {
q = (Node *)malloc(sizeof(Node));
q->data = r->data;
q->next = p;
p = q;
r = r->next;
s->length++;
}
return 1;
}
int main() {
LString s, t;
InitLString(&s);
InitLString(&t);
//测试建串
CreateLString(&s, "Hello, world!");
PrintLString(&s);
//测试插入、删除子串
CreateLString(&t, "Python");
LStringInsert(&s, 8, &t);
PrintLString(&s);
LStringDelete(&s, 8, 6);
PrintLString(&s);
//测试取子串
InitLString(&t);
SubString(&s, 1, 5, &t);
PrintLString(&t);
//测试连接链串
InitLString(&t);
CreateLString(&t, "Java");
Concat(&s, &t);
PrintLString(&s);
//测试替换子串
InitLString(&t);
CreateLString(&t, "C++");
Replace(&s, 1, 5, &t);
PrintLString(&s);
//清空链串
ClearLString(&s);
PrintLString(&s);
//销毁链串
DestroyLString(&s);
DestroyLString(&t);
return 0;
}
```