【问题标题】:inserting in front of linked list without a dummy node在没有虚拟节点的链表前面插入
【发布时间】:2019-12-20 16:29:02
【问题描述】:

我正在尝试插入一个按节点-> 名称排序的链表的前面,并且我在文件系统中没有虚拟节点-> curr->subdir


typedef struct Unix{

  struct Node *curr;
  struct Node *root;


}Unix;

typedef struct Node{

  struct Node *next;
  struct Node *subdir;
  struct Node *parent;
  char *name;
  char *field;

}Node;

下面是我插入到按名称排序的链表中


/* iter is a node used to traverse LL */

if(iter-> next == NULL && strcmp(iter->name, arg) > 0){
      if(iter == filesystem-> curr-> subdir){
/* error occurs when placing node in the front of the list */
    temp = malloc(sizeof(Node));

    temp-> parent = filesystem-> curr-> subdir-> parent;
    temp-> subdir = NULL;
    temp-> name = malloc(strlen(filesystem->curr->subdir->name) + 1);
    strcpy(temp-> name, filesystem-> curr-> subdir-> name);
    temp-> next = NULL;

/* add is the node that's being inserted */
    add-> next = temp;

    filesystem-> curr->subdir = add;

尝试将 add 作为文件系统中的第一个节点 -> curr-> subdir 并将前一个 subdir 节点移动到 add-> next 时发生错误。

编辑:该程序是对 unix 机器的基本模拟。

【问题讨论】:

  • 实际上 all 您的字符串缓冲区只有一个字节小。您的代码中有三个。 NUL 字符串终止符需要多一个字节。
  • 你应该给我们看minimal reproducible example。尤其是调用mkdir的代码也可能是错误的。

标签: c


【解决方案1】:

这就是我开始怀疑存在错误的地方(就在代码的开头):

add-> parent = malloc(sizeof(Node));
add-> parent = filesystem-> curr;

你分配了两次add-> parent,这意味着它显然会获得后一个分配,而前一个分配“浪费了”。

除了程序中的内存泄漏(因为您将无法释放此分配的内存块)之外,很有可能将 add-> parent 设置为该值并不是您的想法。

【讨论】:

  • 父级没有在这个函数中使用,但在其他函数中使用并且工作正常。我的问题是在插入一个节点时,它将成为文件系统-> curr-> 子目录的链表中的第一个节点。例如,如果 B 作为 filesystem-> curr-> subdir 中的节点位于前面,并且我尝试插入 A,则无法将 A-> next 设置为 B 并设置 filesystem-> curr-> subdir等于 A
  • 虽然这是真的,但这并不是他的代码中唯一的问题。
  • @MelvinMolina add-> parent = malloc(sizeof(Node)); add-> parent = filesystem-> curr; 在概念上是错误的。这就像写int x; x = 12 ; x = 34;
  • @Jabberwocky 你是对的。我已经做出改变了。我还没有调查任何内存泄漏,但这绝对是发生这种情况的一个案例。
  • @MelvinMolina 这不是内存泄漏的问题,而是应该进入add-> parent 的问题。是malloc(sizeof(Node)); 还是filesystem->curr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2016-09-24
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多