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

C排序的双链接列表:在列表中间插入的问题

余铭晨
2023-03-14

下面是我当前的代码转换单链接到双向链表。我还没有接触删除功能。我已经得到插入在空列表,结束列表,开始列表显然工作。

然而,插入中间的节点似乎无法创建到前一个节点的链接。我插入的调试行似乎显示了n-

代码如下:

#include <iostream>
#include <string>
using namespace std;

// define a node for storage and linking
class node {
public:
    string name;
    node *next;
    node *prev; 
};

class linkedList {
public:
    linkedList() :top(NULL) {}
    bool empty() { return top == NULL; }
    node *getTop() { return top; }
    node *getEnd() { return end; }
    void setTop(node *n) { top = n; }
    void setEnd(node *p) { end = p; }
    void add(string);
    int menu();
    void remove(string);
    ~linkedList();
     void reversePrint(); 
    friend ostream& operator << (ostream&, const linkedList&); // default output is in-order print.
private:
    node *top;
    node *end; 
};

void main() {
    linkedList l;
    cout << l.empty() << endl;
    int option = 0;
    string s;
    bool go = true;
    while (go) {
        option = l.menu();
        switch (option) {
        case 1: cout << "enter a name: "; cin >> s; l.add(s); break;
        case 2: cout << "enter name to be deleted: "; cin >> s; l.remove(s); break;
        case 3: cout << l; break;
        //case 4: cout << "can not be done with a singly linked list" << endl;
        case 4: l.reversePrint(); break;
        case 5: cout << "exiting" << endl; go = false; break;
        }
    }


    system("pause");
}


void linkedList::remove(string s) {
    bool found = false;
    node *curr = getTop(), *prev = NULL;
    while (curr != NULL) {

        // match found, delete
        if (curr->name == s) {
            found = true;

            // found at top
            if (prev == NULL) {
                node *temp = getTop();
                setTop(curr->next);
                delete(temp);

                // found in list - not top
            }
            else {
                prev->next = curr->next;
                delete(curr);
            }
        }

        // not found, advance pointers
        if (!found) {
            prev = curr;
            curr = curr->next;
        }

        // found, exit loop
        else curr = NULL;
    }
    if (found)cout << "Deleted " << s << endl;
    else cout << s << " Not Found " << endl;
}

void linkedList::add(string s) {
    node *n = new node();
    n->name = s;
    n->next = NULL;
    n->prev = NULL;

    // take care of empty list case
    if (empty()) {
        top = n;
        end = n;

        // take care of node belongs at beginning case
    }
    else if (getTop()->name > s) {


        n->next = getTop();
        n->prev = NULL;
        setTop(n);

        node *temp;
        temp = n->next;
        temp->prev = n;

        // take care of inorder and end insert
    }
    else {

        // insert in order case
        node *curr = getTop(), *prev = curr;
        while (curr != NULL) {
            if (curr->name > s)break;
            prev = curr;
            curr = curr->next;
        }
        if (curr != NULL) { // search found insert point
            n->next = curr;
            cout << n->name << " " << n << " prev " << prev << " " << prev->name << endl;
            n->prev = prev;

            prev->next = n;
            cout << "n->prev is: " << n->prev << " " << n->prev->name << endl;
            cout << "n->next is: " << n->next << " " << n->next->name << endl;
        }

        // take care of end of list insertion
        else if (curr == NULL) {// search did not find insert point
            prev->next = n;
            n->prev = prev;
            cout << "n->prev is: " << n->prev << " " << n->prev->name << endl;
            setEnd(n);
        }
    }
}

ostream& operator << (ostream& os, const linkedList& ll) {
    //linkedList x = ll; // put this in and the code blows up - why?
    node *n = ll.top;
    if (n == NULL)cout << "List is empty." << endl;
    else
        while (n != NULL) {
            os << n->name << endl;
            os << n << endl;
            if (n->next != NULL) {
                os << "next is " << n->next << endl;
            }

            n = n->next;
        }
    return os;
}

void linkedList::reversePrint() {
    node *n = end;


    if (n == NULL)cout << "List is empty." << endl;
    else
        while (n != NULL) {
            //cout << n->name << endl;
            cout << "memory address of " << n->name << " is " << n << endl;

            if (n->prev != NULL) {
                cout << "prev is " << n->prev << endl;
            }
            n = n->prev;
        }
    return;
}
// return memory to heap
linkedList::~linkedList() {
    cout << "~linkedList called." << endl;
    node *curr = getTop(), *del;
    while (curr != NULL) {
        del = curr;
        curr = curr->next;
        delete(del);
    }
}

int linkedList::menu() {
    int choice = 0;
    while (choice < 1 || choice > 5) {
        cout << "\nEnter your choice" << endl;
        cout << " 1. Add a name." << endl;
        cout << " 2. Delete a name." << endl;
        cout << " 3. Show list." << endl;
        cout << " 4. Show reverse list. " << endl; 
        cout << " 5. EXIT " << endl;
        cin >> choice;
    }
    return choice;
}

共有1个答案

费星晖
2023-03-14

在插入中间时,您没有设置当前的上一个值,只需执行以下操作:

n->next = curr;
curr->prev = n;  // <-- this
 类似资料:
  • 因此,我对数据结构很陌生,我在对数组进行排序时,在尝试了几天之后,我偶然发现了双链表的插入排序。我仍然无法理解排序有什么问题,是的,我已经在线检查过,我不能只插入排序,我需要对函数参数中传递的列表进行排序,它的名称是internationSort(Dlinkedlist-arr)。 ` ` 我尝试实现它,但我被困住了,因为处理数组的逻辑有点不同,因为我们正在使用 next 和 prev 指针,这使

  • 我正在尝试为一个项目创建一个双链接列表容器。我不能使用任何std容器。必须对双链接列表进行排序。以下是我目前的代码: 我遇到的问题是在我的插入函数中。我正在使用调试器,并在以下行插入代码:list.insert(10);。 它正确地进入第一种情况,即head==nullptr并创建节点。当我进入下一行代码(list.insert(20))时,它会用这一行创建一个节点:node*node=newno

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

  • 给我一个指向排序双向链表的头节点的指针和一个插入到列表中的整数。我被告知创建一个节点并将其插入到列表中的适当位置,以保持其排序顺序。头节点可能是NULL。 样本输入 空,数据=2 NULL 样本输出 NULL NULL 我试过上面的问题。但我的程序因超时而终止。在下面的代码中,我做错了什么。假设节点类和主函数已经存在。非常感谢!!

  • 我有以下代码,它是双链表实现的一部分。然后,我必须使用我的ADT实现来创建一个表,其格式为(它是一个字符串)、(它是uint32_t类型)(因此是一个2列的表)。 我需要首先创建这个表,然后添加到这个记录。 我的困难在于实现一个函数,该函数将要添加的值插入到这个特定的表中。我需要另一个插入功能,还是必须编辑我拥有的功能? 如果需要一个新的函数作为参数:一个指向结构类型的新表>代码> ListSt目

  • 我对C模板非常陌生。我目前正在做一个项目,我需要使用模板实现双重链接列表。以下是我目前所拥有的: 然而,在我的析构函数中,为什么我不能访问节点元素?该方法中的代码现在已编译,但不会抛出错误。但是如果我尝试使用- 此外,我如何在函数头中初始化list==NULL,而不是在类之外进行初始化?