/*
数据结构——串笔记串:由零个或多个字符组成的有限序列。 串也有两种储存方式,顺序储存和链式储存 1.顺序表示的串——顺序串一般使用字符型数组储存。确定串的长度有两种方法。一是:在串的末尾加一个结束标记(在C语言中系统自动在串值的末尾加一个'\0'作为结束标记 ),再使用 strlen函数得到串的长度。二是:增加一个变量 len 用来储存串的长度。
*/ // 顺序串的实现即基本操作

# include <stdio.h>
# include <stdlib.h>
# include <malloc.h>// 定义一个穿的最大长度
# define MAXSIZE 50  // 储存结构,此处采用增加一个变量 len 用来储存串的长度
struct String
{char * str;int len;
};
// 串的创建
void Create_String(String * S);
// 串的初始化
void Init_String(String * S);
// 串的赋值
void String_Assign(String * S, char * str);
// 串的遍历
void Travel_String(String * S);
// 判断串是否为空
bool Is_Empty(String * S);
// 求串的长度
int String_Length(String * S);
// 串的复制
void String_Copy(String * S, String * T);
// 比较两个串的大小,返回两个串的长度的差值
int String_Compare(String * S, String * T);
// 在串S的pos位置插入串T
void String_Insert(String * S, String * T, int pos);
// 删除串S中从位置pos开始的len个字符
bool String_Delete(String * S, int pos, int len);
// 将串T连接到串S的末尾
void Strint_Concat(String * S, String * T);
// 清空串
void String_Clear(String * S); int main(void)
{String str1;Create_String(&str1);Init_String(&str1);char ch1[20] = "AAAA";String_Assign(&str1, ch1);Travel_String(&str1);return 0;
}void Create_String(String * S)
{S->str = (char *)malloc(sizeof(char) * MAXSIZE);if (NULL == S->str){printf("动态内存分配失败!\n");exit(-1);}return;
}void Init_String(String * S)
{S->len = 0;return;
}void String_Assign(String * S, char * str)
{int cnt;for (cnt = 0; str[cnt] != '\0'; ++cnt){S->str[cnt] = str[cnt];}S->len = cnt;return;
}void Travel_String(String * S)
{int i;for (i = 0; i < S->len; ++i){printf("%c", S->str[i]);}printf("\n");return;
}bool Is_Empty(String * S)
{if (0 == S->len){return true;}else{return false;}
}int String_Length(String * S)
{return S->len;
}void String_Copy(String * S, String * T)
{int i;S->len = T->len;for (i = 0; i < T->len; ++i){S->str[i] = T->str[i];}S->str[S->len] = '\0'; return;
}int String_Compare(String * S, String * T)
{int i;for (i = 0; i < T->len; ++i){if (S->str[i] != T->str[i]){return (S->str[i] - T->str[i]);    //如果有不相等的字符,返回两字符的ASCII码差值
        }}return (S->len - T->len);  // 如果比较完毕,返回两串长度的差值
}void String_Insert(String * S, String * T, int pos)
{int i;if ((pos < 0) || ((pos-1) > S->len)){printf("插入位置有误!\n");exit(-1);}// 细节说明 pos位置的下标为 pos,即是在S串的第pos个字符后面插入 if ((pos + T->len) <= MAXSIZE && (S->len + T->len) > MAXSIZE)  // 子串T可完全插入,但位置不够,S串需要有字符被截取掉
    {for (i = 0; i < (MAXSIZE - pos - T->len); ++i)  // 原S串中从pos+1个字符开始有MAXSIZE - pos - T->len个字符需要后移
        {S->str[MAXSIZE - i - 1] = S->str[MAXSIZE - T->len -i - 1];}for (i = 0; i < T->len; ++i){S->str[pos + i] = T->str[i];} S->len = MAXSIZE;}else if ((pos + T->len) > MAXSIZE)  // 子串T不能被完整插入
    {for (i = 0; i < MAXSIZE - pos; ++i)   // 插入字符到串满
        {S->str[pos+i] = T->str[i];}S->len = MAXSIZE;} else  // 子串T可以被完全插入,且串S不需要截取
    {for (i = 0; i < (T->len - pos); ++i)  // 原S串中从pos+1个字符开始每个向后移T->len位
        {S->str[S->len + T->len - 1 -i] = S->str[S->len - 1 - i];}for (i = 0; i < T->len; ++i){S->str[pos + i] = T->str[i];}S->len += T->len;} return;
} bool String_Delete(String * S, int pos, int len)
{int i;if (pos < 0 || len < 0 || pos + len - 1 > S->len){printf("删除位置不对!\n");return false;}else{for (i = pos+len; i <= S->len-1; ++i){S->str[i - len] = S->str[i];}S->len -= len;return true; }
}void Strint_Concat(String * S, String * T)
{int i;if (S->len + T->len <= MAXSIZE)  // 连接后串的长度小于MAXSIZE
    {for (i = 0; i < T->len; ++i){S->str[S->len + i] = T->str[i];} S->len += T->len;}else  // 连接后串的长度大于MAXSIZE
    {for (i = 0; i < MAXSIZE-S->len; ++i){S->str[S->len + i] = T->str[i];}S->len = MAXSIZE;} return;
}void String_Clear(String * S)
{free(S->str);S->str = NULL;S->len = 0;
}

