字符串的链式存储和操作

字符串的链式存储和操作

lixiangrong
2024-01-29 / 0 评论 / 28 阅读 / 正在检测是否收录...

字符串的链式存储和操作

#include <stdio.h>
#include <stdlib.h>

typedef struct linkNode
{
    char data;
    struct linkNode *next;
}node, *linkStr;

// 1.初始化字符串
void init(linkStr *s)
{
    *s = NULL;
}

// 2.输出字符串
void display(linkStr s)
{
    if(!s)
    {
        printf("字符串为空!\n");
        return;
    }
    while (s)
    {
        printf("%c",s->data);
        s = s->next;
    }
    printf("\n");
}

// 3.根据用户输入构造字符串
void strCreate(linkStr *s)
{
    char c;
    node *p, *r = *s;
    printf("请输入字符,回车表示结束输入...\n");
    while ((c = getchar()) != '\n')
    {
        p = (node*) malloc(sizeof(node));
        p->data = c;
        if(!*s)
            *s = p;
        else
            r->next = p;
        r = p;
    }
    if(r) r->next = NULL;
}

// 4.查找第i个字符
node *find(linkStr s, int i)
{
    if(i < 1 || !s)
        return NULL;
    if(i == 1)
        return s;
    int j = 1;
    while (s && i!=j)
    {
        s = s->next;
        j++;
    }
    return s;
}

// 5.将字符串t插入字符串s中第i个字符开始的位置上
void strInsert(linkStr *s, int i, linkStr t)
{
    if(!t)
        return;
    if(i < 1)
    {
        printf("非法的插入操作!\n");
        return;
    }
    node *p = find(*s,i-1),*r = t;
    while (r->next)
        r = r->next;
    if(i == 1)
    {
        r->next = *s;
        *s = t;
        return;
    }
    if(p)
    {
        r->next = p->next;
        p->next = t;
        // t还需删除
    } else
        printf("非法的插入操作!\n");
}

// 6.将串s从第i个字符起删除len个长度的子串
void strDel(linkStr *s, int i, int len)
{
    if(!*s)
    {
        printf("字符串为空,无法删除!\n");
        return;
    }
    if(i < 1 || len < 1)
    {
        printf("非法的删除操作!\n");
        return;
    }
    node *pre = *s,*r,*q;
    int j = 1;
    while (pre && j < i-1) // 找到删除的前驱结点
    {
        pre = pre->next;
        j++;
    }
    j = 0;
    r = pre;
    while (r && j < len) // 找到删除的最后一个结点
    {
        j++;
        if(pre == *s && j == 1)
            continue;
        r = r->next;
    }
    if(r)
    {
        if(pre == *s)
        {
            q = pre;
            *s = r->next;
            free(q);
        } else
        {
            pre->next = r->next;
            pre = pre->next;
            while (pre != r->next)
            {
                q = pre;
                free(q);
                pre = pre->next;
            }
        }
    } else
        printf("非法的删除操作!\n");
}

// 7.字符串的连接运算
void strConcat(linkStr *s,linkStr t)
{
    node *p = *s;
    if(!t) // t为空串时
        return;
    if(!*s) // s为空串时
        *s = t;
    else
    {
        while (p->next) // 找到s的尾结点
            p = p->next;
        p->next = t;
    }
}

// 8.截取子串
linkStr substring(linkStr s, int i, int len)
{
    linkStr t; // 字串
    init(&t);
    if(i < 1 || len < 1)
    {
        printf("非法的截取操作!\n");
        return t;
    }
    node *p = s,*q,*r,*n; // p、q为主串工作指针,r指向字串尾指针
    int j = 1;
    while (p && j < i) // 寻找第i个结点
    {
        p = p->next;
        j++;
    }
    q = p,j = 1;
    while (q && j < len) // 寻找第i+len-1个结点
    {
        j++;
        q = q->next;
    }
    if(!q) // 表示超过s的边界
    {
        printf("非法的截取操作!\n");
        return t;
    }
    while (p != q->next)
    {
        n = (node*) malloc(sizeof(node));
        n->data = p->data;
        if(!t) // 处理首结点
            t = n;
        else
            r->next = n;
        r = n; // 更新尾指针
        p = p->next;
    }
    r->next = NULL; // 处理字串尾部
    return t;
}

int main()
{
    linkStr str,t,s;
    init(&str);
    init(&t);
    strCreate(&str);
    printf("字符串str: ");
    display(str);
    strCreate(&t);
    printf("字符串t: ");
    display(t);
    int i = 1,len = 5;
    printf("将字符t插到str中的第%d个字符开始的位置上\n",i);
    strInsert(&str,i,t);
    printf("字符串str: ");
    display(str);
    printf("将串str从第%d个字符起删除%d个长度的子串\n",i,len);
    strDel(&str,i,len);
    printf("字符串str: ");
    display(str);
    init(&t);
    strCreate(&t);
    printf("字符串t: ");
    display(t);
    printf("把字符串t拼接在str后\n");
    strConcat(&str,t);
    printf("字符串str: ");
    display(str);
    s = substring(str,i,len);
    printf("字符串str从第%d个字符开始长度为%d的子串:\n",i,len);
    display(s);
    return 0;
}
0

评论 (0)

取消