链串的基本运算

链串的基本运算如下:
(1)建立串s和串s1。
(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;  
static void StrAssign(LinkStrNode *&s, char cstr[])
{
    int index;
    LinkStrNode *p, *r;
    s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    r = s; 
    for(index = 0; cstr[index] != '\0'; index++)
    {
        p = (LinkStrNode *)malloc(sizeof(LinkStrNode)); 
        p->data = cstr[index]; 
        r->next = p;
        r = p; 
    }
    r->next = NULL;
}
static void DestroyStr(LinkStrNode *&s)
{
    LinkStrNode *pre = s; 
    LinkStrNode *p = s->next; 
    while(p != NULL) 
    {
        free(pre);
        pre = p;
        p = p->next;
    }
    free(pre);
}
static void StrCopy(LinkStrNode *&s, LinkStrNode *t) 
{
    LinkStrNode *p = t->next;
    LinkStrNode *q;
    LinkStrNode *r;
    s = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    s->next = NULL;
    r = s; 
    while(p != NULL) 
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
}
static bool StrEqual(LinkStrNode *s, LinkStrNode *t)
{
    LinkStrNode *p = s->next;
    LinkStrNode *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;
}
static int StrLength(LinkStrNode *s)
{
    int len = 0;
    LinkStrNode *p = s->next;
    while(p != NULL)
    {
        len++;
        p = p->next;
    }

    return len;
}
static LinkStrNode * Concat(LinkStrNode *s, LinkStrNode *t)
{
    LinkStrNode *str;
    LinkStrNode *p = s->next;
    LinkStrNode *q;
    LinkStrNode *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next = NULL;
    r = str; 
    while(p != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next;
    }
    p = t->next;
    while(p != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
    return str;
}
static LinkStrNode * SubStr(LinkStrNode *s, int pos, int len)
{
    int index;
    LinkStrNode *str;
    LinkStrNode *p = s->next;
    LinkStrNode *q;
    LinkStrNode *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next = NULL;
    r = str; 
    if((pos <= 0) || (pos >StrLength(s)) || (len < 0) || (pos + len - 1 >StrLength(s)))
        return str;
    for(index = 0; index < pos - 1; index++)
        p = p->next;
    for(index = 1; index <= len; index++) 
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
    return str;
}
static LinkStrNode * InsStr(LinkStrNode *s, int pos, LinkStrNode *t)
{
    int index;
    LinkStrNode *str;
    LinkStrNode *p = s->next;
    LinkStrNode *p1 = t->next;
    LinkStrNode *q;
    LinkStrNode *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next = NULL;
    r = str; 
    if(pos <= 0 || pos >StrLength(s) + 1) 
        return str;
    for(index = 1; index < pos; index++) 
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data; 
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next; 
    }
    while(p1 != NULL) 
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p1->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p1 = p1->next;
    }
    while(p != NULL) 
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL; 
    return str;
}
static LinkStrNode * DelStr(LinkStrNode *s, int pos, int len)
{
    int index;
    LinkStrNode *str;
    LinkStrNode *p = s->next;
    LinkStrNode *q;
    LinkStrNode *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next = NULL;
    r = str;
    if((pos <= 0) || (pos > StrLength(s)) || (len < 0) || (pos + len - 1 >StrLength(s))) 
        return str;
    for(index = 0; index < pos - 1; index++)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next;
    }
    for(index = 0; index < len; index++)
        p = p->next;
    while(p != NULL) 
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next;
    }
    r->next = NULL;
    return str;
}
static LinkStrNode * RepStr(LinkStrNode *s, int pos, int len, LinkStrNode *t)
{
    int index;
    LinkStrNode *str;
    LinkStrNode *p = s->next;
    LinkStrNode *p1 = t->next;
    LinkStrNode *q;
    LinkStrNode *r;
    str = (LinkStrNode *)malloc(sizeof(LinkStrNode));
    str->next = NULL;
    r = str; 
    if((pos <= 0) || (pos >StrLength(s)) || (len < 0) || (pos + len - 1 >StrLength(s))) 
        return str;
    for(index = 0; index < pos - 1; index++)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next;
    }
    for(index = 0; index < len; index++)
        p = p->next;
    while(p1 != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p1->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p1= p1->next;
    }
    while(p != NULL)
    {
        q = (LinkStrNode *)malloc(sizeof(LinkStrNode));
        q->data = p->data;
        q->next = NULL;
        r->next = q;
        r = q;
        p = p->next;
    }                                                  
    r->next = NULL;
    return str;
}
static void DispStr(LinkStrNode *s)
{
    LinkStrNode *p = s->next;

    while(p != NULL)
    {
        printf("%c", p->data);
        p = p->next;
    }
    printf("\n");
}

主函数

int main(int argc, char *argv[])
{
    LinkStrNode *s, *s1, *s2, *s3, *s4;
    printf("链串的基本运算如下:\n");
    printf("(1)建立串s和串s1\n");
    StrAssign(s, "abcdefghefghijklmn");
    StrAssign(s1, "xyz");
    printf("(2)输出串s:");
    DispStr(s);
    printf("(3)串s的长度:%d\n", StrLength(s));
    printf("(4)在串s的第9个字符位置插入串s1而产生串s2\n");
    s2 = InsStr(s, 9, s1);
    printf("(5)输出串s2:");
    DispStr(s2);
    printf("(6)删除串s第2个字符开始的5个字符而产生串s2\n");
    s2 = DelStr(s, 2, 5);
    printf("(7)输出串s2:");
    DispStr(s2);
    printf("(8)将串s第2个字符开始的5个字符替换成串s1而产生串s2\n");
    s2 = RepStr(s, 2, 5, s1);
    printf("(9)输出串s2:");
    DispStr(s2);
    printf("(10)提取串s的第2个字符开始的10个字符而产生串s3\n");
    s3 =SubStr(s, 2, 10);
    printf("(11)输出串s3:");
    DispStr(s3);
    printf("(12)将串s1和串s2连接起来而产生串s4\n");
    s4 = Concat(s1,s2);
    printf("(13)输出串s4:");
    DispStr(s4);
    DestroyStr(s);
    DestroyStr(s1);
    DestroyStr(s2);
    DestroyStr(s3);
    DestroyStr(s4);
    return 0;
}

运行结果:
链串的基本运算

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OLoyy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值