zoukankan      html  css  js  c++  java
  • 数据结构部分总结(c语言版)

    这是一个

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

    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 ");
    }
    if(sum == 0)
    {
    T->chars = NULL;
    }
    else
    {
    T->chars = (char*)malloc(sizeof(char)*sum);
    if(!T->chars)
    {
    printf("初始化申请空间失败! ");
    exit(NO);
    }
    for (int i = 0; i < sum; i++)
    {
    T->chars[i] = chars[i];
    //printf("%c ",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(" ");
    }

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

    /*
    字符串的连接函数
    */
    void concat(strand *t,strand *s1,strand *s2)
    {
    //printf("1 ");
    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 ",t->chars[j]);
    }
    j = s1->length;
    for (int i = 0; i < s2->length; i++ , j++)
    {
    t->chars[j] = s2->chars[i];
    //printf("%c ",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("输入的位置错误! ");
    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 ",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 ");
    }
    if(S->chars[i] == S->chars[j])
    {
    j++;
    //printf("2 ");
    }
    //printf("3 ");
    next[i] = j;
    i++;
    }
    //printf("4 ");
    /*
    右移,并且加1
    */
    for(int i = S->length-1; i >=1 ; i--)
    {
    next[i] = next[i-1];
    next[i]+=1;
    }
    next[0] = 0;
    return next;
    }

  • 相关阅读:
    结构化程序的三种基本逻辑结构
    总结程序设计几大原则
    [转]AutoResetEvent 与 ManualResetEvent区别
    ASP.NET高并发解决方案
    关于SQL SERVER高并发解决方案
    【转】sql server开启全文索引方法
    SQL Server技术问题之自定义函数优缺点
    SQL Server技术问题之视图优缺点
    SQL Server技术问题之触发器优缺点
    SQL Server技术问题之索引优缺点
  • 原文地址:https://www.cnblogs.com/xiaobaidaka/p/11504164.html
Copyright © 2011-2022 走看看