c++ - 使用 C++ 中的链表按字母顺序对字符串进行排序

标签 c++ string sorting linked-list

我正在对字符串链表进行赋值。在我进入排序部分之前,一切似乎都运行良好。我也在使用类(class)。我已经有2个功能。第一个 minimum(string) 返回按字母顺序排在第一位的字符串。

这个函数工作正常。我还有一个函数 remove(string),它从链表中删除包含给定字符串的节点。如果成功则返回 true,否则返回 false(如果字符串不在列表中),在这种情况下,我必须删除 minimum(string) 函数返回的字符串。我遇到问题的函数是 sort()

它要我定义一个 StringNode 指针作为新列表(空列表)的头部,然后我需要一个循环,我将在其中调用 minimum(string) 的函数删除(字符串)。在循环内,我还需要将此节点插入到新列表中的正确位置(将其附加到末尾)。旧的头指针(现在为空)必须指向新列表。

我对此很困惑,到目前为止我有这个:

void StringList::sort()
{
    StringNode *newList = new StringNode;
    newList = NULL;

    string mini;
    bool removed;

    while (newList->next != NULL)
    {
        StringNode *newList2 = new StringNode;
        StringNode *p = head;
        mini = minimum();
        p->data = mini;
        p->next = NULL;
        newList2 = newList2->next;
        newList2->next = p;
        removed = remove(mini);
        newList = newList2;
    }
}

我的理解是:我需要创建一个新节点,它将是一个空列表,意思是 newList->next = NULL; 然后在循环中我需要创建另一个新节点,和一个指向循环内新节点头部的指针。我需要将最小值给出的值存储在指针 p 和指向新节点的指针中。

任何帮助将不胜感激。谢谢!

这里是孔程序。

//字符串列表.cpp

#include <iomanip>
#include <iostream>
#include <sstream>
#include "StringList.h"

using namespace std;

//******************************************************************************
// StringList: creates an empty list
//******************************************************************************

StringList::StringList()
{
    head = NULL;
}

//******************************************************************************
// StringList: deallocates all the nodes in StringList
//******************************************************************************

StringList::~StringList()
{
    StringNode *p;
    StringNode *n;

    p = head;

    while (p != NULL)
    {
        n = p->next;
        delete p;
        p = n;
    }

}

//******************************************************************************
// count: returns the total number of nodes in the list.
//******************************************************************************

int StringList::count()
{
    int count = 0;
    StringNode *p;
    p = head;
    while ( p != NULL )
    {
       count++;
       p = p->next;
    }
    return count;
}

//******************************************************************************
// add: adds a new node to the beginning of the list.
//******************************************************************************

void StringList::add(string movie)
{
    StringNode *newNode = new StringNode;
    newNode->data = movie;
    newNode->next = head;
    head = newNode;
}

//******************************************************************************
// remove: removes a node containing the string from linked list
// returns true if successful or false the string is not in the list
//******************************************************************************

bool StringList::remove(string movie)
{
    StringNode *p = head;
    StringNode *n = NULL;

    while (p != NULL && p->data != movie )
    {
        n = p;
        p = p->next;

      if (p == NULL )
      {
         return false;
      }
      else if (p->data == movie)
      {
         n->next = p->next;
         delete p;
         return true;
      }
    }
}

//******************************************************************************
//display: Displays the strings in the list.
//******************************************************************************

void StringList::display()
{
    StringNode *p;
    p = head;

    while (p != NULL)
    {
        cout << p->data << " ";
        p = p->next;
    }
    cout << endl;
}

//******************************************************************************
//minimum: return the string in alphabetical order
//******************************************************************************

string StringList::minimum()
{
    StringNode *p = head;

    string minimum = p->data;

    while (p->next != NULL)
    {
        p = p->next;
        if(minimum > p->data)
        {
             minimum = p->data;
        }
    }
    return minimum;

}

//******************************************************************************
//sort: will call the minimum function and remove function
//******************************************************************************

 void StringList::sort()
{
StringNode* newhead;  // create a new head pointer
string mini;
bool removed; 

//adding the first node to the new list.
StringNode *newnode = new StringNode;
mini = minimum();  // get the minimum from the existing linked list
newnode->data = mini; 
newnode->next = NULL;
newhead=newnode; //add the minimum node to the new list(with the newhead)
StringNode *p = newhead;

while (head != NULL) // loop should run until there's no node left in the original list
{
    StringNode *newnode = new StringNode;
    mini = minimum();  // get the minimum from the existing linked list
    newnode->data = mini; 
    newnode->next = NULL;
    p->next=newnode; //add the minimum node to the new list(with the newhead pointer)
    removed = remove(mini);
    p=p->next;  
}
 head=newhead; //finally change the head pointer, so that the head now points to sorted list.
}

//StringList.h

#ifndef STRINGLIST_H_INCLUDED
#define STRINGLIST_H_INCLUDED

