当前位置: 首页 > 知识库问答 >
问题:

以排序方式在单循环链表中插入元素

胥承
2023-03-14

我想创建一个程序,该程序以排序方式(给定指向最后一个元素的指针)将数据插入单循环链表中。我已经写了代码,试着调试它,但是没有发现到底出了什么问题。我得到的输出是56779

#include <iostream>

using namespace std;
//structure for list
class Node{
public:
    int val;
    Node* next;
};
//function to add new node and data
Node* insertnode(Node** l,int data){
    Node *new_node, *temp;
    new_node = new Node;
    new_node->val = data;
//if list is empty
    if(*l == nullptr){
        new_node->next = new_node;
        *l = new_node;
        return *l;
    }
//if new element value is greater than last
    if(((*l)->val)<(new_node->val)){
        new_node->next = (*l)->next;
        (*l)->next = new_node;
        *l = new_node;
        return *l;
    }
    temp = (*l)->next;
//if new element value is low than last 
    if(((*l)->val)>(new_node->val)){
        while(temp!=*l){
                if(temp->val>=new_node->val){
                    break;
                }
            temp = temp->next;
        }
        new_node->next = temp->next;
        temp->next = new_node;
        }
    return (*l);
}

void displaylist(Node *l){
    Node* last = l->next;
    do{
        cout<<l->val<<" ";
        last = last->next;
    }while(last->next != l);
    cout<<endl;
}

int main()
{
    Node* last = nullptr;
    last = insertnode(&last, 5);
    displaylist(last);
    last = insertnode(&last, 6);
    displaylist(last);
    last = insertnode(&last, 7);
    displaylist(last);
    last = insertnode(&last, 5);
    displaylist(last);
    last = insertnode(&last, 9);
    displaylist(last);
}

共有1个答案

彭宏深
2023-03-14

让我们来看看displaylist

void displaylist(Node *l){
    Node* last = l->next; // points at first node. Sounds OK
    do{
        cout<<l->val<<" "; // always print last node. Doesn't seem like a good idea
        last = last->next; //advance one node. Sounds OK
    }while(last->next != l); // loop until the node after the next node is back to the last node
                             // Looks past at least one node
    cout<<endl;
}

首先,我们改变周围的一些标识符,以便它们更能描述它们真正代表的内容

void displaylist(Node *last){ // l is the last node
    Node* current = last->next; //current is a better name for the item we're looking at
    do{
        cout<<last->val<<" "; 
        current = current->next; 
    }while(current->next != last);
    cout<<endl;
}

现在,我们开始通过打印出我们正在迭代的项目,而不是一次又一次地打印出第一个项目来解决问题。

void displaylist(Node *last){
    Node* current = last->next;
    do{
        cout<<current->val<<" "; // print out the item we're iterating
        current = current->next; 
    }while(current->next != last);
    cout<<endl;
}

现在我们要做的是在下一个要打印的项目再次是第一个项目时停止,即最后一个项目-

void displaylist(Node *last){
    Node* current = last->next;
    do{
        cout<<current->val<<" "; 
        current = current->next; 
    }while(current != last->next); 
    cout<<endl;
}

那就差不多了。

 类似资料:
  • 本文向大家介绍手写代码:循环链表插入元素?相关面试题,主要包含被问及手写代码:循环链表插入元素?时的应答技巧和注意事项,需要的朋友参考一下 参考回答:   //插入元素 //current->next 0号节点的地址 //若第一次插入节点 //若头插法 current仍然指向头部 //(原因是:跳0步,没有跳走) 中间第一种情况

  • 我是java的初学者。我试图编写一个程序,在给定位置插入一个节点,并显示整个链表。但是,我的节点似乎没有被插入,当我显示链接列表时,只显示第一个节点值。有人能解释一下我哪里出了问题吗? //这里,位置是索引位置。索引从0开始,以大小1结束,就像一个数组。 //插入代码 //遍历代码 //主要方法 输出:

  • 我试图在C中的双向链表上做插入排序。在这种状态下,我的代码让我陷入了一个没有结束的循环,吐出了8和9。 有人能好心解释一下“插入排序”方法是如何设计的吗? 我的链表是设计包含头,上一个,下一个和一些数据。 到目前为止这是我的代码 我的希望破灭了。请帮忙。

  • 我在C语言课程考试前练习一些算法问题,我被这个问题卡住了(至少3个小时甚至4个小时),我不知道如何回答: 您有两个已排序的循环单链接列表,必须合并它们并返回新循环链接列表的标题,而不创建任何新的额外节点。返回的列表也应该进行排序。 节点结构为: 我尝试了很多方法(递归和非递归),但都没有解决问题。 谢谢你的帮助。

  • 我试图用C语言合并排序列表。我在法语维基百科上看到了这里的代码,但它给了我一个不正确的列表(即未排序)。不过,该函数编译得很好。请注意,我并没有真正使用top,我可能很快就会把它从结构中去掉。你能帮我找出这个代码的错误吗?我必须把它从算法伪代码翻译成C代码。非常感谢。 是未排序的输入列表。是列表的长度。

  • 我尝试实现循环链表的insert方法。我想我取得了一些成功。 问题:当我显示列表时。display方法将循环,因为链接的每个next变量都链接到一个非Null节点对象。所以head永远不会是空对象。根据我对单链表的回忆,head总是指向列表中的第一个节点或其中包含数据的第一个节点。 我对循环链表的概念理解:根据我的理解,循环链表有点像一个单链表,但有一点小的变化:尾部对象的下一个变量指向头部。 来