在很多时候我们想要在程序中存储想要的信息,但是又不知道该信息的大小或者说不知道需要多长的数组来存放。动态分配空间这个很好的解决了这个问题,动态分配不仅只可以用在链表中分配节点空间,其实更多时候用来分配数组的空间。今天我记录的这个代码就是一次性分配好信息所需要的空间大小。

假设: 现在我有一个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语言:将文件中所得到的单词表保存到一个顺序表中--使用动态分配数组。的更多相关文章

  1. c# applibrary实现一个Sheet表中存放多张DataTable数据

    1.工具类(applibrary.dll) public class ExcelHelper { /// <summary> /// 文件名 /// </summary> pu ...

  2. C++语言------顺序表实现,用动态数组的方法

    C++ 中常用的一些东西,通过使用动态数组来实现顺序表, 掌握了一下知识点: 1.预处理有三中方法 宏定义,文件包含,条件编译 2.使用同名的变量时,可以在外层使用命名空间 类解决变量名重定义的错误 ...

  3. php数据结构课程---2、链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的))

    php数据结构课程---2.链表(php中 是如何实现单链表的(也就是php中如何实现对象引用的)) 一.总结 一句话总结: php是弱类型语言,变量即可表示数值,也可表示对象:链表节点的数据域的值就 ...

  4. C++中如何建立一个顺序表

    准备数据 #define MAXLEN 100 //定义顺序表的最大长度 struct DATA { char key[10]; //结点的关键字 char name[20]; int age; }; ...

  5. 解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据

    我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动 ...

  6. hbase使用MapReduce操作3(实现将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中)

    Runner类 实现将 fruit 表中的一部分数据,通过 MR 迁入到 fruit_mr 表中. package com.yjsj.hbase_mr; import org.apache.hadoo ...

  7. 设顺序表中的数据元素递增有序,试着写一算法,将x插入到顺序表上的适当位置上,以保持该表的有序性。

    原创,转载请注明出处.https://www.cnblogs.com/yangf428/p/11254370.html 天勤例题[2-1]: 设顺序表va中的数据元素递增有序.试写一算法,将x插入到顺 ...

  8. Java连接MySQL数据库。编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计。

    题目2:编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计.之后,可根据显示的内容进行某条记录的删除(以id为条 ...

  9. C/C++ 顺序表的初始化、添加、插入、删除(删除顺序表中指定的所有元素)

    #include <iostream> #include <stdlib.h> #define MAX_SIZE 100 using namespace std; typede ...

  10. 数据结构顺序表中Sqlist *L,&L,Sqlist *&L

    //定义顺序表L的结构体 typedef struct { Elemtype data[MaxSize]: int length; }SqList; //建立顺序表 void CreateList(S ...

随机推荐

  1. #树链剖分,zkw线段树#nssl 1489 大冰隙2

    题目 有一个长度为\(n\)的01数列\(a\)和一个长度为\(n\)的数列\(b\)表示权值 支持单点修改以及区间查询,\(0\)和\(1\)可以看作左括号和右括号, 将一段区间所有可匹配的的括号去 ...

  2. HMS Core助力开发者打造高品质游戏,共创智玩新生态

    2021年8月1日,华为HMS Core.Sparkle游戏应用创新沙龙在上海举行.会上,华为HMS Core团队与游戏行业开发者围绕3D图形渲染.网络加速.精准运营等多个话题,探讨了游戏应用开发技术 ...

  3. 运动App如何实现端侧后台保活,让运动记录更完整?

    你在锻炼健身时,有没有遇到这样的情况?辛辛苦苦锻炼了几小时,却发现App停止了运行,本次运动并没有被记录到App上,从而失去了一个查看完整运动数据的机会? 运动类App是通过手机或者穿戴设备的传感器, ...

  4. 模拟spring工作原理

    1.配置文件 Service=service.Impl.ServiceImpl saveDao=dao.daoImpl.saveDaoImpl 2.模拟业务层 --接口 Service package ...

  5. MRBS(Meeting Room Booking System)开源的会议室预订系统搭建使用

    前一家公司所有的办公系统都是自己开发的,包括排班.工单.会议室预定等等,很方便. 目前所在的公司,每周部门例会找行政预订了会议室,但多次去都被人占了,很烦,于是网上找了一个评价不错的系统,python ...

  6. 探索Kimi智能助手:如何用超长文本解锁高效信息处理新境界

    目前,Kimi备受瞩目,不仅在社交平台上引起了广泛关注,而且在解决我们的实际问题方面也显示出了巨大潜力.其支持超长文本的特性使得我们能够更加灵活地配置信息,避免了频繁与向量数据库进行交互以及编写提示词 ...

  7. 【Oracle】预定义说明的部分 ORACLE 异常错误(EXCEPTION)

    预定义说明的部分 ORACLE 异常错误(EXCEPTION) 参考链接:https://www.cnblogs.com/thescentedpath/p/errordeal.html EXCEPTI ...

  8. 【Oracle】Oracle数据库,第N大数据取值

    Oracle数据库,第N大数据取值 没想到力扣还有数据库的练习,正好本菜鸡跑过来练手 要显示第二大的数据可以使用order by进行排序,然后用limit对显示的数据进行限制,limit1,1,以此来 ...

  9. 牛客网-SQL专项训练20

    ①学生.书店和图书三个实体集之间的联系属于:多元联系. 解析: 参与联系的实体集个数大于2个时,为多元联系:这里学生.书店.图书是三个实体,为多元联系. 二元联系指只有两个实体集参与的联系: 自反联系 ...

  10. 实时数仓Hologres首次走进阿里淘特双11

    ​简介:这是淘特在阿里巴巴参与的第二个双11大促,大促期间累计超过上千万消费者在此买到心仪的商品,数百万家商家因为淘特而变得不同,未来,淘特也将会继续更好的服务于下沉市场,让惠民走近千万家. 2021 ...