串,数组和广义表

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 listtail.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++];}
}

输出结果:

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA】嵌入式软件工程师-2025校招必备-详细整理

一、Java 基础 1.JDK 和 JRE 有什么区别&#xff1f; jdk&#xff1a;java development kit jre&#xff1a;java runtime Environment jdk是面向开发人员的&#xff0c;是开发工具包&#xff0c;包括开发人员需要用到的一些类。 jre是java运行时环境&#xff0c;包括java虚拟机…

2024年5月16日 十二生肖 今日运势

小运播报&#xff1a;2024年5月16日&#xff0c;星期四&#xff0c;农历四月初九 &#xff08;甲辰年己巳月庚辰日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;猴、鼠、鸡 需要注意&#xff1a;牛、兔、狗 喜神方位&#xff1a;西北方 财神方位&#xff1a;…

Go微服务开源框架kratos的依赖注入关系总结

该文章为学习开源微服务框架kratos的学习笔记&#xff01;官方文档见&#xff1a;简介 | Kratos Kratos 一套轻量级 Go 微服务框架&#xff0c;包含大量微服务相关框架及工具。 一、Kratos 项目结构简介 通过 Kratos 工具生成的 Go工程化项目模板如下&#xff1a; applicati…

【汇编语言】多文件组织

【汇编语言】多文件组织 文章目录 【汇编语言】多文件组织前言一、8086拓展1.子程序的另外一种写法2.程序的多文件组织 总结 前言 本篇文章将讲到子程序的另一种写法&#xff0c;以及程序的多文件组织。 一、8086拓展 1.子程序的另外一种写法 初始的程序 在这里我们对比一下…

连锁收银系统如何助力实体门店私域运营

作为实体门店&#xff0c;私域运营是提升客户黏性和增加复购率的重要策略之一。而连锁收银系统在私域运营中扮演了关键的角色&#xff0c;它不仅可以帮助门店管理客户信息和消费记录&#xff0c;还能够通过数据分析和营销功能提供个性化的服务和推广活动。下面看看连锁收银系统…

Acrel-1000变电站综合自动化监控系统 实时测控保护、远动于一体

​一、 系统概述 1.1 概述 Acrel-1000 变电站综合自动化监控系统&#xff0c;是我司根据电力系统自动化及无人值守的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的新一代电力监控系统。本系统具有保护、遥测、遥信、遥脉、遥调、遥控功能&#x…

树链剖分详解,看这一篇就够了

前置知识&#xff1a; 树形结构链式前向星(熟练)线段树(熟练)DFS序(熟练)LCA(了解定义) 什么是树链剖分 树链剖分其实有两种&#xff1a;重链剖分和长链剖分。重链剖分就是把儿子节点最重的儿子称为重儿子&#xff0c;把树分成若干条重链&#xff08;如图一&#xff09;&#…

算法学习笔记(5.0)-基于比较的高效排序算法-归并排序

##时间复杂度O(nlogn) 目录 ##时间复杂度O(nlogn) ##递归实现归并排序 ##原理 ##图例 ##代码实现 ##非递归实现归并排序 ##释 #代码实现 ##递归实现归并排序 ##原理 是一种基于分治策略的基础排序算法。 1.划分阶段&#xff1a;通过不断递归地将数组从中点处分开&…

尝试使用官方jailhouse-images仓库运行jailhouse

jailhouse 的官方 demo 演示仓库 Demo and testing images: https://github.com/siemens/jailhouse-images 通过jailhouse 的官方 demo 演示仓库&#xff0c;可以直接编译出带有部署有jailhouse程序的Linux镜像&#xff0c;有多个目标平台的Linux镜像可选&#xff0c;也有在qe…

一物一码数字化营销进军调味品行业,五丰黎红“星厨俱乐部”火啦!

近日&#xff0c;由五丰黎红联合纳宝科技精心打造的小程序“星厨俱乐部”火啦&#xff01;一经上线就吸引了大量用户注册和参与&#xff0c;可以说取得了非常成功的市场反馈&#xff0c;那究竟是一个什么样的小程序&#xff0c;竟然有这么大的吸引力呢&#xff1f; 介绍小程序之…

