链串代码实现-C++

链串

数据声明

typedef struct snode
{
    char data;
    struct snode *next;
} LinkStrNode;

生成串

void StrAssign(LinkStrNode *&s, char cstr[])
{
    int i;
    LinkStrNode *r, *p;
    s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    r = s;
    for (i = 0; cstr[i] != '\0'; i++)
    {
        p = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        p->data = cstr[i];
        r->next = p;
        r = p;
    }
    r->next = NULL;
}

销毁串

void DestroyStr(LinkStrNode *&s)
{
    LinkStrNode *pre = s, *p = s->next;
    while (p != NULL)
    {
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
}

串的复制

void StrCopy(LinkStrNode *&s, LinkStrNode *t)
{
    // p用于遍历t
    // q用于存结点
    // r用于尾插
    LinkStrNode *p = t->next, *q, *r;
    s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    r = s;
    while (p != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
}

串相等

bool StrEqual(LinkStrNode *s, LinkStrNode *t)
{
    LinkStrNode *p = s->next, *q = t->next;
    while (p != NULL && q != NULL && p->data == q->data)
    {
        p = p->next;
        q = q->next;
    }
    if (p == NULL && q == NULL)
        return true;
    else
        return false;
}

求串长

int StrLength(LinkStrNode *s)
{
    int i = 0;
    LinkStrNode *p = s->next;
    while (p != NULL)
    {
        i++;
        p = p->next;
    }
    return i;
}

串连接

LinkStrNode *Concat(LinkStrNode *s, LinkStrNode *t)
{
    // p用于遍历s与t
    // q用于存结点
    // r用于尾插
    LinkStrNode *str, *p = s->next, *q, *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    r = str;
    while (p != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    p = t->next;
    while (p != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
    return str;
}

求子串

LinkStrNode *SubStr(LinkStrNode *s, int i, int j)
{
    int k;
    LinkStrNode *str, *p = s->next, *q, *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next = NULL;
    r = str;
    if (i <= 0 || i > StrLength(s) || j < 0 || i + j - 1 > StrLength(s))
        return str;
    for (k = 1; k < i; k++)
        p = p->next;
    for (k = 1; k <= j; k++)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
    return str;
}

插入子串

LinkStrNode *InsStr(LinkStrNode *s, int i, int j, LinkStrNode *t)
{
    int k;
    LinkStrNode *str, *p = s->next, *p1 = t->next, *q, *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next = NULL;
    r = str;
    if (i <= 0 || i > StrLength(s) + 1)
        return str;
    for (k = 1; k < i; k++)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    while (p1 != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p1->data;
        r->next = q;
        r = q;
        p1 = p1->next;
    }
    while (p != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
    return str;
}

LinkStrNod

删除子串

LinkStrNode *DelStr(LinkStrNode *s, int i, int j)
{
    int k;
    LinkStrNode *str, *p = s->next, *q, *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next = NULL;
    r = str;
    if (i <= 0 || i > StrLength(s) || j < 0 || i + j - 1 > StrLength(s))
        return str;
    for (k = 1; k < i; k++)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    for (k = 0; k < j; k++)
        p = p->next;
    while (p != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
    return str;
}

替换子串

LinkStrNode *RepStr(LinkStrNode *s, int i, int j, LinkStrNode *t)
{
    int k;
    LinkStrNode *str, *p = s->next, *p1 = t->next, *q, *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next = NULL;
    r = str;
    if (i <= 0 || i > StrLength(s) || j < 0 || i + j - 1 > StrLength(s))
        return str;
    for (k = 0; k < i - 1; k++)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    for (k = 0; k < j; k++)
        p = p->next;
    while (p1 != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p1->data;
        r->next = q;
        r = q;
        p1 = p1->next;
    }
    while (p != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
    return str;
}

输出串

void DispStr(LinkStrNode *s)
{
    LinkStrNode *p = s->next;
    while (p != NULL)
    {
        cout << p->data;
        p = p->next;
    }
    cout << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值