【问题标题】:LinkedList Adding Node compared by size with CLinkedList 添加节点按大小与 C 比较
【发布时间】: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-&gt;link = L-&gt;head; L-&gt;head = newNode
  • 致来自莫斯科的 lan abbott & vlad,谢谢您的评论,但我不能更换我的老师。因为他是学校的雇员。无论如何,我了解 L == NULL,这是代码的主要问题之一。我现在再试一次。再次感谢 cmets。

标签: c data-structures linked-list


【解决方案1】:
void MiddleNode(linkedList_h* L, int x) {
    if (L == null)
         return

    //setp 1: find the previous node
    listNode* prev = null;
    for (listNode* node = L->head; node && node->data < x; node = node->link)
        prev = node;

    //step2: be sure prev is not null
    if (prev == null)
        return;
        //or call inserFirstNode(L, x) and return

    //step 3: call your teacher's function
    insertMiddleNode(L, prev, x);
    return;
}

如果 L 不存在则返回,否则你会崩溃

第一步很简单,循环遍历列表找到上一个元素 但是您最终可能会以 null 作为 prev 节点(因为列表为空或 x 是最小的),在这两种情况下您都需要返回(否则您将破坏列表)。 然后调用你老师的函数

【讨论】:

  • 感谢评论,但它不起作用。我认为我的代码中会有更多问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-04
  • 1970-01-01
  • 2013-09-08
相关资源
最近更新 更多