C语言 如何从结构函数返回结构?

k10s72fa  于 2023-01-01  发布在  其他
关注(0)|答案(2)|浏览(134)
//The Last attempt//

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

struct WordNode {
  char word;
  int line;
  struct WordNode* left;
  struct WordNode* right;
};

struct WordNode createNode(char word, int line) {
  struct WordNode* node=NULL;
  node =malloc(sizeof(struct WordNode));
  node->word = word;
  node->line = line;
  node->left = NULL;
  node->right = NULL;
  return node;
}

struct WordNode insert(struct WordNode* root, char word, int line) {
  if (root==NULL) {
    return createNode(word, line);
  }

  int cmp = strcmp(word, root->word);
  if (cmp == 0) {
    // word already exists in tree, so do nothing
    return root;
  } else if (cmp < 0) {
    root->left = insert(root->left, word, line);
  } else {
    root->right = insert(root->right, word, line);
  }

  return root;
}

int main(int argc, char argv[]) {
  if (argc != 2) {
    printf("Usage: %s <filename>\n", argv[0]);
    return 1;
  }

  char filename = argv[1];
  FILE *file = fopen("D:\TXTFolder\Text1.txt", "r");
  if (file == NULL) {
    perror("Error opening file");
    return 1;
  }

  struct WordNode *root = NULL;

  char line[256];
  int lineNumber = 1;
  while (fgets(line, sizeof(line), file)) {
    char word = strtok(line, " \n\t");
    while (word != NULL) {
      root = insert(root, word, lineNumber);
      word = strtok(NULL, " \n\t");
    }
    lineNumber++;
  }

  fclose(file);

  return 0;
}

这是一个程序,它读取一个文本文件,并将该文本文件中的唯一字按字母顺序存储在二叉搜索树中,该程序还将C语言中提到的那些存储的唯一字所在的行的索引存储在同一个二叉搜索树中。
createNode()insert()这两个函数中似乎有错误,因为它们都应该返回一个结构体,但似乎我不能。

k7fdbhmy

k7fdbhmy1#

malloc(sizeof(struct WordNode))分配足够的内存来存储struct WordNode,并返回指向该内存的指针;内存的地址,你把它赋给一个struct WordNode*(一个指向struct WordNode的指针),如果你想返回它,你需要返回一个指向struct WordNode的指针。

//              v returns a pointer
struct WordNode *createNode(char word, int line) {
  // malloc returns a pointer
  struct WordNode* node = malloc(sizeof(struct WordNode));

  node->word = word;
  node->line = line;
  node->left = NULL;
  node->right = NULL;

  // this is a pointer
  return node;
}

......以及在其他任何地方返回指向WordNode的指针。
您可以返回struct Node的副本...

struct WordNode createNode(char *word, int line) {
  struct WordNode* node=NULL;
  node =malloc(sizeof(struct WordNode));
  node->word = word;
  node->line = line;
  node->left = NULL;
  node->right = NULL;

  //     v dereferences the pointer so it refers to the actual memory
  return *node;
}

...但现在您无法检查node == NULL之类的内容。
习惯使用指针。
还有一个问题是,你的“word”是一个单一的字符,一个char,但是你把它当作一个字符串来处理,字符串在C中是一个指向字符数组的指针,一个char *

struct WordNode {
  //   v pointer
  char *word;
  int line;
  struct WordNode* left;
  struct WordNode* right;
};

...并且您使用word的其他任何地方都必须是char *word
您还需要将argv[]声明为字符指针(字符串)数组。

//                      v array of strings
int main(int argc, char *argv[]) {

strtok不复制单词,它只是指向原始字符串中的单词。当您存储从strtok返回的word时,它指向line中的内存。每次读取一行时,line都会被覆盖,因此存储的单词也会被覆盖。
您需要将单词复制到新内存。请使用strdup

// line's memory is overwritten each time fgets is called
  while (fgets(line, sizeof(line), file)) {
    // word points to memory in line
    char word = strtok(line, " \n\t");
    while (word != NULL) {
      //                  vvvvvvvvvvvv copy the word from line to new memory
      root = insert(root, strdup(word), lineNumber);
      // word points to memory in line
      word = strtok(NULL, " \n\t");
    }
    lineNumber++;
  }

双引号字符串中的反斜杠表示后面的字符有特殊的含义,如\n表示换行符,\t表示制表符。如果您指的是文字反斜杠,请使用\\

FILE *file = fopen("D:\\TXTFolder\\Text1.txt", "r");
erhoui1w

erhoui1w2#

从一个结构函数返回一个结构
只需返回struct,就像代码返回int一样。

struct WordNode createNode(char word, int line) {
  //struct WordNode* node=NULL;
  //node =malloc(sizeof(struct WordNode));
  //node->word = word;
  //node->line = line;
  //node->left = NULL;
  //node->right = NULL;
  struct WordNode node = {.word = word, .line = line, .left = NULL, .roght = NULL};
  return node;
}

不过这并不是一个好主意,最好分配内存并返回一个指向struct WordNode的指针。
char中可以保存的 words 非常少,像'A''I''O'这样的单词,到目前为止,函数更可能接受指向字符(char *)的指针,并且createNode()将分配引用的 string 的副本。
有关my_strdup()的信息,请参见this

struct WordNode *createNode(const char *word, int line) {
  struct WordNode* node = malloc(sizeof node[0]);
  if (node) {
    node->word = my_strdup(word);
    node->line = line;
    node->left = NULL;
    node->right = NULL;
  }
  return node;
}

相关问题