编辑代码

//5.2.1 链串的定义
typedef struct snode
{
    char data;                                  //存放单个字符
    struct snode * next;
}LiString;                                      //声明链串结点类型

//5.2.2 创建链串
void StrAssign(LiString * &s,char t[])
{
    int i;
    LiString *r, *p;                            //r 始终指向尾结点
    s = (LiString * )malloc(sizeof(LiString));
    r = s;
    for(i = 0;t[i] != '0';i++)
    {
        p = (LiString * )malloc(sizeof(LiString));
        p -> data = t[i];                       //复制结点
        r -> next = p;
        r = p;
    }
    r -> next = NULL;                           //尾结点的 next 域置为 NULL
}

//5.2.3 复制串
void StrCopy(LiString * &s,LiString * t)
{
    LiString * p = next, * q, * r;
    s = (LiString * )malloc(sizeof(LiString));  //创建头结点
    r = s;                                      //r 始终指向尾结点
    while(p != NULL)                            //将 t 的所有结点复制到 s
    {
        q = (LiString * )malloc(sizeof(LiString));
        q -> data = p -> data;                  //复制结点
        r -> next = q;
        r = q;
        p = p -> next;
    }
    r -> next = NULL;                           //尾结点的 next 域置为 NULL
}

//5.2.4 求串长
int StrLength(LiString * s)
{
    int i = 0;
    LiString * p = s -> next;
    while(p != NULL)
    {
        i++;
        p = p -> next;
    }
    return i;
}

//5.2.5 连接串
LiString * Concat(LiString * ,LiString * t)
{
    LiString * str, * p = s -> next, * q, * r;
    str = (LiString * )malloc(sizeof(LiString));
    r = str;                                    //r 始终指向尾结点
    while(p != NULL)                            //将 s 的所有结点复制到 str
    {
        q = (LiString * )malloc(sizeof(LiString));
        q -> data = p -> data;
        q -> next = NULL;
        r -> next = q;
        r = q;
        p = p ->next;
    }
    p = t -> next;
    while(p != next)                            //将 t 的所有结点复制到 str
    {
        q = (LiString * )malloc(sizeof(LiString));
        q -> data = p -> data;
        q -> next = NULL;
        r -> next = q;
        r = q;
        p = p -> next;
    }
    r -> next = NULL;                           //尾结点的 next 域置为 NULL
    return str;
}

//5.2.6 求字串
LiString * SubStr(LiString * s,int i,int j)
{
    int k;
    LiString * str, * p = s -> next, * q, * r;
    str = (LiString * )malloc(sizeof(LiString));
    str -> next = NULL;                         //建立空串
    r = str;                                    //r 始终指向尾结点
    if(i <= 0 || i > StrLength(s) || j < 0 || i + j - 1 > StrLength(s))
        return str;                             //参数不正确时返回空串
    for(k = 1;k <= j;k++)                       //移动到第 i 个结点
        p = p -> next;
    for(k = 1;k <= j;k++)                       //将 s 的第 i 个结点开始的 j 个结点复制到 str
    {
        q = (LiString * )malloc(sizeof(LiString));
        q -> data = p -> data;
        q -> next = NULL;
        r -> next = q;
        r = q;
        p = p -> next;
    }
    r -> next = NULL;                           //尾结点的 next 域置为 NULL
    return str;
}

//5.2.7 插入串
LiString * InsStr(LiString * s,int i,LiString * t)
{
    int k;
    LiString * str, * p = s -> next, * p1 = t -> next, * q, * r;
    str = (LiString)malloc(sizeof(LiString));
    str -> next = NULL;                         //建立空串
    r = str;                                    //r 始终指向尾结点
    if(i <= 0 || i > StrLength(s) + 1)          //参数不正确时返回空串
        return str;
    for(k = 1;k < i;k++)                        //将 s 的前 i - 1 个结点复制到 str
    {
        q = (LiString * )malloc(sizeof(LiString));
        q -> data = p -> data;
        r -> next = q;
        r = q;
        p = p -> next;
    }
    while(p1 != NULL)                           //将 t 的所有结点复制到 str
    {
        q = (LiString * )malloc(sizeof(LiString));
        q -> data = p1 -> data;
        r -> next = q;
        r = q;
        p1 = p1 -> next;
    }
    while(p != NULL)                            //将结点 p 及其后的结点复制到 str
    {
        q = (LiString * )malloc(sizeof(LiString));
        q -> data = p -> data;
        r -> next = q;
        r = q;
        p = p -> next;
    }
    r -> next = NULL;                           //尾结点的 next 域置为 NULL
    return str;
}

//5.2.8 删除子串
LiString * DelStr(LiString * s,int i,int j)
{
    int k;
    LiString * str, * p = s -> next, * q, * r;
    str = (LiString * )malloc(sizeof(LiString));
    str -> next = NULL;                         //建立空串
    r = str;                                    //r 始终指向尾结点
    if(i <= 0 || i > StrLength(s) || j < 0 || i + j - 1 > StrLength(s))
        return str;                             //参数不正确时返回空串
    for(k = 0;k < i-1;k++)                      //将 s 的前 i - 1 个结点复制到 str
    {
        q = (LiString * )malloc(sizeof(LiString));
        q -> data = p -> data;
        r -> next = q;
        r = q;
        p = p -> next;
    }
    for(k = 0;k < j;k++)                        //让 p 沿 next 跳 j 个结点
        p = p -> next;
    while(p != NULL)                            //将结点 p 及其后的结点复制到 str
    {
        q = (LiString * )malloc(sizeof(LiString));
        q -> data = p -> data;
        r -> next = q;
        r = q;
        p = = -> next;
    }
    r -> next = NULL;                           //尾结点的 next 域置为 NULL
    return str;
}

//5.2.9 输出串
void DispStr(LiString * s)
{
    LiString * p = s -> next;
    while(p != NULL)
    {
        printf("%c",p -> data);
        p = p -> next;
    }
    printf("\n");
}