我的数据结构分配有点麻烦,非常感谢一些帮助。我正在从输入文件创建链接列表,该文件包含偶数个名字。我应该做五个功能; readFile,splitMerge,merge和traverse。我已经完成了readFile,但我无法弄清楚如何拆分列表。
SplitMerge函数:创建一个拆分函数,将新创建的链表分成两个相等的子列表:myList1和myList2。例如,最初你会指向(约翰,杰克,吉尔,吉姆)。拆分后,myList1将指向john和jack,myList2将指向jill和Jim。
到目前为止我的代码
#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
struct Node {
string data;
Node *next;
};
typedef Node *NodePtr;
NodePtr &readFile(NodePtr &, string); //function inputs the list
void printList(NodePtr &); // function to print it out
void splitMerge(NodePtr &, NodePtr &, string);
void merge(); //ignore this
void traverse(); //ignore this
int main() {
ifstream fileIn("input.txt");
string data;
NodePtr head = NULL;
NodePtr list2 = new Node();
while (fileIn >> data)
{
readFile(head, data);
}
cout << "Singly linked list: " << endl;
printList(head);
cout << endl;
splitMerge(head, list2, data);
cout << "Split list: " << endl;
printList(list2);
fileIn.close();
return 0;
}
NodePtr &readFile(NodePtr &head,string data)
{
NodePtr Alpha = new Node(); //new node called "Alpha
Alpha->data = data; //assign alpha data to passed in "data"
Alpha->next = NULL;
NodePtr p = head; //head node
if (p == NULL) head = Alpha; //if p is null, head is assigned alpha.
else
{
while (p->next != NULL) p = p->next; //Fill nodes
p->next = Alpha;
}
return head;
}
void printList(NodePtr &head)
{
NodePtr p = head;
while (p != NULL) //step through nodes till reaches NULL (end).
{
cout << p->data;
p = p->next;
cout << endl;
}
}
void splitMerge(NodePtr &head, NodePtr &list2, string data)
{
//NodePtr p = head;
NodePtr slow = head;
NodePtr fast = head;
//list2->next = NULL;
if (head != NULL)
{
while (fast != NULL && fast->next != NULL)
{
fast = fast->next->next;
slow = slow->next;
}
list2->data = slow->data;
}
//while (list2->next != NULL) list2 = list2->next; //Fill nodes
//list2->next = list2;
}
文本文件中的名称:
Sean
Megan
John
Alex
Ginger
Sam
Sarah
Jack
编辑:好的,所以我认为我得到了分裂。它现在编译,运行并正确地将列表拆分为两个。我现在唯一的问题是我的第二个名单中只有一个名字,姜。如何在list2中包含节点4-8?这里有点丢失。
答案 0 :(得分:0)
评论中提到了修正。我没有使用stdafx.h,因为我使用了&#34; emtpy&#34;项目。我将mergesplit()更改为仅使用两个参数。
Blog
虽然超出了类分配,但对于大型列表,列表的自下而上合并排序会更快。 Wiki有一个伪代码示例:
https://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation_using_lists
然后再次,将列表复制到数组,删除列表,对数组进行排序(std :: sort或std :: stable_sort可行),然后将数组复制到新列表仍然更快,删除数组。如果节点足够大,创建指向节点的指针数组可能会更快,并对指针数组进行排序,然后从指针创建一个新列表。