这是一个

/*
此头文件适用于串
其中包括最基本的函数操作

OK代表成功
NO代表失败
FS为特殊失败的标志

注:此头文件中的初始化使用'0'代表结束的
使用者可以根据需要自行改变,最后一
个函数为KMP算法,可以根据需要使用

*/

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define NO 0
#define FS -1
typedef int Nowname;
typedef struct strand
{
char *chars;
int length;
}strand;

/*
初始化、赋值函数
*/
Nowname StrAssign(strand *T,char *chars){
//printf("%s",chars);
int sum ;
char *c;
for(sum = 0 , c = chars; *c != '0' ;c++,sum++)
{
//printf("1\n");
}
if(sum == 0)
{
T->chars = NULL;
}
else
{
T->chars = (char*)malloc(sizeof(char)*sum);
if(!T->chars)
{
printf("初始化申请空间失败!\n");
exit(NO);
}
for (int i = 0; i < sum; i++)
{
T->chars[i] = chars[i];
//printf("%c\n",T->chars[i]);
}
T->length = sum;
}
return OK;
}

/*
对串进行输出
*/
void Out(strand *S)
{
int num = 0;
while (num != S->length)
{
printf("%c",S->chars[num]);
num++;
}
printf("\n");
}

/*
长度输出函数
*/
Nowname Length(strand *T)
{
return T->length;
}

/*
字符串的连接函数
*/
void concat(strand *t,strand *s1,strand *s2)
{
//printf("1\n");
int j = 0;
t->length = s1->length+s2->length;
t->chars = (char*)malloc(sizeof(char)*t->length);
for (int i = 0,j = 0; i < s1->length; i++ , j++)
{
t->chars[j] = s1->chars[i];
//printf("%c\n",t->chars[j]);
}
j = s1->length;
for (int i = 0; i < s2->length; i++ , j++)
{
t->chars[j] = s2->chars[i];
//printf("%c\n",t->chars[j]);
}
}

/*
主串S的pos位置后长度为len的子串,用Sub返回
*/
strand * SubString(strand *Sub,strand *S,Nowname pos,Nowname len)
{
if(pos<1 || pos > S->length || len < 0 || len > S->length-pos+1)
{
printf("输入的位置错误!\n");
exit(NO);
}
for (int i = pos-1,j = 0; j < len; i++,j++)
{
Sub->chars[j] = S->chars[i];
}
Sub->length = len;
return Sub;
}

/*
返回子串T在主串S的第pos个位置后首次出现的位置
*/

int Index(strand *S,strand *T,int pos)
{
int num = pos-1;
int i = 0;
int sum = 0;
while ( num < S->length && i< T->length)
{
if(S->chars[num] == T->chars[i])
{
num++;
i++;
sum++;
}
else
{
i = 0;
num = num - sum + 1;
sum = 0;
}
//printf("%d\n",sum);
if(i == T->length)
{
return num-i+1;
}
}
return NO;
}

/*
串之间的比较
0 两个字符串相同
1 T大于S
-1 S大于T
*/
Nowname StrCompare(strand *T,strand *S)
{
for(int i = 0 ; i < T->length && i < S->length ; i++)
{
if(T->chars[i] > S->chars[i])
return OK;
else if(T->chars[i] < T->chars[i])
return FS;
}
if(T->length == S->length)
return NO;
if(T->length-S->length>0)
return OK;
else
return FS;
}

/*
清空串
*/
void Nullstrand(strand *T)
{
if(T->chars)
{
free(T->chars);
T->length = 0;
}
}

int * Next(strand *S,int *next)
{
/*
i = 1 a b c d e f s d
0 1 2 3 4 5 6 7
j = 0 a b c d e f s d
0 1 2 3 4 5 6 7
1.当j>0且next[i]!=next[j]时 让j=next[j-1]
2.当next[i]==next[j]时,让j++
3.每次执行完均执行next[i] = j;
*/
int j = 0, i = 1;
next[1] = 0;//初始化一下1
while (i<S->length)
{
while (j>0&&S->chars[i]!=S->chars[j])
{
j = next[j-1];
//printf("1\n");
}
if(S->chars[i] == S->chars[j])
{
j++;
//printf("2\n");
}
//printf("3\n");
next[i] = j;
i++;
}
//printf("4\n");
/*
右移,并且加1
*/
for(int i = S->length-1; i >=1 ; i--)
{
next[i] = next[i-1];
next[i]+=1;
}
next[0] = 0;
return next;
}

