【发布时间】:2019-12-10 12:20:31
【问题描述】:
今天,我收到了老师的新作业。
他告诉我这个作业可能是期末考试的样本。
我试了大概2~3个小时,还是搞不定。
他给了我一个简单的链表代码。下面的粗体字是他想要的。
你能给我一些关于比较节点大小的提示吗?
添加节点与前节点和后节点比较。
2 --> 5 --> 10 --> 20
当我 InsertMiddleNode(7) 时,自动将输入的数字(7) 与 ListNode 进行比较并定位到正确的地方
我的目标:2 --> 5 --> 7(这是我的输入)--> 10 --> 20
老师的代码如下:
void insertMiddleNode(linkedList_h* L, listNode* pre, int x) {
listNode* newNode;
newNode = (listNode*)malloc(sizeof(listNode));
newNode->data = x;
if (L == NULL) { // Empty
newNode->link = NULL; // connect
L->head = newNode;
}
else if (pre == NULL) { //
L->head = newNode; // Insert Node at First
}
else {
newNode->link = pre->link; // after pre node
pre->link = newNode;
}
}
或者是否可以在主代码中实现相同的功能?
int main() {
linkedList_h* L;
listNode* p;
L = createLinkedList_h();
insertLastNode(L, 1);
insertLastNode(L, 5);
insertLastNode(L. 10);
insertLastNode(L, 20); // 1 - 5 - 10 - 20
insertMiddleNode(L, p, 7) // using p = scanf("%d") with If ( p < pre Node )
printList(L) // 2 - 5 - 7 - 10 - 20
}
【问题讨论】:
-
看起来
main中的p(或insertMiddleNode中的pre)应该指向前面的节点(即新节点将插入到pre节点之后)。所以你需要让p指向其data成员设置为5 的节点。insertLastNode是否返回指向它创建的节点的指针?如果是这样,请将p设置为insertLastNode(L, 5);返回的值。 -
@Kihyeon Kim 换你的老师。他是一个弱程序员。这段代码 sn-p if (L == NULL) { // Empty newNode->link = NULL; // 连接 L->head = newNode; } 调用未定义的行为。
-
对了,
insertMiddleNode老师的代码在if (L == NULL)的处理上有一个错误,调用L设置为NULL的函数会导致空指针解引用。 -
在第二个
if/else分支中,你应该将新节点与head后的节点连接起来,newNode->link = L->head; L->head = newNode。 -
致来自莫斯科的 lan abbott & vlad,谢谢您的评论,但我不能更换我的老师。因为他是学校的雇员。无论如何,我了解 L == NULL,这是代码的主要问题之一。我现在再试一次。再次感谢 cmets。
标签: c data-structures linked-list