【问题标题】:performing mergeSort on LinkedLists对链表执行合并排序
【发布时间】:2013-11-05 05:30:31
【问题描述】:

我被指派为一个项目编写代码,该项目在某种程度上模拟了机场的时间表。这必须使用linkedLists 来实现。项目应由 Node 类和 SLL(单链表)类组成。项目的逻辑是这样的: main 函数中应该有一个时钟,每 15 分钟滴答一次;我创建了 flight.h 文件并包含了与其中的航班相关的所有信息。这里让我感到困惑的是与mergeSort和quickSort相关的部分代码。 该项目要求对所有航班进行排序:1. 根据他们的出发时间 2. 根据他们的出发城市。

#include <stdlib.h>
#include <string>
#include <ctime>

using namespace std;

#ifndef FLIGHT_H_
#define FLIGHT_H_

class Node
{
public:
    Node()
    {
        flightNum = 0;
        gate = 0;
        status = On_time;
        next = NULL;
    }
    enum Flight_status {On_time, Delayed, Departed};
    struct Time {int hour, minutes;}; time;
    string airLine;
    int flightNum;
    string city;
    int gate;
    Flight_status status;
    Node *next;
    friend class SLL;
};

class SLL
{
private:
    Node *head;
    Node *tail;
    int size;
public:
    SLL() {head = tail = NULL; size = 0;}
    ~SLL() {};
    // Member function to add a new Node into a list
    void addNode();
    // Member functions to perform mergeSort over the list
    void split(SLL *, int, int);
    void merge(SLL *, int, int, int);
    // Member functions to perform quickSort over the list
    void partition(SLL *, int, int);
    void swap(Node &, Node &);
    void quickSort(SLL *, int, int);
    //
    void display(SLL *);
};

#endif /* FLIGHT_H_ */

我正在考虑在此声明的基础上构建程序的其余部分。我要确定的是,根据类的实现,我解决排序问题的方法是好的。如果您在实施此项目时发现任何问题,请帮助我。 提前致谢。

【问题讨论】:

  • 我真的没有看到任何问题。你有什么问题?排序的执行?只是对课程的回顾?还有什么?
  • @JoachimPileborg- 是的,真正让我困惑的问题是函数结果的实现和链接,我确实在 Flight.h 文件上工作,但编写了确切的函数、它们的返回以及应该如何他们被连接在一起真是令人困惑。你能帮我解决这个问题吗?
  • 它是一个链表。令人困惑的部分是什么?我的意思是 除了 把看起来像非类函数原型的东西挂在 SLL 类中。如果你要走那条路,我建议它们是静态的和私有的(老实说,我建议使用 std::vector&lt;&gt;std::sort,但我相当有信心给这个练习评分的 TA 不会同意这种观点)。
  • 我猜@JoachimPileborg 的意思是“这里有一堆东西。我想做 X。请帮帮我”,这并不是一个真正的问题。这是一个请求。重点不应该是“我正在尝试做 X,我已经走到了这一步,但是我已经达到了这个特定的绊脚点。我应该怎么做才能越过绊脚点 Y?我已经尝试过 A、B 和C,但得到了这些错误......”更加专注。

标签: c++ linked-list quicksort mergesort


【解决方案1】:

这里是代码..根据你的问题修改它。

#include<stdio.h>
#include<stdlib.h>

/* Link list node */
struct node
{
    int data;
    struct node* next;
};

/* function prototypes */
struct node* SortedMerge(struct node* a, struct node* b);
void FrontBackSplit(struct node* source,
          struct node** frontRef, struct node** backRef);

/* sorts the linked list by changing next pointers (not data) */
void MergeSort(struct node** headRef)
{
  struct node* head = *headRef;
  struct node* a;
  struct node* b;

  /* Base case -- length 0 or 1 */
  if ((head == NULL) || (head->next == NULL))
  {
    return;
  }

  /* Split head into 'a' and 'b' sublists */
  FrontBackSplit(head, &a, &b); 

  /* Recursively sort the sublists */
  MergeSort(&a);
  MergeSort(&b);

  /* answer = merge the two sorted lists together */
  *headRef = SortedMerge(a, b);
}

struct node* SortedMerge(struct node* a, struct node* b)
{
  struct node* result = NULL;

  /* Base cases */
  if (a == NULL)
     return(b);
  else if (b==NULL)
     return(a);

  /* Pick either a or b, and recur */
  if (a->data <= b->data)
  {
     result = a;
     result->next = SortedMerge(a->next, b);
  }
  else
  {
     result = b;
     result->next = SortedMerge(a, b->next);
  }
  return(result);
}

/* UTILITY FUNCTIONS */
/* Split the nodes of the given list into front and back halves,
     and return the two lists using the reference parameters.
     If the length is odd, the extra node should go in the front list.
     Uses the fast/slow pointer strategy.  */
void FrontBackSplit(struct node* source,
          struct node** frontRef, struct node** backRef)
{
  struct node* fast;
  struct node* slow;
  if (source==NULL || source->next==NULL)
  {
    /* length < 2 cases */
    *frontRef = source;
    *backRef = NULL;
  }
  else
  {
    slow = source;
    fast = source->next;

    /* Advance 'fast' two nodes, and advance 'slow' one node */
    while (fast != NULL)
    {
      fast = fast->next;
      if (fast != NULL)
      {
        slow = slow->next;
        fast = fast->next;
      }
    }

    /* 'slow' is before the midpoint in the list, so split it in two
      at that point. */
    *frontRef = source;
    *backRef = slow->next;
    slow->next = NULL;
  }
}

/* Function to print nodes in a given linked list */
void printList(struct node *node)
{
  while(node!=NULL)
  {
   printf("%d ", node->data);
   node = node->next;
  }
}

/* Function to insert a node at the beginging of the linked list */
void push(struct node** head_ref, int new_data)
{
  /* allocate node */
  struct node* new_node =
            (struct node*) malloc(sizeof(struct node));

  /* put in the data  */
  new_node->data  = new_data;

  /* link the old list off the new node */
  new_node->next = (*head_ref);    

  /* move the head to point to the new node */
  (*head_ref)    = new_node;
} 

/* Drier program to test above functions*/
int main()
{
  /* Start with the empty list */
  struct node* res = NULL;
  struct node* a = NULL;

  /* Let us create a unsorted linked lists to test the functions
   Created lists shall be a: 2->3->20->5->10->15 */
  push(&a, 15);
  push(&a, 10);
  push(&a, 5); 
  push(&a, 20);
  push(&a, 3);
  push(&a, 2); 

  /* Sort the above created Linked List */
  MergeSort(&a);

  printf("\n Sorted Linked List is: \n");
  printList(a);           

  getchar();
  return 0;
}

来源:http://en.wikipedia.org/wiki/Merge_sort
http://cslibrary.stanford.edu/105/LinkedListProblems.pdf
http://www.geeksforgeeks.org/merge-sort-for-linked-list/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-22
    • 2021-07-14
    • 2020-05-24
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多