/**
* 实验题目:
* 实现链串各种基本运算的算法
* 实验目的:
* 领会链串存储结构和掌握链串中各种基本运算的算法设计
* 实验内容:
* 实现链串的各种基本运算
* 1、建立串s="abcdefghijklmn"和串s1="123"
* 2、输出串s
* 3、输出串s的长度
* 4、在串s的第9个字符位置插入串s1而产生串s2
* 5、输出串s2
* 6、删除串s第2个字符开始的5个字符而产生串s2
* 7、输出串s2
* 8、将串s第2个字符开始的5个字符替换成串s1而产生串s2
* 9、输出串s2
* 10、提取串s的第2个字符开始的10个字符而产生串s3
* 11、输出串s3
* 12、将串s1和串s2连接起来而产生串s4
* 13、输出串s4
*/
#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>
typedef struct snode
{
char data; // 数据域
struct snode *next; // 指针域
}LinkStrNode; // 声明链串结点类型
/*-----------------将字符串常量赋给串s--------------------*/
static void str_assign(LinkStrNode *&s, char cstr[])
{
int index;
LinkStrNode *p, *r;
s = (LinkStrNode *)malloc(sizeof(LinkStrNode)); // 动态分配存储空间
r = s; // r指向新建链串的尾结点
for(index = 0; cstr[index] != '\0'; index++)
{
p = (LinkStrNode *)malloc(sizeof(LinkStrNode)); // 创建新的数据结点p
p->data = cstr[index]; // 新数据结点p的数据域赋值
r->next = p; // 尾插法建链表
r = p; // r指向新建的数据结点p
}
r->next = NULL; // 尾结点的next域为空
}
/*-----------------销毁串--------------------*/
static void destroy_str(LinkStrNode *&s)
{
LinkStrNode *pre = s; // pre指向链表头结点
LinkStrNode *p = s->next; // p指向链表中的第一个数据结点
while(p != NULL) // 扫描链串s
{
free(pre); // 释放pre结点
// pre,p同步后移一个结点
pre = p;
p = p->next;
}
// 循环结束时,p为NULL,pre指向尾结点,释放它
free(pre);
}
/*-----------------串复制--------------------*/
static void str_copy(LinkStrNode *&s, LinkStrNode *t) // 串t复制给串s
{
LinkStrNode *p = t->next;
LinkStrNode *q;
LinkStrNode *r;
s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
s->next = NULL;
r = s; // r始终指向尾结点
while(p != NULL) // 将t的所有结点复制到s
{
q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
q->data = p->data;
q->next = NULL;