我正在开展一个需要这样做的项目:
在C ++中创建一个双向链接的整数列表。
此课程应具备以下内容: - 正常插入函数(push_back,push_front) - 正常删除函数(pop_back,pop_front) -3排序功能 - 插入排序 -Merge Sort -Bubble Sort
排序方法应该打印出处理时间(微小或毫秒)和使用的排序(例如冒泡排序完成后,冒泡排序 - 100毫秒)。
创建一个程序,从文件中读取一堆数字并创建链接列表(为每次运行创建三个列表)。然后应该使用每种方法对程序进行排序。 显示三次运行的结果,一次包含100000个数字列表,一个包含10000个数字,一个包含1000个数字。
我一直试图导入我的第一个文件(file1.txt),该文件有100000个整数并将它们保存到我的双向链表中。关于如何做到这一点的任何建议都会如此之大。接下来,我正在尝试使用插入排序算法,到目前为止我所拥有的是数组的插入排序而不是双向链表。如果你能扫描我的代码并给我任何建议,那将是很棒的。我从来没有用C ++编写,只用java编写,这个任务对我来说很有挑战性!
#include<iostream>
//for time elapsed
#include <chrono>
using namespace std;
template <class T>
class doublylinkedlist
{
private :
struct node
{
T data;
node *prev;
node *next;
};
node *head;
node *tail;
public :
doublylinkedlist()
{
head=tail=NULL;
}
void createlist(T[] , int);
void pushfirst(T);
void pushlast(T);
void pushafter(T,T);
void pop(T);
void displayforward();
void displaybackward();
};
//creating doubly linked list
template<class T>
void doublylinkedlist<T>::createlist(T x[], int n) //n = size
{
node *q;
node *p=new node; //create first node
p->data=x[0];
p->next=NULL;
p->prev=NULL;
for(int i=1;i<n;i++)
{
q=p;
p=p->next=new node;
p->data=x[i];
p->next=NULL;
p->prev=q;
}
tail=p;
}
// Inserting new node at start of doubly linked list
template<class T>
void doublylinkedlist<T>::pushfirst(T item)
{
node *p=new node;
p->data=item;
p->prev=NULL;
head->prev=p;
}
//Inserting new node at last of Double Linkedlist
template<class T>
void doublylinkedlist<T>::pushlast(T item)
{
node *p=new node;
p->data=item;
p->prev=tail;
p->next=NULL;
tail=p;
}
//deleting item from double linked list
template<class T>
void doublylinkedlist<T>::pop(T item)
{
if(head==NULL)
{
cout<<"This list is empty!"<<endl;
return;
}
if(head->data==item)
{
head=head->next;
head->prev=NULL;
return;
}
if(tail->data==item)
{
tail=tail->prev;
tail->next=NULL;
return;
}
node *p=head->next;
while(p!=NULL)
{
if(p->data==item)
break;
p=p->next;
}
if(p==NULL)
{
cout<<item<<"not found "<<endl;
return;
}
(p->prev)->next=p->next;
(p->next)->prev=p->prev;
return;
}
//displaying list elements in forward direction
template<class T>
void doublylinkedlist<T>::displayforward()
{
node *p=head;
cout<<"\n Doubly linked list (Forward)";
while(p!=NULL)
{
cout<<p->data<<"";
p=p->next;
}
}
//displaying list elements in reverse direction
template<class T>
void doublylinkedlist<T>::displaybackward()
{
node *p=tail;
cout<<"\n Doubly linked list (Backward)";
while(p!=NULL)
{
cout<<p->data<<"";
p=p->prev;
}
}
//insertion sort function
void doublylinkedlist<T>::insertionSort(T x[], int n)
{
auto beg = std::chrono::high_resolution_clock::now();
int i, j ,tmp;
for (i = 1; i < n; i++)
{
j = i;
while (j > 0 && x[j - 1] > x[j])
{
tmp = x[j];
x[j] = x[j - 1];
x[j - 1] = tmp;
j--;
}
printArray(x,5);
}
auto end = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - beg).count() << std::endl;
std::cin.get();
return 0;
}
int main()
{
ifstream myfile ("file1.txt");
if (myfile.is_open())
{
//i need to insert the file into the doubly linked list here.
//file.txt is has 100000 integers
doublylinkedlist<int> firstList;
myfile.close();
}
else cout << "Unable to open file";
return 0;
//replace this with input from file
//10000 numbers
doublylinkedlist<int> secondList;
//1000 numbers
doublylinkedlist<int> thirdList;
//example of what to run
firstList.createlist(x,2);
firstList.pushfirst(22);
firstList.pushlast(55);
firstList.pushafter(66,33);
firstList.pop(22);
firstList.pop(55);
firstList.pop(66);
return 0;
}
答案 0 :(得分:0)
成功打开文件后,您需要添加循环:
read a number from the file into temp variable
firstList.pushlast(temp)
关于排序,我相信你应该移动列表中的节点(而不是在节点之间复制值 - 在数组中完成的方式)以使列表排序。