- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
您好,我正在C中创建一个链接列表,以打印从名为dict.txt的文本文件中给定的唯一标记。我是C的新手,不确定如何正确地从文件中读取每个单词,将其存储到节点中,然后打印生成的链接列表。下面是我的以下方法,我在add方法中省略了contains方法或其实现。我还不关心这个部分,只想打印给定文本文件中的每个单词。
struct Node{
char *data;
struct Node *next;
}
typedef struct Node *node;
Node createNode(){
Node new;
new = (Node)malloc(sizeof(struct Node));
*new.next = NULL;
return new;
}
void add(Node head, char data){
Node temp,p;
temp = createNode();
*temp.data = data;
if(head == NULL) head == temp;
else{
p = head;
while(*p.next != NULL) {
//TODO contains method to catch duplicates
p = *p.next;
}
*p.next = temp;
}
return head;
}
int main(){
File *filep;
filep = fopen("dict.txt", "r");
Node head = NULL;
while(fscanf(filep, "%s", word) != EOF){
int i = 0;
if (i == 0) Node parent = add(head, word); //add the first word
else{
//how should I add the other nodes?
}
i++
}
最佳答案
首先,让我们从基础知识开始,您必须将word
读入一个有效的缓冲区,因此声明一个足够大的缓冲区来保存您的单词(未桥接词典(非医学词典)中最长的单词是29个字符)。不要使用幻数,所以声明一个足够大的常数来创建具有自动存储的缓冲区(不要略过!在缓冲区大小上),例如。
#define MAXC 1024u /* if you need a constant, define one (or more) */
...
int main (int argc, char **argv) {
char word[MAXC]; /* buffer to hold each word */
main()
的形式为程序提供参数。使用它们!不要硬编码文件名——这就是参数的用途。只需将文件名作为第一个参数传递给程序,并验证是否至少有两个参数(第一个参数始终是程序名),例如。
if (argc < 2) { /* check that at least 2 arguments available */
fprintf (stderr, "error: insufficient arguments.\n"
"usage: %s filename\n", argv[0]);
return 1;
}
filep = fopen (argv[1], "r"); /* open file given as 1st argument */
if (!filep) { /* validate file is open for reading */
perror ("fopen-filep");
return 1;
}
create_node()
函数,该函数对于复杂的结构初始化很有帮助,但是对于单个字符串
data
,确实不需要。每次调用
addnode()
时只需分配一个新节点,然后只需检查它是否是添加的第一个节点(只需将节点地址分配为列表地址),否则,迭代到列表的末尾并将节点添加到列表中以便按顺序插入。
addnode()
注释之前,如果要为
addnode()
中的第一个节点分配,则必须将列表指针的地址传递给
addnode()
,因为列表的地址将设置为第一个节点。您也可以返回一个指向所插入节点的指针(也可以将其用作插入成功/失败的指示),并将返回值指定为第一个节点的列表地址(取决于您自己)。但是,当您开始按排序顺序插入或从列表中删除节点时,您同样需要将列表的地址作为参数传递,因为更改第一个节点或删除第一个节点将导致列表地址更改。
addnode()
可能类似于:
node_t *addnode (node_t **head, char *word)
{
size_t len = strlen (word); /* length of word */
node_t *node = malloc (sizeof *node), /* allocate new node */
*iter = *head; /* temp iterator for in-order insert */
if (!node) { /* validate EVERY allocation */
perror ("malloc-node"); /* handle error */
return NULL;
}
node->next = NULL;
node->data = malloc (len + 1); /* allocate storage for word */
if (!node->data) { /* ditto! */
free (node); /* free node - word allocation failed */
perror ("malloc-node->data");
return NULL;
}
memcpy (node->data, word, len + 1); /* copy with nul-character */
if (!*head) /* are we the first node? */
return (*head = node); /* just set *head = node */
while (iter->next) /* while next is not NULL */
iter = iter->next; /* advance iter to next node */
return (iter->next = node); /* new node at end */
}
main()
中,
while (fscanf (filep, "%s", word) != EOF) /* read each word */
addnode (&head, word); /* add to list */
fclose (filep); /* close file, done reading */
addnode()
在列表中添加节点/单词的简单方法。但是,创建列表的每个程序也应该能够删除列表并
free()
分配给列表的所有内存。在删除
victim
节点之前,在节点上保存一个指向要删除的节点的指针并前进到下一个节点的简单迭代是关键,例如。
void free_list (node_t *node)
{
while (node) { /* iterate over each node */
node_t *victim = node; /* save node to free as victim */
node = node->next; /* advance to next before freeing current */
free (victim->data); /* free node word */
free (victim); /* free node */
}
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXC 1024u /* if you need a constant, define one (or more) */
typedef struct Node {
char *data;
struct Node *next;
} node_t;
node_t *addnode (node_t **head, char *word)
{
size_t len = strlen (word); /* length of word */
node_t *node = malloc (sizeof *node), /* allocate new node */
*iter = *head; /* temp iterator for in-order insert */
if (!node) { /* validate EVERY allocation */
perror ("malloc-node"); /* handle error */
return NULL;
}
node->next = NULL;
node->data = malloc (len + 1); /* allocate storage for word */
if (!node->data) { /* ditto! */
free (node); /* free node - word allocation failed */
perror ("malloc-node->data");
return NULL;
}
memcpy (node->data, word, len + 1); /* copy with nul-character */
if (!*head) /* are we the first node? */
return (*head = node); /* just set *head = node */
while (iter->next) /* while next is not NULL */
iter = iter->next; /* advance iter to next node */
return (iter->next = node); /* new node at end */
}
void prn_list (node_t *node)
{
puts ("\nlinked list:\n");
while (node) { /* iterate over each node */
puts (node->data); /* outputting node->data */
node = node->next; /* advance to next node */
}
}
void free_list (node_t *node)
{
while (node) { /* iterate over each node */
node_t *victim = node; /* save node to free as victim */
node = node->next; /* advance to next before freeing current */
free (victim->data); /* free node word */
free (victim); /* free node */
}
}
int main (int argc, char **argv) {
char word[MAXC]; /* buffer to hold each word */
FILE *filep; /* FILE not File */
node_t *head = NULL; /* node to beginning of list */
if (argc < 2) { /* check that at least 2 arguments available */
fprintf (stderr, "error: insufficient arguments.\n"
"usage: %s filename\n", argv[0]);
return 1;
}
filep = fopen (argv[1], "r"); /* open file given as 1st argument */
if (!filep) { /* validate file is open for reading */
perror ("fopen-filep");
return 1;
}
while (fscanf (filep, "%s", word) != EOF) /* read each word */
addnode (&head, word); /* add to list */
fclose (filep); /* close file, done reading */
prn_list (head); /* print list */
free_list (head); /* free all allocated memory */
}
tail
指针通过前向链接或按顺序链接来优化添加节点方面也存在差异,但要添加的信息的基本传递以及节点的分配和数据的存储基本上都将工作相同,而不管如何。
$ cat ../dat/captnjack.txt
This is a tale
Of Captain Jack Sparrow
A Pirate So Brave
On the Seven Seas.
$ ./bin/ll_words ../dat/captnjack.txt
linked list:
This
is
a
tale
Of
Captain
Jack
Sparrow
A
Pirate
So
Brave
On
the
Seven
Seas.
valgrind
是正常的选择每个平台都有类似的内存检查程序。它们都很容易使用,只要运行你的程序就可以了。
$ valgrind ./bin/ll_words ../dat/captnjack.txt
==16920== Memcheck, a memory error detector
==16920== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==16920== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==16920== Command: ./bin/ll_words ../dat/captnjack.txt
==16920==
linked list:
This
is
a
tale
Of
Captain
Jack
Sparrow
A
Pirate
So
Brave
On
the
Seven
Seas.
==16920==
==16920== HEAP SUMMARY:
==16920== in use at exit: 0 bytes in 0 blocks
==16920== total heap usage: 33 allocs, 33 frees, 884 bytes allocated
==16920==
==16920== All heap blocks were freed -- no leaks are possible
==16920==
==16920== For counts of detected and suppressed errors, rerun with: -v
==16920== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
关于c - 从带有输出的输入文件创建C链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55153257/
前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理
所以我用 Create React App 创建并设置了一个大型 React 应用程序。最近我们开始使用 Storybook 来处理和创建组件。它很棒。但是,当我们尝试运行或构建应用程序时,我们不断遇
遵循我正在创建的控件的代码片段。这个控件用在不同的地方,变量也不同。 我正在尝试编写指令来清理代码,但在 {{}} 附近插入值时出现解析错误。 刚接触 Angular ,无法确定我错过了什么。请帮忙。
我正在尝试创建一个 image/jpeg jax-rs 提供程序类,它为我的基于 post rest 的 Web 服务创建一个图像。我无法制定请求来测试以下内容,最简单的测试方法是什么? @POST
我一直在 Windows 10 的模拟器中练习 c。后来我改用dev C++ IDE。当我在 C 中使用 FILE 时。创建的文件的名称为 test.txt ,而我给出了其他名称。请帮助解决它。 下面
当我们创建自定义 View 时,我们将 View 文件的所有者设置为自定义类,并使用 initWithFrame 或 initWithCode 对其进行实例化。 当我们创建 customUITable
我正在尝试为函数 * Producer 创建一个线程,但用于创建线程的行显示错误。我为这句话加了星标,但我无法弄清楚它出了什么问题...... #include #include #include
今天在做项目时,遇到了需要创建JavaScript对象的情况。所以Bing了一篇老外写的关于3种创建JavaScript对象的文章,看后跟着打了一遍代码。感觉方法挺好的,在这里与大家分享一下。 &
我正在阅读将查询字符串传递给 Amazon 的 S3 以进行身份验证的文档,但似乎无法理解 StringToSign 的创建和使用方式。我正在寻找一个具体示例来说明 (1) 如何构造 String
前言:我对 C# 中任务的底层实现不太了解,只了解它们的用法。为我在下面屠宰的任何东西道歉: 对于“我怎样才能开始一项任务但不等待它?”这个问题,我找不到一个好的答案。在 C# 中。更具体地说,即使任
我有一个由一些复杂的表达式生成的 ILookup。假设这是按姓氏查找人。 (在我们简单的世界模型中,姓氏在家庭中是唯一的) ILookup families; 现在我有两个对如何构建感兴趣的查询。 首
我试图创建一个 MSI,其中包含 和 exe。在 WIX 中使用了捆绑选项。这样做时出错。有人可以帮我解决这个问题。下面是代码: 错误 error LGH
在 Yii 中,Create 和 Update 通常使用相同的形式。因此,如果我在创建期间有电子邮件、密码、...other_fields...等字段,但我不想在更新期间专门显示电子邮件和密码字段,但
上周我一直在努力创建一个给定一行和一列的 QModelIndex。 或者,我会满足于在已经存在的 QModelIndex 中更改 row() 的值。 任何帮助,将不胜感激。 编辑: QModelInd
出于某种原因,这不起作用: const char * str_reset_command = "\r\nReset"; const char * str_config_command = "\r\nC
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
在今天之前,我使用/etc/vim/vimrc来配置我的vim设置。今天,我想到了创建.vimrc文件。所以,我用 touch .vimrc cat /etc/vim/vimrc > .vimrc 所
我可以创建一个 MKAnnotation,还是只读的?我有坐标,但我发现使用 setCooperative 手动创建 MKAnnotation 并不容易。 想法? 最佳答案 MKAnnotation
在以下代码中,第一个日志语句按预期显示小数,但第二个日志语句记录 NULL。我做错了什么? NSDictionary *entry = [[NSDictionary alloc] initWithOb
我正在使用与此类似的代码动态添加到数组; $arrayF[$f+1][$y][$x+1] = $value+1; 但是我在错误报告中收到了这个: undefined offset :1 问题:尝试创
我是一名优秀的程序员,十分优秀!