串,数组和广义表

2.1.求next和nextval的实现

代码:

int next_one(char *str, int len) {
    int result = 1;
    if(len == 1 || len == 0) return len;
    for (size_t i = 1; i < len; i++)
    {      
        if(compare(str, str+len-i, i)) {
            result = i+1;
            //break;
        }
    }
    return result;
}

int next(char *str, int *arr) {
    int count = size(str);
    if(count == 1) 
    {arr[0] = 0; return count;}
    for (size_t i = 0; i < count; i++)//i = len
    {
        arr[i] = next_one(str, i);
    }
    
    return count;
}

int nextval(char *str, int *arr) {
    int count = size(str);
    int k = 0;
    if(count == 1) 
    {arr[0] = 0; return count;}
    for (size_t i = 0; i < count; i++)//i = len
    {
        k = next_one(str, i);//
        if(str[i] == str[k-1]) {
            arr[i] = 0; 
        } else {
            arr[i] = k;
        }
    }
    
    return count;
}

int compare(char *src_str, char *dist_str, int len) {
    for(int i = 0; i < len; i++) {
        if(src_str[i] != dist_str[i]) return 0;
    }
    return 1;
}

输出结果:

2.2展现t和p的匹配过程

  1. p的nextval值

 

  1. KMP的匹配过程

代码:

int KMP(char *src, char *pat) {
    int len_s = size(src);
    int len_p = size(pat);
    int next[100];
    nextval(pat, next);
    int j = 0;
    for(int i = 0; i < len_s; i++) {
        
        if(src[i] == pat[j]) {
            j++;
        } else {
            j = next[j];
        }
        printf("i = %d, j = %d\n", i, j);
        if(j == len_p) return i-len_p+1;
    }
    return -1;
}

输出结果:

 

2.4 广义表的定义

代码:

#include "stdio.h"

typedef char* AtomType;
typedef enum{ATOM, LIST} ElemTag;
typedef struct
{
    ElemTag tag;
    union node
    {
        AtomType atom;
        struct
        {
            struct GLnode *head,*tail;
        }ptr;
    };
}GLnode;

void init(GLnode *node);
void head(AtomType str);
void tail();
void traverse(GLnode *node);

void main() {

    GLnode node;
    init(&node);

    //traverse(node);

}

void init(GLnode *node) {

    GLnode glnode = *node;
    glnode.tag=1;

    GLnode head;
    head.tag = 0;
    head.atom = "apple\0";

    GLnode tail;//tail list
    tail.tag = 1;
    glnode.ptr.head = &head;
    glnode.ptr.tail = &tail;

    GLnode head1,tail1;
    head1.tag = 1;
    tail1.tag = 0;
    tail1.atom = "pear\0";
    tail.ptr.head = &head1;
    tail.ptr.tail = &tail1;

    GLnode head2,tail2;
    head2.tag = 0;
    tail2.tag = 1;
    head2.atom = "orange\0";
    head1.ptr.head = &head2;
    head1.ptr.tail = &tail2;

    GLnode head3,tail3;
    head3.tag = 0;
    tail3.tag = 0;
    head3.atom = "strawberry\0";
    tail3.atom = "banana\0";
    head2.ptr.head = &head3;
    head2.ptr.tail = &tail3;

    traverse(&glnode); 

}

void head(GLnode node, AtomType str) {
    if (node.tag)
    {
        /* code */
    }
    
}

void traverse(GLnode *node) {
    if(!node->tag) {
        printf("The elem is %s\n", node->atom);
    } else {
        traverse(node->ptr.head);
        traverse(node->ptr.tail);
    }
}

 

3.1 统计字符串中的个数

分析:

1存放字符的数据结构需要动态地添加结点,所以选择链表保存;

2遍历字符串,然后判断链表中是否已经存在,如果不存在,新添加一个结点插入到队列;

如果存在,结点中地统计变量加1.

3 最后把链表地内容输入到文件中。

代码:

#include "stdio.h"

typedef struct
{
    char ch;
    int count;
    struct lnode *next;
}lnode;

void init(lnode *list);
void count(lnode *list, char *str);
void insert(lnode *list, char ch);
void print(lnode *list);
void write_file(lnode *list);
void num_to_str(int num, char *str);
void main() {
    lnode list;
    char *str = "ahfAJOFJIOhoahf832977689  ofj___";
    init(&list);
    count(&list, str);
    //print(&list);

    write_file(&list);

}

void init(lnode *list) {
    list->next = NULL;
}

