c - 将数据存储在列表 c 中

标签 c list

我的程序的想法是从一个文件中读取数据(在本例中文件包含 5 个名称),并将它们存储在一个列表中,因此我可以稍后使用这些数据来计算最小/最大字符。到目前为止,我已经能够读取数据并将其打印出来,但我不想打印,而是想将它们保存到列表中。我找不到解决此问题的方法,因此非常感谢您的帮助。

#include <stdio.h>
#include <stdlib.h>

int main(void) {

    char file, filename[25];
    FILE *f;

    printf("Enter the file name: ");
    scanf("%s", filename);

    f = fopen(filename, "r");

    if (f == NULL)
    {
        perror("No file found.\n");
        return 0;
    }

    printf("The contents of %s file are:\n", filename);

    while((file = fgetc(f)) != EOF)
        printf("%c", file);

    fclose(f);

    return 0;
}

最佳答案

只是一个使用列表链接名称的简单示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct NameList {
  char * name; 
  struct NameList * next;
} NameList;

int append(NameList ** head, NameList ** tail, char * s)
{
  NameList * l;

  if (((l = malloc(sizeof(NameList))) == NULL) ||
      ((l->name = strdup(s)) == NULL))
    /* not enough memory */
    return 0;

  l->next = NULL;
  if (*head == NULL) {
    *head = *tail = l;
  }
  else {
    (*tail)->next = l;
    *tail = l;
  }

  return 1;
}

int main(void) {
  char filename[25];
  FILE * f;

  printf("Enter the file name: ");
  if (scanf("%24s", filename) != 1)
    return 0;

  f = fopen(filename, "r");

  if (f == NULL)
  {
    puts("No file found.");
    return 0;
  }

  NameList * head = NULL;
  NameList * tail = NULL;
  char s[64];

  /* suppose a name has no space even composed and less than 64 characters */
  while (fscanf(f, "%63s", s) == 1) {
    if (!append(&head, &tail, s))
      return 0;
  }

  fclose(f);

  printf("The names in %s file are:\n", filename);

  NameList * l;

  l = head;
  while (l != NULL) {
    puts(l->name);
    l = l->next;
  }

  /* search longer name */
  size_t maxlen = 0;
  char * longer = NULL;

  l = head;
  while (l != NULL) {
    size_t ln = strlen(l->name);

    if (ln > maxlen) {
      maxlen = ln;
      longer = l->name;
    }

    l = l->next;
  }
  if (longer != NULL)
    printf("longer name is : %s\n", longer);

  /* free resources */
  while (head != NULL) {
    l = head;
    head = head->next;
    free(l->name);
    free(l);
  }

  return 0;
}

编译与执行

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra l.c
pi@raspberrypi:/tmp $ cat aze
firstname secondname
anothername
lastname
pi@raspberrypi:/tmp $ ./a.out
Enter the file name: aze
The names in aze file are:
firstname
secondname
anothername
lastname
longer name is : anothername

valgrind 下执行

pi@raspberrypi:/tmp $ valgrind ./a.out
==10132== Memcheck, a memory error detector
==10132== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==10132== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==10132== Command: ./a.out
==10132== 
Enter the file name: aze
The names in aze file are:
firstname
secondname
anothername
lastname
longer name is : anothername
==10132== 
==10132== HEAP SUMMARY:
==10132==     in use at exit: 0 bytes in 0 blocks
==10132==   total heap usage: 12 allocs, 12 frees, 6,570 bytes allocated
==10132== 
==10132== All heap blocks were freed -- no leaks are possible
==10132== 
==10132== For counts of detected and suppressed errors, rerun with: -v
==10132== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 3)

请注意,链表可以替换为 char* 数组,在读取名称等时使用 realloc 来增加其大小

关于c - 将数据存储在列表 c 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815526/

相关文章:

iphone - 有没有办法从 iPhone 上的标准输入读取,无论是硬件还是模拟器?

c - 如果 Windows UAC 被拒绝,有没有办法让代码以较低的权限运行

c - *(x+4) 和 (x+4) 之间的差异

c# - 将项目部分复制到列表的最佳方法?

"for"循环中的 Java 最佳实践。如何定义集合?

java - 通过ArrayLists排序,代码问题

c++ - MinMax堆算法实现

将程序员的记事本配置为 Visual C++ 中的编辑器

javascript - onClick 对子 <li> 使用react

java - 测量Java中单链表的大小/长度?