转载于:https://www.cnblogs.com/lnlin/p/6798559.html

数据结构 顺序串笔记相关推荐

  1. 数据结构源码笔记(C语言):Josephus问题之顺序表

    /*josephus_seq.c*/ /*Josephus问题: 顺序表实现*/#include <stdio.h> #include <stdlib.h>#define FA ...

  2. 数据结构源码笔记(C语言):线性表的顺序表示

    /* SeqList.c*/ /*线性表的顺序表示:函数实现*/#include <stdio.h> #include <stdlib.h> //#include " ...

  3. 数据结构源码笔记(C语言):顺序查找

    //实现顺序查找的算法 #include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 10 ...

  4. 数据结构上机实践第八周项目1- 建立顺序串的算法库

    建立顺序串的算法库 本次实践将建立顺序串的算法库,这样可以方便的将此算法运用于我们的所需的工程中,简化操作. 本次实践将用到多文件组织工程的建立,建立方法可以点击此处参照.(工程环境:Visual C ...

  5. 【数据结构】顺序串的插入算法,删除算法,连接运算,顺序串求子串算法

    主函数自行添加 头文件 + 宏定义 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 串的顺序存储 type ...

  6. 【数据结构和算法笔记】串详解:c实现

    空串:   长度为0 空格串:仅含空格字符,其长度为串中空格字符的长度 顺序串: 非紧缩格式:每个字只存一个字符 紧缩格式:每个字存放多个字符 操作与顺序表操作类似    

  7. 严蔚敏《数据结构》——顺序串

    顺序串,就是一个数组!!! 串的存储结构 #include<cstdio> #include<cstdlib>#define Status char #define MAXST ...

  8. 数据结构与算法笔记 - 绪论

    数据结构与算法笔记 - 绪论 1. 什么是计算 2. 评判DSA优劣的参照(直尺) 3. 度量DSA性能的尺度(刻度) 4. DSA的性能度量的方法 5. DSA性能的设计及其优化 x1. 理论模型与 ...

  9. 数据结构源码笔记(C语言):可变长度字符串的快速排序

    //实现可变长度的字符串序列快速排序算法#include<stdio.h> #include<malloc.h> #include<string.h>#define ...

最新文章

  1. 阿里云OSS上传图片实现流程
  2. 为什么导师不喜欢推荐老实人?这是我听过最醍醐灌顶的回答
  3. Joda-Time中两个日期之间的天数
  4. sdut-2732 小鑫の日常系列故事(一)——判断对错
  5. Codeforces Round #359 (Div. 2) D. Kay and Snowflake
  6. C#中使用FFMPEG切割、合并视频。
  7. 高等数学张宇18讲 第十二讲 常微分方程
  8. Symbian中的iScanCode和iCode
  9. Android 开发笔记2.0
  10. 《通关!游戏设计之道》给游戏编个故事
  11. Matplotlib 画图如何取消图边框
  12. seq2seq模型_具有注意力机制的seq2seq模型
  13. python使用pandas拆分excel表并导出(2)
  14. 一文了解半导体的过去、现在和未来
  15. SAND-MATIC 质押池将停用
  16. Appinum:在使用安卓模拟器定位页面元素时启动uiautomatorviewer.bat ,但是报错: Error while obtaining UI hierarchy XML file: c
  17. c2c网站开店的流程图_C2C网店策划书
  18. 全国高速公路一览表_拔剑-浆糊的传说_新浪博客
  19. BEA广州UG腐败日--1st time
  20. 一个前端工程师的docker之路

热门文章

  1. 资源管理器停止工作,自动重启
  2. main(int argc,char *argv[ ],char *env)参数详解
  3. asp.net mvc 2被遗忘的%:Html.AntiForgeryToken() %
  4. 敏捷、TDD(测试驱动开发)、OO--前奏
  5. Web后端学习笔记 Flask(8) WTForms 表单验证,文件上传
  6. Web前端JavaScript笔记(7)ECMA6新增数组方法
  7. kafka partition分配_logstash消费kafka数据,partition分配不均衡
  8. c语言编写一元二次方程
  9. E: Malformed line 60 in source list /etc/apt/sources.list (dist parse)
  10. 如何写出高性能的SQL语句,及如何进行SQL性能分析与调优