附加在链表的末尾

时间:2013-02-23 11:34:52

标签: c linked-list append

我一直在努力在C中实现链接列表,所以在有人对我大喊之前:是的,这是“家庭作业”。我一直在尝试解决和处理来自Nick Parlante的“链接列表基础知识” - 免费提供:http://cslibrary.stanford.edu/103

功能:在链表末尾插入元素

我偶然发现了一个实现问题,并设法构建了一个解决方法:如果我在LList中使用“EndPointer”,我可以使用return函数设置函数的EndPointer来移交新的ReferencePointer然后在其中更改它主

代码 - 工作正常,但正在解决方法:

// within main
lastPtrRef = _pushEnd(lastPtrRef, i);

// == function: push to end
node** _pushEnd(node **endRef, int value)
{
    // 1) allocate stack mem / make room for new element
    node *newNode = malloc(sizeof(node));

    // do the data work
    newNode->value = value;

    // 2) make  element point to NULL (fo beeing the new last element
    newNode->next = NULL;

    // 3) make old last element point to new element
    *endRef = newNode;

    return &(newNode->next); // more readable then vers. below
    // this returns the mem address only of the pointer of the node!!!
    //return (&((*endRef)->next));

}

=============================================== ===============================

这就是我在函数中完成所有工作所做的事情,但它实际上不起作用。关于我没有得到的任何提示?!

void _pushEnd(node **endRef, int value)
{
// 1) allocate stack mem / make room for new element
node *newNode = malloc(sizeof(node));

// do the data work
newNode->value = value;

// 2) make  element point to NULL (fo beeing the new last element
newNode->next = NULL;

// 3) make old last element point to new element
*endRef = newNode;

}

可能是,我实际上需要一个指向引用指针的指针,实际上将指针的内容更改为最后一个元素(在scope:main中),这样我目前似乎只是修改局部变量“ endRef“而不是它的内容?!

任何帮助将不胜感激......


编辑: 我们的想法是在LList的开头不使用虚节点进行追加。

我的结构看起来像这样:

typedef struct node     {
int     value;
struct node *next;      } node;

main - 局部变量(堆栈):

node *head = NULL;
node **lastPtrRef = &head;

编辑: 无论如何,大多数命题最终都返回了refPointer。但也许这不是一个坏主意,因为它不需要再一个refPointer到refPointer。

感谢所有帮助以及许多有用的评论!

4 个答案:

答案 0 :(得分:3)

*endRef = newNode;

在您这样做之前,您必须将旧的endRef->next指向newNode

if (*endRef)
    (*endRef)->next = newNode;

*endRef = newNode;

答案 1 :(得分:3)

_pushEnd告诉main main已知道的内容:指针存储在哪里。

您有很多选择,包括:

  • pushEnd获取节点*(不是节点**),返回新指针并将main存储在变量中

  • pushEnd获取节点**并自行覆盖main的值,无需返回任何内容。

修改

第1点的示例:

node* pushEnd(node* end, int entry); // returns new end.
int main() {
    node* end = newlist();
    int i=0;for(;i<10;++i) {
        end = pushEnd(end, i);
    }
}

第2点的示例:

void pushEnd(node** ptrToEnd, int entry); // changes *ptrToEnd
int main() {
    node* end = newlist();
    int i=0;for(;i<10;++i) {
        pushEnd(&end, i);
    }
}

答案 2 :(得分:1)

我认为你的问题在于回报的界限:

return (&((*endRef)->next));

正如您在此*endRef = newNode;之前所做的那样,它现在返回您刚刚创建的节点的下一个元素的方向。

答案 3 :(得分:1)

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

struct node *root = NULL
   , **lastPtrRef = &root;

 // within main
lastPtrRef = pushEnd(lastPtrRef, i);

//function: push to end; return new pointer to tail->next

struct node  **pushEnd(struct node **p, int value)
{
    struct node *p;

    // 0) is it really the end ?    
    while (*pp) {pp = &(*pp)->next; }

    // 1) allocate
    p = malloc(sizeof *p);

    // do the data work
    p->value = value;

    // 2) make  element point to NULL (fo beeing the new last element
    p->next = NULL;

    // 3) make old last element point to new element
    *pp = p;

    return &p->next;

}

或删除p变量,因为它不需要:

struct node  **pushEnd(struct node **p, int value)
{

    while (*pp) {pp = &(*pp)->next; }

    *pp = malloc(sizeof **pp);
    (*pp)->value = value;
    (*pp)->next = NULL;

    return &(*pp)->next;

}