串的链式存储结构操作

如题:假设以结点大小为l(且附设头结点)的链表结构表示串。试编写实现下列六种串的基本操作 StrAssign, StrCopy, StrCompare, StrLength, Concat和 SubString的函数。
目录
[toc]

PS:

下面是伪代码,不能直接运行,可以进行转换成C语言代码在运行最重要的是这些代码还没有经过验证,可能会有些地方错误,但是 方法是正确的

1.存储结构

//串的链式存储表示
typedef struct{
    char ch
    LStrNode *next;
}LStrNode,*LString;

2.生成值相等的串常量

Status StrAssign(LString &s,LString t)
{
    s = (LStrNode*)malloc(sizeof(LStrNode));        //创建头结点
    if(!s)
        exit(0);
    for(p = s,q = t -> next;q;q = q -> next,p = p -> next)
    {
        r = (LStrNode*)malloc(sizeof(LStrNode));    //创建新节点
        if(!r)
            exit(0);
        r -> ch = q -> ch;                          
        p -> next = r;                              //链接新节点
        p = r;
    }
    p -> next = NULL;
}

3.字符串复制

Status StrCopy(LString &s,LString t)
{
    //将t的部分信息复制到s
    for(p = s -> next,q = t -> next;p&&q;q = q -> next,p = p -> next)
    {
        p -> ch = q -> ch;
        pre = p;                        //保存s的尾节点地址
    }
    while(q)   //s长度不够需要增加长度
    {
        p = (LStrNode*)malloc(sizeof(LStrNode));    //创建新节点
        if(!r)
            exit(0);
        p -> ch = q -> ch;

        pre -> next = p;
        pre = p;
    }
    p -> next = NULL;
}

4.字符串比较

int StrCompare(LString s,LString t)
{
    p = s;
    q = t;
    while(p && q && p -> ch == q ->ch)
    {
        p = p -> next;
        q = q -> next;
    }
    if(p && q)
    {
        return 0;   //不相等
    }
    else
    {
        return 1;   //相等
    }
}

5.串长度

int StrLength(LString s)
{
    for(i = 0,p = s -> next;p;i++,p = p -> next);
    return i;
}

6.串连接

Status Concat(LString &s,LString t1, LString t2)
{
    s = (LStrNode*)malloc(sizeof(LStrNode));        //创建头结点
    if(!s)
        exit(0);
    for(i = 0,q = t1 -> next;q;i++,q -> next);
    for(j = 0,r = t2 -> next;r;i++,r -> next);

    for(k = 0,p = s -> next,q = t1 - > next;k < i; k++,p = p -> next,q = q -> next)
    {
        tem = (LStrNode*)malloc(sizeof(LStrNode));
        if(!tem)
            exit(0);
        tem -> ch = t1 -> ch;

        p -> next = tem;
        p = tem;
    }
    for(k = 0,q = t2 - > next;k < i; k++,p = p -> next,q = q -> next)
    {
        tem = (LStrNode*)malloc(sizeof(LStrNode));
        if(!tem)
            exit(0);
        tem -> ch = t2 -> ch;

        p -> next = tem;
        p = tem;
    }
    p -> next = NULL;
}

7.用sub返回串s的第pos个字符起长度为len的子串

Status SubString(LString &sub,LString s,int pos,int len)
{
    i = StrLength(s);       //获得串s 长度
    if(pos < 1 || pos > i)
        return error;
    p = s -> next;
    j = 1;

    while(j != pos)         //定位到pos
    {
        p = p -> next;
        j++;
    }

    for(;j < pos + len;j++)//复制ch
    {
        sub -> ch = p -> next;
        p = p -> next;
        sub = sub -> next;
    }
    sub -> next = NULL;
}
(1)用表头的链表存放输入的数据,每读入一个数,按升序顺序插入到链表中,链表中允许两个结点有相同链表头结点存放链表后面的结点个数,初始化就生成头结点(初为0)。链表翻转是把数据逆序(变成降序),注意,头结点不动。翻转后要再翻转一次,恢复升序后才能插入新元素,否则会出错。 (2)先定义堆栈的几个基本操作,再设计一主函数利用堆的操作完成以下功能:假设一个算术表达式中可以包含三种括号:()[]{},且这三种括号可以按任意次序嵌套使用(如:...[...{...}...[...]...]...(...))。编写判别给定表达式中所含括号是否正确配对出现的算法,已知表达式已存入数据元素为字符的单链表中。 (3)先定义队列的几个基本操作,再设计一主函数利用队列的操作完成以下功能:键盘输入的字符可以临存入键盘的缓冲区中。为了充分利用缓冲区的空间,往往将缓冲区设计成链式循环队列的结构,并为循环队列结构的缓冲区设置一个队首指针和一个队尾指针。每输入一个字符到缓冲区中,就将尾指针后移,链入缓冲区的循环队列之中;每输出一个字符号,就将队头指针前移,将它从缓冲队列中删除。假设有两个进程同存在于一个应用程序中,第一个进程连续在屏幕上显示字符“X”,第二个进程不断检查键盘上是否有输入,若有则读入用户键入的字符,将其保存到键盘缓冲区中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值