我一直在努力在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。
感谢所有帮助以及许多有用的评论!
答案 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;
}