C语言:将文件中所得到的单词表保存到一个顺序表中--使用动态分配数组。
在很多时候我们想要在程序中存储想要的信息,但是又不知道该信息的大小或者说不知道需要多长的数组来存放。动态分配空间这个很好的解决了这个问题,动态分配不仅只可以用在链表中分配节点空间,其实更多时候用来分配数组的空间。今天我记录的这个代码就是一次性分配好信息所需要的空间大小。
假设: 现在我有一个txt文件存放着非常多得单词,我想要把这些文本中的单词存放进我的顺序表中。假设现在想不出很好的方法,只想到用一个二维字符数组来存放这些单词。(当然方法很多不仅限于我这个)
首先我们需要明确几个前提工作:
第一:我们需要知道文件中这些单词有几个 ,目的是为了后面申请存放多少个单词空间做准备 (这里有一个我之前写过的包含很多对文件内容的操作,里面就包含了计算单词个数的多少***************就是比较粗糙,没做什么解释***如何删除超链接和统计单词数等操作************************,你也可以等下直接看我后面放的代码。)
第二:因为我们用的是二维数组,需要保证所有单词都有足够空间存下该单词长度 。(这时候就用上了之前我在博客里面写到的函数功能,里面写的比较详细这里就不展开了如何在文件中找到最长的单词 )知道长度后就是为后面申请空间做准备,因为知道了最长的那个单词长度了,只要保证能装得下最长的单词,其他的也就自然装得下。
第三:准备工作完成后就到了我们的目的了,把文件中的单词存放进刚刚申请出来的空间里面。
下面是代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>//该头文件包含isalpha()这个函数
int F_link_len,F_maxword_len;
/*顺序表*/
typedef struct _Elem{
char *word;//存放单词
}Elem;
typedef struct _Elemlink{
Elem *array;//动态定义数组
int link_len;//数组长度
}Elemlink;
char temp[50];
//辅助功能,用来临时存放最长的单词,因为在函数内部定义想要返回数组就会造成内存泄漏
Elemlink *Sqlink_Firefox = NULL;
int count_to_words(FILE *fp);
char *Find_MAXword(FILE*fp);
void saveword_to_Sq(Elemlink *Sqlink, FILE *fp1);
int main(void)
{
int i;
FILE *fp1 = NULL;
FILE *fp2 = NULL;
char ch;
Sqlink_Firefox = (Elemlink*)malloc(sizeof(Elemlink));//建立一个顺序表的空间 ,地址是全局变量,出了函数后也不会被释放
fp1 = fopen("D:/单词文件.txt","r");
F_link_len = count_to_words(fp1);//统计单词表 接收单词数量
Sqlink_Firefox->array = (Elem*)malloc(sizeof(Elem)*F_link_len);//分配顺序单词表空间
fclose(fp1);
fp1 = fopen("D:/单词文件.txt","r");
F_maxword_len = sizeof(Find_MAXword(fp1)) + 1;//找到单词表中最长单词的长度 ,加一方便后面分配空间时需要把\0填进去
fclose(fp1);
for(i = 0; i < F_link_len; i++)
{
Sqlink_Firefox->array[i].word = (char*)malloc(sizeof(char)*F_maxword_len+1);
//分配每个单词的空间,用最大长度的单词空间就能存下所有的
}
fp1 = fopen("D:/单词文件.txt","r");
saveword_to_Sq(Sqlink_Firefox, fp1);
fclose(fp1);
printf("打印存放进顺序表的单词:\n")
for(i = 0; i < F_link_len; i++)
{
printf("%s ", Sqlink_Firefox->array[i]);
}
return 0;
}
int count_to_words(FILE *fp)//统计删除后的单词个数
{
char ch;
int nums = 0;
while(!feof(fp))
{
ch = getc(fp);
if(isalpha(ch))
{
nums++;
while(1)
{
ch = getc(fp);
if(!isalpha(ch)) break;
}
}
}
return nums;
}
char *Find_MAXword(FILE*fp)
{
char long_word[50];//存放最长的单词
char ch;
int n = 0, len = 0, i;
while(!feof(fp))
{
ch = fgetc(fp);
if(isalpha(ch))
{
long_word[n++] = ch;
}
else if(!isalpha(ch))
{
long_word[n] = '\0';
if(len <= n - 1)//判断是否遇到比之前最长的单词还要长 ,通过n来判断
{
len = n;//把比之前最长的那个单词长度替换成现在比他长的
strcpy(temp, long_word);//存放目前找到的最长单词
}
n = 0;
for(i = 0; i < 50; i++)//用空格清空存放的字符串,继续存放下一个
{
long_word[i] = ' ';
}
}
}
return temp;
}
void saveword_to_Sq(Elemlink *Sqlink, FILE *fp1)
{
char ch;
int index = 0, n = 0, start = -1;
while(!feof(fp1))
{
ch = fgetc(fp1);
if(isalpha(ch))
{
if(isupper(ch))
{
ch = tolower(ch);
}
start = 1;
Sqlink->array[index].word[n] = ch;
n++;
}
else if(start == 1)
{
start = -1;
Sqlink->array[index].word[n] = '\0';//变成字符串单词
index++;
n = 0;
}
}
}
C语言:将文件中所得到的单词表保存到一个顺序表中--使用动态分配数组。的更多相关文章
- c# applibrary实现一个Sheet表中存放多张DataTable数据
1.工具类(applibrary.dll) public class ExcelHelper { /// <summary> /// 文件名 /// </summary> pu ...
- C++语言------顺序表实现,用动态数组的方法
C++ 中常用的一些东西,通过使用动态数组来实现顺序表, 掌握了一下知识点: 1.预处理有三中方法 宏定义,文件包含,条件编译 2.使用同名的变量时,可以在外层使用命名空间 类解决变量名重定义的错误 ...
- php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))
php数据结构课程---2.链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的)) 一.总结 一句话总结: php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...
- C++中如何建立一个顺序表
准备数据 #define MAXLEN 100 //定义顺序表的最大长度 struct DATA { char key[10]; //结点的关键字 char name[20]; int age; }; ...
- 解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据
我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动 ...
- hbase使用MapReduce操作3(实现将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中)
Runner类 实现将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中. package com.yjsj.hbase_mr; import org.apache.hadoo ...
- 设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。
原创,转载请注明出处.https://www.cnblogs.com/yangf428/p/11254370.html 天勤例题[2-1]: 设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺 ...
- Java连接MySQL数据库。编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计。
题目2:编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计.之后,可根据显示的内容进行某条记录的删除(以id为条 ...
- C/C++ 顺序表的初始化、添加、插入、删除(删除顺序表中指定的所有元素)
#include <iostream> #include <stdlib.h> #define MAX_SIZE 100 using namespace std; typede ...
- 数据结构顺序表中Sqlist *L,&L,Sqlist *&L
//定义顺序表L的结构体 typedef struct { Elemtype data[MaxSize]: int length; }SqList; //建立顺序表 void CreateList(S ...
随机推荐
- requests进阶
requests进阶 三.requests模块处理cookie相关的请求 1 爬虫中使用cookie 为了能够通过爬虫获取到登录后的页面,或者是解决通过cookie的反扒,需要使用request来处理 ...
- #二进制拆分,矩阵乘法#洛谷 6569 [NOI Online #3 提高组] 魔法值
题目 分析 考虑一个点的权值能被统计到答案当且仅当其到1号点的路径条数为奇数条. 那么设 \(dp[i][x][y]\) 表示从 \(x\) 到 \(y\) 走 \(i\) 步路径条数的奇偶性, 这个 ...
- OpenHarmony创新赛 | 赛事宣讲会日期重磅官宣!为你带来超详尽的赛事攻略
最近接到很多小伙伴私信提问,比如如何报名开放原子开源大赛OpenAtom OpenHarmony(简称:"OpenHarmony")创新赛?有哪些赛题可以报名参赛?现在,赛事宣 ...
- 对OpenHarmony中LiteOS的内核分析——超时原理和应用
前言 在软件世界里面,超时是一个非常重要的概念.比如 ● 当前线程暂时休眠1秒钟,休眠结束后继续执行 ● 每5秒钟采集一下CPU利用率 ● 数据发送失败,2秒钟以后再试一试 ● 等待某种数据,但最多等 ...
- HamronyOS自动化测试框架使用指南
概述 为支撑HarmonyOS操作系统的自动化测试活动开展,我们提供了支持JS/TS语言的单元及UI测试框架,支持开发者针对应用接口进行单元测试,并且可基于UI操作进行UI自动化脚本的编写. 本指 ...
- Cloud-computing 实验镜像 chinaskills_cloud_iaas.iso chinaskills_cloud_paas.iso
Cloud-computing 实验镜像 最近因新项目再次进行云计算环境的搭建, 找这两个镜像( 找chinaskills_cloud_paas.iso chinaskills_cloud_iaas. ...
- css 去除浮动布局
前言 在清楚浮动的时候呢,网上有7种,这里只介绍3种,小声哔哔,其他4种都有坑. 正文 第一种: <div class="container"> <div> ...
- 力扣575(java&python)-分糖果(简单)
题目: Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] .Alice 注意到她的体重正在增长,所以前去拜访了一位医生. 医生建议 Alice 要少摄入糖分,只吃掉她所有糖 ...
- 力扣665(java)-非递减数列(中等)
题目: 给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列. 我们是这样定义一个非递减数列的: 对于数组中任意的 i (0 <= ...
- 零信任策略下K8s安全监控最佳实践(K+)
简介: 本文重点将围绕监控防护展开,逐层递进地介绍如何在复杂的分布式容器化环境中借助可观测性平台,持续监控K8s集群,及时发现异常的 API 访问事件.异常流量.异常配置.异常日志等行为,并且结合合理 ...