void count(lnode *list, char *str) {
    lnode *node = list;
    while (*str)
    {
        if(*str >= 'A' && *str <= 'Z' || *str >= 'a' && *str <= 'z' || *str >= '0' && *str <= '9') {
            while (node->next)
            {
                node = node->next;
                if(node->ch == *str) {
                    node->count++;
                    break;
                }
            }
            if(!node->next) {
                lnode *l_node = (lnode *) malloc (sizeof(lnode));
                l_node->ch = *str;
                l_node->count = 1;
                node->next = l_node;
                l_node->next = NULL;
            }
            
        }
        str++;
        node = list;
    }
    
}

void print(lnode *list) {
    while (list->next)
    {
        list = list->next;
        printf("%c", list->ch);
    }
    
}

void write_file(lnode *list) {
    FILE *file = fopen("count.txt", "a");

    while (list->next)
    {
        list = list->next;
        char str[20];
        str[0] = list->ch;
        str[1] = ':';
        char *p = str+2;
        num_to_str(list->count, p);
        fputs(str, file);
    }
    fclose(file);
}

void num_to_str(int num, char *str) {
    int count = 0;
    for(int i = 0; num != 0; i++) {
        str[i] = num % 10 + '0';
        num = num / 10;
        count++;
    }
    str[count] = '\n';
    str[count+1] = 0;
}

输出结果:

3.2 递归实现字符串逆序

代码:

 

#include "stdio.h"

void reverse(char *str, int i, int j);
void swap(char *a, char *b);
int size(char *str);
void main() {
    char *str = "abcd";
    int i = 0;
    int j = size(str) - 1;
    reverse(str, i, j);

}

void reverse(char *str, int i, int j) {
    if(i > j) return;
    swap(&str[i], &str[j]);
    reverse(str, i+1, j-1);
}

