【问题标题】:C++: Sorting linked list in order by number errorC ++:按数字错误对链表进行排序
【发布时间】:2018-05-22 20:27:09
【问题描述】:

我正在阅读的文件如下所示:

t 44

c 13

47

19

g 41

n 51

。 4

以此类推,一共有53行。我需要阅读这些行并使用 addInOrder 函数将它们按顺序排列。我用 cout's 做了一个测试,我看到了

字母= t,数字= 44,头部= 44

字母= c,数字= 13,头= 13

字母= a , 数字= 47 , 头= 13

字母:[空格] , num= 19 , head= 13

字母:g , num= 41 , head= 13

字母:n,num=51,head=13

信:. , 数量= 4 , 头= 13

直到稍后 num = 12 时,head 才会改变,然后在 num = 1 时再次改变。然后 head 等于 1,直到它完成添加。

当我最后打印时,链接列表按第一个数字而不是整数排序,它遵循顺序:

  • 1
  • 10
  • 11
  • ...
  • 19
  • 2
  • 20
  • 21
  • ...
  • 29
  • 3
  • 30
  • 31

等等...我需要它是:

  • 1
  • 2
  • 3
  • ...
  • 9
  • 10
  • 11

addInOrder 函数的逻辑是否有错误?

这是我的主要内容:

#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <stdio.h>
#include <ctype.h>

using namespace std;

struct ListNode
{
    string letter;
    string num;
    ListNode *next;
};

void addInOrder(ListNode *&h, string l, string n);
void printList(ListNode *h, int &lengthOfFile);
void deleteList(ListNode *&h);

int main()
{
    string letter;
    string num;
    string lines;
    int lengthOfFile = 0;
    const string FILENAME = "link to file";
    ifstream inFile(FILENAME);
    
    ListNode *head = nullptr;
    
    if (inFile)
    {
        string line;
        for (int lineNum = 1; getline(inFile, line); lineNum++)
        {
            stringstream ss(line);
            string word;

            for (int wordNum = 1; ss >> word; wordNum++)
            {
                if (wordNum == 1)
                {
                    char c = word[0];
                    
                    if (isalpha(c))
                    {
                        letter = c;
                    }
                    else if (word == "!" or word == ".")
                    {
                        letter = word;
                    }
                    else if (word != "!" or word != ".")
                    {
                        letter = "  ";
                        num = word;
                        lengthOfFile++;
                        if (wordNum == 1)
                        {
                            addInOrder(head, letter, num);
                        }
                    }
                }
                if (wordNum == 2)
                {
                    num = word;
                    lengthOfFile++;
                }
                if (wordNum == 2)
                {
                    addInOrder(head, letter, num);
                }
            }
        }
    inFile.close();
    }

    printList(head, lengthOfFile);
    
    deleteList(head);
}

这是我按数字顺序添加到链接列表的函数:

void addInOrder(ListNode *&h, string l, string n)
{
    ListNode *newNode;
    newNode = new ListNode;
    
    newNode->letter = l;
    
    newNode->num = n;
    
    if (h == nullptr)
    {
        h = newNode;
        newNode->next = nullptr;
    }
    else
    {
        ListNode *prev = nullptr;
        ListNode *curr = h;
        
        while ((curr != nullptr) && (curr->num < n))
        {
            prev = curr;
            curr = curr->next;
        }
        if (prev == nullptr)
        {
            h = newNode;
            newNode->next = curr;
        }
        else
        {
            prev->next = newNode;
            newNode->next = curr;
        }
            
    }
}

打印列表以确保索引:

void printList(ListNode *h, int &lengthOfFile)
{
    ListNode *ptr = h;  
    
    for(int i = 0; i < lengthOfFile; i++)
    {
        cout << ptr->letter << " ";
        cout << ptr->num << " ";
        cout << endl;
        ptr = ptr->next;
    }
    cout << endl;
}

删除列表:

void deleteList(ListNode *&h)
{
    ListNode *ptr;
    while (h != nullptr)
    {
        ptr = h;
        h = h->next;
        delete ptr;
    }
}

【问题讨论】:

标签: c++ pointers linked-list nodes


【解决方案1】:

您在比较 string,而不是数字。该列表按字母顺序正确排序。

如果您希望它按数字顺序排序,则必须将字符串转换为整数(或任何其他数值)。

【讨论】:

  • 我不敢相信我错过了!有效!谢谢。
  • 如果您想保持字符串排序行为,您可以强制每个条目附加 0。 001, 002, 010, 011。我不建议这样做,只是让你知道。
猜你喜欢
  • 2015-12-08
  • 2019-05-14
  • 2015-05-03
  • 2014-06-04
  • 2016-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
相关资源
最近更新 更多