双向链表中按字母顺序排序的链接

Posted

技术标签:

【中文标题】双向链表中按字母顺序排序的链接【英文标题】:Alphabetically sorted links in doubly linked list 【发布时间】:2018-03-15 04:22:37 【问题描述】:

我在让我的程序在链接列表中插入给定名称及其权重时遇到了一些麻烦,该链接列表具有名称和权重的相应链接,它们都按升序/字母顺序排序。权重链接工作正常,但我似乎无法确定我的名称链接器有什么问题。任何帮助将不胜感激。问题很可能在于 insertName() 私有函数。

#include <iostream>
#include <string>

using namespace std;

class DoublyLinkedList

public:
    void insert(string name, double weight);
    void printNameAsc();
    void printWeightAsc();

private:
    struct Node
    
        string name;
        double weight;
        Node* nextName;
        Node* nextWeight;
    ;
    Node* nameHead = NULL;
    Node* weightHead = NULL;
    Node* newP = NULL;

    void insertName();
    void insertWeight();
;
void DoublyLinkedList::insert(string name, double weight)

    // variable declaration
    newP = new Node;
    newP->name = name;
    newP->weight = weight;
    newP->nextName = NULL;
    newP->nextWeight = NULL;

    // empty first element check
    if (nameHead == NULL && weightHead == NULL)
    
        nameHead = newP;
        weightHead = newP;
        return;
    

    // name and weight insertion
    insertName();
    insertWeight();

    return;

void DoublyLinkedList::insertName()

    Node* activeP = nameHead;
    Node* prevP = NULL;

    // traversing through name links
    while (true)
    
        if (activeP == NULL)
        
            break;
        

        if ((activeP->name).compare(newP->name))
        
            break;
        

        prevP = activeP;
        activeP = activeP->nextName;
    

    //insertion
    newP->nextName = activeP;
    if (activeP == nameHead)
    
        nameHead = newP;
    
    else
    
        prevP->nextName = newP;
    

    return;

void DoublyLinkedList::insertWeight()

    Node* activeP = weightHead;
    Node* prevP = NULL;

    // traversing through weight links
    while (true)
    
        if (activeP == NULL)
        
            break;
        

        if (newP->weight < activeP->weight)
        
            break;
        

        prevP = activeP;
        activeP = activeP->nextWeight;
    

    //insertion
    newP->nextWeight = activeP;
    if (activeP == weightHead)
    
        weightHead = newP;
    
    else
    
        prevP->nextWeight = newP;
    

    return;

void DoublyLinkedList::printNameAsc()

    Node* activeP = nameHead;

    while (activeP != NULL)
    
        cout << activeP->name << " " << activeP->weight << endl;
        activeP = activeP->nextName;
    

    return;

void DoublyLinkedList::printWeightAsc()

    Node* activeP = weightHead;

    while (activeP != NULL)
    
        cout << activeP->name << " " << activeP->weight << endl;
        activeP = activeP->nextWeight;
    

    return;


int main()

    DoublyLinkedList nameList;

    nameList.insert("Michael", 275);
    nameList.insert("Tom", 150);
    nameList.insert("Abe", 200);

    nameList.printNameAsc();
    system("pause");
    nameList.printWeightAsc();
    system("pause");
    return 0;

【问题讨论】:

【参考方案1】:

很确定你的问题在这里:

    if ((activeP->name).compare(newP->name) > 0)
    
        break;
    

看起来您正在使用 activeP 查找插入点。当 activeP->name > newP->name 时,要停止搜索。

if ((activeP->name).compare(newP->name))

无效,如果 activeP newP (compare statement is 1) 将评估为 true,有效地只跳过同名的人。

记住,从 C 中继承,真被定义为非假,它被定义为 (!0)

另外,为什么不直接将 newP 的引用传递给 insertName() 和 insertWeight()?最好不要将(可能是悬空的)指针存储为成员变量。

【讨论】:

谢谢!我没有意识到这一点,也完全忘记了比较函数返回 -1,0 或 1 而不是布尔值。 在 insertName/Weight 函数中使用的 newP 是否是潜在的悬空指针? @michael16574 不,不保存只是临时的指针只是一般的好习惯。如果在 insert() 中的初始化和对 insertName/weight 的调用之间以某种方式删除了 newP,您将得到一个段错误。 如果在调用之前以某种方式删除了 newP,对 newP 的引用是否也会被破坏?或者它就像一个“备份”参考? 是的,这是一个人为的例子,实际上永远不会发生......但是,将本地指针保存为成员变量并不是很好的做法。考虑一个事实,如果 newp 不是成员 var,而是通过引用传递。使 newp 失效的唯一方法是在 insertname/weight 函数中。

以上是关于双向链表中按字母顺序排序的链接的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记(单链表单循环链表带头双向循环链表)的增删查改排序等)

双向链表模板向量中的输入排序(C++)

线性表--03---链表----单向链表双向链表

JAVA数据结构--LinkedList双向链表

数据结构 -- 链表&双向链表

双向链表排序c语言程序设计