【问题标题】:Linked list insertion using recursion使用递归的链表插入
【发布时间】:2011-03-24 22:54:11
【问题描述】:
//list.h file
typedef struct _lnode{
    struct _lnode *next;
    unsigned short row;
    unsigned short column;
    short data;
}lnode;

typedef struct _llist{
    struct _lnode *head;
    unsigned int size;

}llist;

//list.c file
void add(llist *list, lnode *newNode){
    list->size++;
    addRecursion(&list->head, newNode);
}

lnode* addRecursion(lnode **node, lnode *newNode){
     if(*node == NULL){
         *node = newNode;
     }
     else{
          lnode *nextNode = *node->next;
          *node->next = addRecursion(&nextNode, newNode);
     }
     return node;
}

//main function
llist list;
list.head = NULL;

lnode* new_node;
new_node = make_node(1,1,2);
add(&list, new_node);
printList(list.head);

我认为我在 addRecursion 函数中存在问题,尤其是在“else”语句中。 自从我开始使用双指针以来,我感到很困惑... 我该如何解决这个问题?

【问题讨论】:

  • 如果您要解释 (1) 您希望您的代码做什么,(2) 它实际上做了什么,以及 (3) 为什么您对 #2 不满意(如果这不是很明显)。
  • 首先列表没有初始化为 NULL,并且在 addRecursion 中执行 *node == NULL。
  • 另外:如果这是家庭作业,你应该这么说。 (如果它看起来像家庭作业,而你说是不是,有些人会因为害怕为你做作业而避免回答。)
  • 不,它不是硬件。我通常使用基于 java 或 c# 参考的语言。我只是想为以后的工作面试练习自己..
  • 我希望递归地将一个新节点插入到链表中......并且 addRecursion 函数现在不起作用......

标签: c recursion linked-list


【解决方案1】:

首先将*node->next 替换为(*node)->next,因为-> 的优先级高于*

同样在addRecursion 中,将return node 替换为return *node,因为node 是双指针,而您返回一个普通指针。

【讨论】:

    【解决方案2】:

    调用地址递归??在别的。似乎无限地称呼自己;

    首先你设置 newNode->next 指向头部(节点)。 并且你需要修改head以指向新节点。

    您的代码没有这样做,因为它使用了 head 中包含的地址的副本。

    【讨论】:

      【解决方案3】:

      你的nextNode 是本地的,所以它上面的& 给出了堆栈上一个局部变量的地址。相反,您需要传递&node->next,然后返回值无关紧要(就像在add 中的第一次调用中,您丢弃了返回值)。

      【讨论】:

      • 我替换了 addRecursion(&nextNode, newNode);添加递归(&node->next, newNode);
      猜你喜欢
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-10-11
      • 1970-01-01
      相关资源
      最近更新 更多