IT编程 > 开发语言 > C/C++

数据结构部分总结(c语言版)

39人参与2019-09-11

这是一个

 

 

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

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语言版)

09-11

基于STM32F103ZET6 HC_SR04超声波测距模块

04-13

C++编译错误杂记

12-12

.cpp文件的Package程序入口

12-30

杭电2032——杨辉三角

05-31

手搓一个C语言简单计算器。

10-12

在Ubuntu下编译安装nginx

03-23

创建第一次C语言程序

01-04

02_有符号数与无符号数

10-24

C++STL之Vector向量详解,用法和例子 一起学习 一起加油

11-11

最近更新

凉肝的比赛

01-18

单链表实现

01-17

STM32之GPIO底层原理与编程实践

01-16

【编程技巧】如何使用带参数的宏 &amp;&amp; 常用的带参数宏

01-16

寒假集训第一天---并查集题解

01-16

c语言数组与指针详解(上)

01-15

01 Windows安装C语言环境

01-15

InsertionSort(插入排序)原理及C++代码实现

01-15

MergeSort(归并排序)原理及C++代码实现

01-15

CountingSort(计数排序)原理及C++代码实现

01-15

网友评论

已有0条评论