【问题标题】:Convert String to a Linked List将字符串转换为链表
【发布时间】:2013-06-27 00:00:35
【问题描述】:

1) 我需要从文件中读取一个字符串并将该字符串转换为一个链表

所以...如果我读到这个字符串“Some String”

链表如下所示

节点1-“S”

node2 - “o”

node3 - "m"

node4 - "e"

node5 - NULL

node6 - "S"

node7 - "t"

node8 - "r"

node9 - "i"

node10 - “n”

node11 - “g”

node12 - NULL

将为“”(空格)和“\0”空字符发出NULL

什么是最好的实现方式..

typedef struct node
{
// each node holds a single character
char data;

// pointer to next node in linked list
struct node *next;
} node;

int i;
char buffer[1032];

    FILE *ifp = fopen("file.txt", "rb");

    //read the first line of file
    fscanf(ifp, "%s", buffer);

node *myList = malloc(sizeof(node));

for(i = 0; i < strlen(buffer); i++)
    /*I DON'T KNOW WHAT TO DO HERE!!!!*/

我迷路了,或者如果我的实现完全错误,请告诉我

【问题讨论】:

  • 请记住用您使用的语言(可以是 C 或 C++)标记您的问题。
  • /*I DON'T KNOW WHAT TO DO HERE!!!!*/?好吧,我会说对于字符串中的每个字符,您需要创建并初始化一个节点,然后将列表的尾部指向新节点。

标签: c list pointers linked-list malloc


【解决方案1】:

您的fscanf(ifp, "%s", buffer); 将在读取“Some”后停止。我改用 fgets()。在手册中(man fgets):

fgets() 从流中最多读入一个小于 size 的字符 并将它们存储到 s 指向的缓冲区中。读 在 EOF 或换行符之后停止。如果读取换行符,则将其存储 进入缓冲区。 '\0' 存储在最后一个字符之后 缓冲区。

最后一个 '\0' 便于将缓冲区作为字符串处理。 所以我在FILE *ifp = fopen("file.txt", "rb"); 之后的代码是:

fgets(buffer,1032-1,ifp);
node *myList,*head,*pre = NULL;

for(i = 0; buffer[i] != '\0' ; i++) {
    myList = malloc(sizeof(node));
    myList->data = buffer[i];   
    if(pre!=NULL)
        pre->next = myList;
    else
        head = myList;
    pre = myList;
}

while(head!=NULL) {
    printf("%c\n",head->data);
    head=head->next;
}
fclose(ifp);

你的工具将'\n'和空格存储为NULL,当你改变它就可以了

myList->data = buffer[i];

if(buffer[i]=='\n' || buffer[i]==' ')
    myList->data = 0;
else
    myList->data = buffer[i];

【讨论】:

    【解决方案2】:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct node {
        char data;         // each node holds a single character
        struct node *next; // pointer to next node in linked list
    } node;
    
    int
    main(int argc, char* argv[]) {
        int i;
        FILE* fp = fopen("example.txt", "r");   
        if (!fp) {
            perror("fopen");
            exit(1);
        }
    
        node *top = NULL;
        node *cur = NULL;
        int c;
        while ((c = fgetc(fp)) >= 0) {
            node *item = malloc(sizeof(node));
            item->data = c;
            item->next = NULL;
            if (!cur) {
                // first time, store top.
                top = cur = item;
            } else {
                // chain nexts.
                cur->next = item;
                cur = item;
            }
        }
        fclose(fp);
    
        // print datas
        cur = top;
        while (cur) {
            printf("%c\n", cur->data);
            cur = cur->next;
        }
    
        // free datas
        cur = top;
        while (cur) {
            node *item = cur->next;
            free(cur);
            cur = item;
        }
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 2020-04-17
      相关资源
      最近更新 更多