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

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

12人参与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

c语言面试题__指针篇

08-15

Relative Sort Array

07-21

warning:parameter names (without types) in function declaration

03-18

C++实现从一个文件夹中读出所有txt文件

08-06

C语言实现蛇形输出

10-12

chromium之MessageLoop浅析

05-14

c语言:根据华氏温度求摄氏温度,并分析错误

06-12

c语言的全排列

05-12

一起talk C栗子吧(第一百三十九回:C语言实例--文件操作:基于文件描述符二)

01-13

最近更新

C语言输入单字符避免回车的四种方法

09-15

QRowTable表格控件(五)-重写表头排序、支持第三次单击恢复默认排序

09-15

洛谷 P3958 奶酪

09-15

引用的本质分析

09-15

致初学者(一): HDU 2000~ 2013题解

09-15

C++实现单例

09-15

函数默认参数与占位参数

09-15

new/delete与命名空间

09-15

C++中的强制类型转换

09-15

致初学者(二): HDU 2014~ 2032题解

09-15

网友评论

已有0条评论