#include <string>
using namespace std;

class StringList
{
  private:
    struct StringNode          // the Nodes of the linked list
    {
        string data;           // data is a string
        StringNode *next;      // points to next node in list
    };

    StringNode *head;           // the head pointer

  public:
    StringList();
    ~StringList();

    int count();
    void add(string);
    bool remove(string);
    void display();
    string minimum();
    void sort();
};



#endif // STRINGLIST_H_INCLUDED

//驱动.cpp

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

#include "StringList.h"

int main()
{
    //testing StringList
    StringList slist;

    string movie1 = "Star Wars";
    string movie2 = "Fargo";
    string movie3 = "Back to the Future";
    string movie4 = "Titanic";

    // Testing add/display/count
    cout << "Testing add/display/count: " << endl;
    cout << "count is: " << slist.count() << endl;

    slist.add(movie1);
    slist.display();
    cout << "count is: " << slist.count() << endl;

    slist.add(movie2);
    slist.display();
    cout << "count is: " << slist.count() << endl;

    slist.add(movie3);
    slist.add(movie4);
    slist.display();
    cout << "count is: " << slist.count() << endl;

    // Testing remove
    cout << endl;
    cout << "Testing remove: " << endl;
    bool delResult;
    delResult = slist.remove(movie4);
    cout << "remove result movie4 = " << boolalpha << delResult << endl;

    delResult = slist.remove(movie3);
    cout << "remove result movie3 = " << boolalpha << delResult << endl;

    delResult = slist.remove("Not There");
    cout << "remove result Not There = " << boolalpha << delResult << endl;

   cout << "display after remove: " << endl;
   slist.display();
   cout << "count is: " << slist.count() << endl;

   //Testing minimum
    cout << endl;
    cout << "Testing minimum: " << endl;

    cout << "Test minimum 1: " << endl;
    slist.display();
    cout << "minimum: " << boolalpha << slist.minimum() << endl;

    cout << "Test minimum 2: " << endl;
    slist.add(movie4);
    slist.display();
    cout << "minimum: " << boolalpha << slist.minimum() << endl;

    cout << "Test minimum 3: " << endl;
    slist.add(movie3);
    slist.display();
    cout << "minimum: " << boolalpha << slist.minimum() << endl;

    //Testing sort and display

    cout << endl;
    cout << "Testing sort/display: " << endl;
    slist.sort();
    slist.display();

    cout << endl;
    cout << "Testing sort/display after add: " << endl;
    slist.add("Jurassic Park");
    slist.display();
    cout << "now sorted: " << endl;
    slist.sort();
    slist.display();


}

最佳答案

您的删除功能有小错误。您没有考虑删除第一个节点的可能性。

bool StringList::remove(string movie)
{
StringNode *p = head;
StringNode *n = NULL;
if(p->data==movie)  //added this condition
{
    head=head->next;
    delete p;
    return true;
}
while (p != NULL && p->data != movie )
{
    n = p;
    p = p->next;

  if (p == NULL )
  {
     return false;
  }
  else if (p->data == movie)
  {
     n->next = p->next;
     delete p;
     return true;
  }
}
}

最终排序函数。目标是使用 minimum 和 remove 函数对现有列表进行排序,并获得新的排序列表。您需要从现有列表中获取最少的内容,并在新列表的末尾继续添加它们。最后更改头指针以将其指向新列表。

while 循环应该运行直到现有列表变空。

void StringList::sort()
{  
   string mini;
   bool removed;

  //adding the first node to the new list.
  StringNode *newnode1 = new StringNode;
  mini = minimum();  // get the minimum from the existing linked list
  newnode1->data = mini;
  newnode1->next = NULL;
  removed =remove(mini);
  StringNode *p = newnode1;

while (head != NULL) // the loop should run until the original list is empty
{
  StringNode *newnode = new StringNode;
  mini = minimum();  // get the minimum from the existing linked list
  newnode->data = mini;
  newnode->next = NULL;
  p->next=newnode; //add the minimum node to the new list
  removed = remove(mini);
  p=p->next;
}
   head=newnode1; //finally change the head pointer, so that the head now points to sorted list.
}

关于c++ - 使用 C++ 中的链表按字母顺序对字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43246218/

相关文章:

c++ - 当你是 friend 时,为什么 GCC 不允许从私有(private)嵌套类继承?

java - Java如何生成以字母开头的随机字符串

javascript - 判断数组中的某个元素是否为字符串

c - 将所有非空元素向左移动

c++ - 在构建之前在 Eclipse 中运行脚本

c++将一个类定义为另一个类

c++ - 传递右值加注不能绑定(bind)到左值

java - 从字符串中提取特定匹配的子字符串

ruby - 检索数组内哈希的一些元素

c++ - std::sort() C++ 不工作但它很简单,为什么 :( 一维数组