数据结构部分总结(c语言版)的更多相关文章

  1. md5加密算法c语言版

    from: http://blog.sina.com.cn/s/blog_693de6100101kcu6.html 注:以下是md5加密算法c语言版(16/32位) ---------------- ...

  2. VS2015如何新建C++或者C语言版的lib文件

    当我们不想公开我们的代码的时候,可以把我们的代码封装成静态数据连接库,即lib文件.下面介绍下如何生成lib文件. 以VS2015为例,一种是C++版的lib文件,一种是C语言版的lib文件. 一.按 ...

  3. 2048小游戏代码解析 C语言版

    2048小游戏,也算是风靡一时的益智游戏.其背后实现的逻辑比较简单,代码量不算多,而且趣味性强,适合作为有语言基础的童鞋来加强编程训练.本篇分析2048小游戏的C语言实现代码. 前言 游戏截图:  游 ...

  4. 《数据结构-C语言版》(严蔚敏,吴伟民版)课本源码+习题集解析使用说明

    <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明 先附上文档归类目录: 课本源码合辑  链接☛☛☛ <数据结构>课本源码合辑 习题集全解析  链接☛☛☛  ...

  5. 数据结构(c语言版)代码

    第1章  绪论       文档中源码及测试数据存放目录:数据结构\▲课本算法实现\▲01 绪论  概述        第一章作为绪论,主要介绍了数据结构与算法中的一些基本概念和术语.对于这些概念术语 ...

  6. 排序算法总结(C语言版)

    排序算法总结(C语言版) 1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择 ...

  7. C,LINUX,数据结构部分

    1604期 第1期测试(面试精选:C,LINUX,数据结构部分) 本试卷从考试酷examcoo网站导出,文件格式为mht,请用WORD/WPS打开,并另存为doc/docx格式后再使用 试卷编号:24 ...

  8. 基于BP神经网络的简单字符识别算法自小结(C语言版)

    本文均属自己阅读源代码的点滴总结.转账请注明出处谢谢. 欢迎和大家交流.qq:1037701636 email:gzzaigcn2009@163.com 写在前面的闲话: 自我感觉自己应该不是一个非常 ...

  9. GeoIP的使用-C语言版

    0x00. 简介 GeoIP库可以根据IP地址(支持IPv4 和 IPv6), 定位该IP所在的 洲.经纬度.国家.省市.ASN 等信息. GeoIP目前已经升级到GeoIP2,GeoIP2有两个版本 ...

  10. 寒假答辩作品——掘地求升C语言版

    寒假答辩—掘地求升(C语言版) 前言 这个是作为寒假答辩作品写的. 之前考虑过用Unity写个游戏,但毕竟不熟悉C#,感觉几乎都是在套模板,而且写着不顺手,有想法却只能 看着C#发呆,很是无奈,所以决 ...

随机推荐

  1. jQuery中的动画(七)

    一.jQuery对象样式相关方法1.设置高度和宽度height([num])    [获取或设置样式属性height的值]获取匹配元素中第一个元素的height样式值或给匹配所有元素设置height样 ...

  2. 数据库系统(四)---关系型数据库设计及E-R图

    1.关系型数据库: 关系型数据库是一类采用关系模型作为逻辑数据模型的数据库系统,遵从数据库设计的基本步骤,包括:需求分析.概念结构设计.逻辑结构设计.物理结构设计.数据库实施.数据库的运行和维护等阶段 ...

  3. ssh实现无密码登陆

    参考教程:https://linux.cn/article-5444-1.html 1.假设你有一台主机A(ip:111.111.111.111),用户名为server123,想无密码登陆到主机B(1 ...

  4. Jmeter 在 beanshell 脚本中写日志

    JMETER 在执行时,会写日志数据,我们在编写脚本的时候也可以自己写日志. 日志记录再jmeter 的bin 目录的 jmeter.log 文件中. jmeter 比较人性化,它在这里提供了脚本可以 ...

  5. Java单例模式的几种实现

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10845530.html 一:静态内部类实现单例模式 原理:通过一个静态内部类定义一个静态变量来持有当前类实例 ...

  6. matplotlib 中的 colors 和 cmaps

    matplotlib 中的 148 种颜色 matplotlib 中的 160 种颜色映射 1.matplotlib中的 148 种颜色 import matplotlib as plm import ...

  7. JDOJ 2157 Increasing

    洛谷 P3902 递增 洛谷传送门 JDOJ 2157: Increasing JDOJ传送门 Description 数列A1,A2,--,AN,修改最少的数字,使得数列严格单调递增. Input ...

  8. qhclass

    http://www.qhclass.com/classroom/62/courses

  9. LeetCode 987. Vertical Order Traversal of a Binary Tree

    原题链接在这里:https://leetcode.com/problems/vertical-order-traversal-of-a-binary-tree/ 题目: Given a binary ...

  10. HTML JAVASCRIPT CSS 大小写敏感问题

    html: 大小写不敏感 css: 大小写不敏感 javascript: 大小写敏感 但是 但是 但是 这三者是相互联系的, 所以合在一起使用的时候就产生了变化 ----  TagName, Clas ...