2021-10-5【数据结构/严蔚敏】【串的堆分配存储表示】【代码实现算法4.4实现】

这篇博客详细介绍了数据结构中线性表的各种实现,包括顺序表、单链表、静态链表、双向链表以及带头结点的线性表。同时,涵盖了栈和队列的基本操作,如顺序栈、链式栈、迷宫求解和表达式求值。此外,还探讨了串的定长顺序存储和堆分配存储表示,以及相关操作函数的代码实现。内容覆盖了数据结构的基础操作和算法实现,适合初学者和进阶者学习。

线性表

栈&队列

二叉树

持续更新中,尽请期待!!!

#include<bits/stdc++.h>
using namespace std;
#define Status int
//---------串的堆分配存储表示--------------------
typedef struct{
	char *ch;//按照需要分配内存
	int length;//串长度
}HString;
//---------基本操作的函数原型说明-----------------
Status StrAssign(HString &T,char *chars){
	int i;				//i为chars的长度
	char *c;
    for (i = 0, c = chars; *c; i++, c++);
    if (!i){
        T.ch = NULL;
        T.length = 0;
    }
	else{
        T.ch = (char *)malloc(sizeof(char) * i);
        if (!T.ch)
            exit(_OVERFLOW);
        int tempi = 0;
        char *head = T.ch;
        do
        {
            tempi++;
            *T.ch = *chars;
            T.ch++;
            chars++;

        } while (tempi != i);
        T.ch = head;
        T.length = i;
        return 1;
	}
}

Status StrLength(HString S){
	return S.length;
}

Status StrCompare(HString S,HString T){
    for (int i = 0; i < S.length && i < T.length; i++)
        if (S.ch[i] != T.ch[i])
            return S.ch[i] - T.ch[i];
    return S.length - T.length;
}

Status ClearString(HString &S){
	if(S.ch){
        free(S.ch);
        S.ch = NULL;
    }
    S.length = 0;
    return 1;
}

Status Concat(HString &T,HString S1,HString S2)
{
	if (T.ch){
		free(T.ch);
	}
    T.length = StrLength(S1) + StrLength(S2);
    T.ch = (char *)malloc(sizeof(char) * T.length);
    if (!T.ch){
        exit(_OVERFLOW);
    }
    char *head = T.ch;
    for (int i = 0; i < StrLength(S1); i++){
        *T.ch = *S1.ch;
        T.ch++;
        S1.ch++;
	}
    for (int i = StrLength(S1) - 1; i < T.length; i++){
        *T.ch = *S2.ch;
        T.ch++;
		S2.ch++;
	}
    T.ch = head;
    return 1;
}

Status SubString(HString &Sub,HString S,int pos,int len){
    if (pos < 1 || pos > S.length || len < 0 || len > S.length - pos + 1)
        return 0;
    if (Sub.ch)
        free(Sub.ch);
    if (!len){
        Sub.ch = NULL;
        Sub.length = 0;
        return 1;
    }else{
        Sub.ch = (char *)malloc(sizeof(char) * len);
        Sub.length = len;
        char *head = Sub.ch;
        S.ch += pos - 1;
        for (int i=0;i<len;i++){
            *Sub.ch = *S.ch;
            Sub.ch++;
			S.ch++;
        }
        Sub.ch = head;
        return 1;
    }
}
//算法4.4
Status StrInsert(HString &S,int pos,HString T){
    int i;
    if (pos < 1 || pos > S.length + 1)
        return 0;
    if(T.length){
        if(!(S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char))))
            exit(_OVERFLOW);
        for (i = S.length - 1; i >= pos - 1;i--)
            S.ch[i + T.length] = S.ch[i];
        for (i = 0; i <= T.length - 1; i++)
            S.ch[i + pos - 1] = T.ch[i];
        S.length += T.length;
    }
    return 1;
}

void prinfStr(HString S)
{
	for (int i=0;i<S.length;i++)
	{
		printf("%c",*S.ch);
		S.ch++;
	}
	printf("\n");
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Eternity_GQM

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

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

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

打赏作者

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

抵扣说明:

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

余额充值