void swap(char *a, char *b) {
    char temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int size(char *str) {
    int length = 0;
    while(*str++) {
        length++;
    }
    return length;
}

输出结果:

3.3 像字符串中插入字符串

分析:

s0           n-1 n           s_len

                t0       t_len

s0           n-1 n            t_len+n-1     s_len+t_len

1.n = s_len-1

2.n<s_len-1, 先搬n到s_len-1的元素到n+t_len, 直到s_len+t_len-1.

3.再填充t0-n,  从n到n+t_len-1.

代码:

#include "stdio.h"

void insert(char *s, char *t, int n);
int size(char *str);
void main() {

    char s[200] = "abcdefg";
    char t[200] = "xyz";
    int n = 3;
    insert(s, t, 3);

    printf("The string is %s", s);

}

void insert(char *s, char *t, int n) {
    int s_len = size(s);
    int t_len = size(t);

    s[s_len+t_len] = 0;
    for(int i = s_len-n-1; i >= 0; i--) {
        s[n+t_len+i] = s[n+i];
    }
    for(int i = 0; i < t_len; i++) {
        s[n+i] = t[i];
    }
}

int size(char *str) {
    int length = 0;
    while(*str++) {
        length++;
    }
    return length;
}

 输出结果:

 

3.4.分S1为S1和S2.

分析:S1 len1

         S2 len2 = n

         S3 len3 = len1-n.

代码:

#include "stdio.h"

void format(char *s1, char *s2, char *s3, int n);
int size(char *str);
void main() {

    char s1[200] = "abcdefgadfadfad";
    char s2[200];
    char s3[200];
    int n = 10;
    format(s1, s2, s3, n);

    printf("The string is %s,%s,%s", s1, s2, s3);

}

void format(char *s1, char *s2, char *s3, int n) {
    int count = size(s1);
    int j = 0;
    for(int i = 0; i < count; i++) {
        if(i < n) {
            s2[i] = s1[i];
        } else {
            s3[j++] = s1[i];
        }
    }
    s2[n] = 0;
    s3[j] = 0;
}

int size(char *str) {
    int length = 0;
    while(*str++) {
        length++;
    }
    return length;
}

输出结果:

3.5. 求解二维数组是否有重复元素

代码:

#include "stdio.h"

int same_elem_matrix(int *a[3], int m, int n);

void main() {

    int a1[3] = {1,3,5};
    int a2[3] = {2,4,6};
    int a3[3] = {25,7,9};
    int *a[3] = {&a1,&a2,&a3};
    same_elem_matrix(a, 3, 3);

}

int same_elem_matrix(int *a[3], int m, int n) {

    int **p = a;

    for(int i = 0; i < m*n; i++) {

        for(int j = 0; j < 3; j++) {
            for(int k = 0; k < 3; k++) {
                if(i/m == j && i%n == k)break;
                if(*(*(p+i/m)+i%n) == a[j][k]) {
                    printf("yes! the matrix has same elem.");
                    return 1;
                }
            }
        }
        
    }
    printf("no! the matrix has no same elem.");   
    return 0;
}

输出结果:

 

3.6. 正负数分离

分析:

申请a[n],b[n]记录A[n]的正负分布情况。

代码:

#include "stdio.h"

void check_number(int *A, int length);

void main() {
    int a[10] = {-1,-3,5,2,-5,9,2,3,-10,-29};

    check_number(a, 10);

    for(int i = 0; i < 10; i++) {
        printf("%d,", a[i]);
    }
}

void check_number(int *A, int length) {
    int b[10],c[10];
    int j = 0;
    int k = 0;
    for(int i = 0; i < length; i++) {
        if(A[i] >= 0) {
            b[j++] = A[i];
        } else {
            c[k++] = A[i];
        }
    }
    k = 0;
    for(int i = 0; i < length; i++) {
        if(i < j)A[i] = b[i];
        else A[i] = c[k++];
    }
}

输出结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/630444.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【校园生活小程序_超详细部署】

校园生活小程序 1 完整小程序源码2 运行环境3 初次运行3.1 启动后端程序3.1.1 导入项目&#xff0c;找到项目的pom.xml文件&#xff0c;点击ok进行打开。3.1.2 创建数据库并插入内容 3.1.3 配置项目结构信息3.1.4 配置Tomcat服务器3.1.5 正式启动后端项目3.1.6出现BUG3.1.7 解决…

小程序框架是智能融媒体平台构建的最佳线路

过去5年&#xff0c;媒体行业一直都在进行着信息化建设向融媒体平台建设的转变。一些融媒体的建设演变总结如下&#xff1a; 新闻终端的端侧内容矩阵建设&#xff0c;如App新闻端&#xff0c;社交平台上的官方媒体等新闻本地生活双旗舰客户端&#xff0c;兼顾主流媒体核心宣传…

【密评】 | 商用密码应用安全性评估从业人员考核题库(09)

Hill密码是重要古典密码之一&#xff0c;其加密的核心思想的是&#xff08;&#xff09;。 A.线性变换 B.非线性变换 C.循环移位 D.移位 著名的Kerckhoff原则是指&#xff08;&#xff09;。 A.系统的保密性不但依赖于对加密体制或算法的保密&#xff0c;而且依赖于密钥 B.系统…

深入 Go 语言:使用 math/rand 包实现高效随机数生成

深入 Go 语言&#xff1a;使用 math/rand 包实现高效随机数生成 介绍math/rand 包的核心功能设计哲学应用场景 基础使用方法初始化和种子设置设置种子创建私有随机数生成器 基础函数详解生成整数生成特定范围的整数生成浮点数随机置乱数组 进阶技巧随机数的统计属性生成正态分布…

第83天: 代码审计-PHP 项目RCE 安全调试追踪代码执行命令执行

案例一&#xff1a;CNVD拿1day-RCE命令执行-百家CMS 这里用代码审计系统搜索system&#xff0c;可以利用的是第一种 打开看细节 查找函数引用 查找$_file第一次出现的地方 这个时候就明白了&#xff0c;必须上传文件&#xff0c;然后利用文件名&#xff0c;去执行system命令 …

2024年湖北省安全员-B证证模拟考试题库及湖北省安全员-B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年湖北省安全员-B证证模拟考试题库及湖北省安全员-B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;湖北省安全员-B证证模拟考试题库是根据湖北省安全员-B证最新版教材&#xff0c;湖北省安全员-B证大…

有多少小于当前数字的数字

链接&#xff1a;https://leetcode.cn/problems/how-many-numbers-are-smaller-than-the-current-number/description/ 思路&#xff1a; 最简单的思路来说&#xff0c;就是双重for循环进行遍历&#xff0c;来判断个数&#xff0c; 优化思路&#xff0c;其中一个思路就是递推 …

vue3修改eldialog弹窗css不生效

问题&#xff1a;子组件中的eldialog没有父标签 直接使用如下是不生效的 .el-dialog{ top: 10%; } 解决&#xff1a; 加一个父标签 使用deep深度查询 .dialogClass :deep(.el-dialog) { top: 10%; } 就可以修改了

传输层协议——TCP协议

TCP协议又叫传输控制协议&#xff0c;TCP/IP协议是计算机通信网络中目前使用最多的协议&#xff0c;同时也融入了生活的方方面面&#xff0c;不管是浏览网页使用的http/https协议、物联网设备使用的MQTT/MQTTS协议与下载文件使用的ftp协议、工业以太网中使用的Modbus TCP协议等…

Elasticsearch 搜索引擎实现对文档内容进行快速检索(保姆级教程)

本文主要讲解ES如何从提取文档中提取内容&#xff08;word、pdf、txt、excel等文件类型&#xff09;&#xff0c;实现快速检索文档内容实现。 特别说明一下&#xff0c;为什么用7.10.0版本&#xff0c;因为在项目中除了精确匹配的要求&#xff0c;也会有模糊查询&#xff08;关…

k8s二进制部署--多master、负载均衡、高可用

目录 1、环境准备 1.1 服务器配置 1.2 master02 节点部署 2、负载均衡部署 2.1 下载nginx 2.2 修改nginx配置文件 2.3 启动nginx 2.3.1 检查配置文件语法 2.3.2 启动nginx服务&#xff0c;查看已监听6443端口 3. 部署keepalived服务(nginx主机&#xff0c;以nginx01为…

SOP for Oracle 23ai:Python 连接 Oracle 的两种方法

前情回顾 前文介绍了如何使用 python-oracledb 连接 Oracle 23ai 数据库&#xff0c;并演示了如何使用独立连接方式。 其中提到了支持两种连接池&#xff1a; DRCP 和 PRCP。 本文将对这两种连接池做具体演示。 DRCP 和 PRCP 连接池 连接池技术的优点不言而喻&#xff1a; 缩短…

selenium发展史

Selenium Core 2004 年&#xff0c;Thoughtworks 的工程师 Jason Huggins 正在负责一个 Web 应用的测试工作&#xff0c;由于这个项目需要频繁回归&#xff0c;这导致他不得不每天做着重复且低效的工作。为了解决这个困境&#xff0c;Jason 开发了一个运行在 JavaScript 沙箱中…

Python的for循环

for循环 Python中的for循环是一种迭代循环&#xff0c;可以迭代容器中的每一个元素。 for循环结构 示例&#xff1a; users ["汤姆", "艾米", "李华"] for i in users:print(i) 其中i为临时变量&#xff0c;仅在循环中有效&#xff1b;users…

使用可接受gitlab参数的插件配置webhook

jenkins配置 安装Generic Webhook Trigger 配置远程触发令牌 勾选Print post content和Print contributed variables用于打印值 配置gitlab 选择新增webhook 配置webhook http://JENKINS_URL/generic-webhook-trigger/invoke,将JENKINS_URL修改成自己的jenkins地址 先保存…

mysql 查询---多表设计

部分数据 1distinct去重 select distinct job from tb_emp;select * from tb_emp where id in (1,2,3); select * from tb_emp where id between 1 and 5; select * from tb_emp where name like __; #下划线匹配单个字符, %匹配任意多个字符select min(entrydate) from tb_e…

第9章.Keil5-MDK软件简介

目录 0. 《STM32单片机自学教程》专栏 9.1 主界面 9.2 文本格式编辑 9.3 代码提示&语法检测&代码模版 9.4 其他小技巧 9.4.1 TAB 键的妙用 9.4.2 快速定位函数/变量被定义的地方 9.4.3 快速注释与快速消注释 9.4.4 快速打开头文件 9.4.5 查找替换…

C++基础——继承(下)

一、继承与静态成员 基类定义了static 静态成员&#xff0c;则整个继承体系里面只有一个这样的成员。无论派生出多少个子 类&#xff0c;都只有一个 static 成员实例 。 class person { public:person(const char* name "lisi"):_name(name){} public:string _name;…

Trieve实践:好用功的开源RAG

目录 RAG概述 RAG架构 Trieve Trieve介绍 Trieve使用 初始化 自行搭建RAG Trieve是什么&#xff0c;RAG是什么&#xff0c;本文来带你了解。其实在很多产品应用里面都会有RAG,比如ai客服&#xff0c;针对性的智能问答&#xff0c;都是基于RAG实现的 RAG概述 RAG 是一种…

Electron学习笔记(五)

文章目录 相关笔记笔记说明 七、系统1、系统对话框2、自定义窗口菜单3、系统右键菜单4、快捷键(1)、监听网页按键事件 &#xff08;窗口需处于激活状态&#xff09;(2)、监听全局按键事件 &#xff08;窗口无需处于激活状态&#xff09;(3)、补充&#xff1a;自定义窗口菜单快捷…