【问题标题】:'addFirst' method in Linked List in CC中链表中的'addFirst'方法
【发布时间】:2012-09-20 10:30:37
【问题描述】:

我有一个我创建的列表:

struct list_t {
   int value;
   struct list_t* next;
};

我的'addFirst':

void addFirst(struct list_t* head,int value) {

    struct list_t* toAdd = (struct list_t*) malloc (sizeof (struct list_t));
    toAdd->value = value;

    toAdd->next = head;
    head = toAdd;
}

问题是当我将新的“节点”添加到列表中时,它在函数中起作用(使用 DDD 调试器查看),但是当我退出函数时,我的列表保持不变。

我知道这可以通过让我的方法返回struct list_t* 而不是void 来完成,也可以通过将指向 head 指针的指针作为参数 (struct list_t** PtoHead) 传递,但我的问题是如果可以使用我的方法来做到这一点(即返回void 并有一个指向head 的指针作为参数)。

【问题讨论】:

    标签: c pointers linked-list singly-linked-list


    【解决方案1】:

    你可以做到,但会很丑。

    如果将新元素链接为元素编号 2,并相应地移动数据,则可以用新元素替换旧头部,同时在其后添加新元素:

    void addFirst(struct list_t* head, int value)
    {
        struct list_t* toAdd = malloc(sizeof *toAdd);
    
        toAdd->value = head->value;
        head->value = value;
        toAdd->next = head->next;
        head->next = toAdd;
    }
    

    这假设head 不为NULL,对于这种情况,我认为使用这个原型是不可能解决的。

    我强烈建议不要这样做,这非常不直观。

    【讨论】:

    • 天哪,这很糟糕,但我想我必须这样做,看看我如何无法改变方法。非常感谢!
    • 尽管如此,还是一个巧妙的技巧。 +1。
    • @OonicaRadu 是的,这非常糟糕,因为如果您在其他任何地方保存了指向某些结构的指针,之后它们就不再指向好的值。您应该使用struct list_t **head 方法:) PS:命名结构时要小心,list_t 更像是 typedef 名称而不是结构名称...
    猜你喜欢
    • 1970-01-01
    • 2013-09-19
    • 2016-06-10
    • 2015-04-03
    • 2014-04-13
    • 2016-06-11
    • 1970-01-01
    • 2016-01-13
    • 2016-06-11
    相关资源
    最近更新 更多