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 ...
随机推荐
- JDK14中的java tools简介
目录 故事发生了 java tools简介 jaotc jar jarsigner java javac javadoc javap jcmd jconsole jdb jdeprscan jdeps ...
- 新零售SaaS架构:客户管理系统架构设计(万字图文总结)
什么是客户管理系统? 客户管理系统,也称为CRM(Customer Relationship Management),主要目标是建立.发展和维护好客户关系. CRM系统围绕客户全生命周期的管理,吸引和 ...
- OpenHarmony 分布式硬件关键技术
本文转载自 OpenHarmony TSC 官方微信公众号<峰会回顾第8期 | OpenHarmony 分布式硬件关键技术> 演讲嘉宾 | 李 刚 回顾整理 | 廖 涛 排版校对 ...
- 14款DevOps/SRE工具,助力提升运维效率
简介 随着平台工程的兴起,DevOps 和 SRE 不断发展,带来了新一代工具,旨在提高软件开发和运维的效率.可扩展性和可靠性. 在本篇文章中,我们将深入探讨一些最具发展前景的工具,它们正在塑造持续集 ...
- SVM三则
硬间隔SVM SVM被提出来, 解决模式识别中, 数据的分类问题,属于有监督算法中的一种, 如上图所示, 于其他的线性回归方式不同, SVM企图去寻找一个最完美的超平面, 因为能正确分类样本的线, 它 ...
- Spark常见的问题以及解决方案
Spark为什么比Hadoop要快? Spark比hadoop快的原因,我认为主要是spark的DAG机制优于hadoop太多,spark的DAG机制以及RDD的设计避免了很多落盘的操作,在窄依赖的情 ...
- mysql 必知必会整理—安全管理[十七]
前言 简单介绍一下安全管理. 正文 MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少. 换句话说,用户不能对过多的数据具有过多的访问权. 多数用户只需要对表进行 ...
- js中this对象的理解
一.定义 函数的 this 关键字在 JavaScript 中的表现略有不同,此外,在严格模式和非严格模式之间也会有一些差别 在绝大多数情况下,函数的调用方式决定了 this 的值(运行时绑定) th ...
- asyncio和aiohttp携程并发
import asyncio from aiohttp import web import time async def process(): for i in range(10): print(&q ...
- HarmonyOS NEXT 实战开发—Grid和List内拖拽交换子组件位置
介绍 本示例分别通过onItemDrop()和onDrop()回调,实现子组件在Grid和List中的子组件位置交换. 效果图预览 使用说明: 拖拽Grid中子组件,到目标Grid子组件位置,进行两者 ...