Linux基础之僵尸进程与孤儿进程

目录 一、僵尸进程 1.1 什么是僵尸进程 1.2 为什么要有僵尸状态 1.3 观察我们的僵尸状态 1.4 关于僵尸进程的小Tip 二、孤儿进程 2.1 什么是孤儿进程 一、僵尸进程 1.1 什么是僵尸进程 在上一篇文章中&#xff0c;我们有提到过进程的死亡状态的概念&#xff0c;而我们的…

C#【进阶】委托和事件

委托和事件 文章目录 1、委托1、委托概念2、基本语法3、定义自定义委托4、使用自定义委托5、委托变量可以存储多个函数6、系统定义好的委托思考 怪物死亡数据更新 2、事件1、事件概念2、事件的使用3、为什么有事件思考 热水器 3、匿名函数1、匿名函数概念2、基本语法3、使用4、…

C脚本实现Wincc弹窗重复调用

文章目录 前言一、步骤及解析二、运行画面演示三、总结 前言 在常见的Wincc上位机画面中&#xff0c;点击按钮或控件弹出弹窗&#xff0c;由于不同的弹窗内容不同&#xff0c;变量前缀不同&#xff0c;通常情况下一个弹窗就需要调用一个画面窗口&#xff0c;但画面窗口过多会导…

MySQL存储引擎介绍

查看MySQL数据库中创建表的信息 如上图所示&#xff0c;当我们使用命令show create table server_info\G;可以显示我们所创建的表的信息&#xff0c;只显示两个字段&#xff0c;第一个字段是Table 即是创建的表的名称&#xff0c;第二个字段是Create Table即是创建的表的字段的…

基于Pytorch深度学习神经网络MNIST手写数字识别系统源码(带界面和手写画板)

第一步&#xff1a;准备数据 mnist开源数据集 第二步&#xff1a;搭建模型 我们这里搭建了一个LeNet5网络 参考代码如下&#xff1a; import torch from torch import nnclass Reshape(nn.Module):def forward(self, x):return x.view(-1, 1, 28, 28)class LeNet5(nn.Modul…

Navicat Premium数据库新建函数报错问题

1.问题产生原因&#xff1a; (1)可能是软件 Navicat Premium 的版本不一样 (2)可能是与某些字符集不一样 2.找出解决办法&#xff1a; (1)参考对照系统自带sys数据库表的函数找出的区别&#xff08;后面遇到同样问题可以这样排查&#xff09; (2)不加 DETERMINISTIC 声明&a…

点量云流3D应用线上展厅云推流方案分享

展厅是企业对外展示宣传的窗口&#xff0c;不论企业还是政fu单位、博物馆、科技馆&#xff0c;展厅都可以给用户一个更直观的感受。而随着技术的发展&#xff0c;展厅展示的内容也从最初的图文、视频&#xff0c;扩展更多文件类型&#xff0c;比如PPT\PDF文件以及3D应用数字孪生…

字符串_字符函数和字符串函数

C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或者字符数组中。 字符串常量适用于那些对它不做修改的字符串函数。 目录 1.函数介绍 1.1strlen 1.1.1strlen函数的模拟实现 1.2strcpy 1.2.1st…

OpenAI 重磅发布GPT 4o!可以视频聊天的AI?

OpenAI 重磅发布GPT 4o&#xff01; 前言 就在今日&#xff0c;OpenAI发布了ChatGPT-4o版本&#xff0c;技术主管 Mira Murati 在直播中表示GPT-4o对比之前版本速度更快&#xff0c;在文本、视频和音频方面的能力也都有所提高。值得注意的是它还可以让用户与 ChatGPT 进行视频聊…

C++学习一(主要对cin的理解)

#include<iostream> int main() {int sum 0, value 0;//读取数据直到遇到文件尾&#xff0c;计算所有读入的值的和while (std::cin >> value){ //等价于sumsumvaluesum value;}std::cout << "Sum is :" << sum << std::endl;sum …