#include "AlgPerf.h"
#include "Benchmark.h"
#include "LinkedList.h"
int main()
{
    //benchmark_hw3_2(5, 600, 5, 200);
    /*  测试：结点类ListNode
	1.1 ListNode（）函数
	1.2 ~ListNode()函数  */
    LinkNode<int> myNode3(6), myNode2(0, &myNode3), myNode1(7, &myNode2), *first = &myNode1;
    LinkNode<int> *p3 = new LinkNode<int>(6, NULL);
    LinkNode<int> *p2 = new LinkNode<int>(0, p3);
    LinkNode<int> *p1 = new LinkNode<int>(7, p2);
    delete p1; //调用p1所指结点的析构函数
    delete p2; //调用p2所指结点的析构函数
    delete p3; //调用p3所指结点的析构函数

    /*  测试：单链表类LinkedList
	2.1、inputFront（）函数或inputRear函数
	2.2、Remove（）函数
	2.3、output()函数
	*/
    LinkedList<int> myList;
    //int j,n=10;
    int x;
    myList.input(); //输入1 0 <enter> 10 9 8 7 6 5 4 3 2 1 0 <enter>
    myList.output();
    myList.Remove(4, x);
    myList.output();

    /*  作业测试一（功能测试+高效性测试）：单链表类LinkedList<T>:: Uniquify（）操作
	Uniquify()操作有比较元素值和元素移动两种基本操作，
	测试方法是分别对随机生成的大小为 5 - 600 （间隔为 5）的200个有序数组进行Uniquify（）操作测试,结果输出在Uniquify.txt文件里*/
    //void timeAlg(FILE *fp, int incN, int maxN, int numTrials, char *partitionAlg); //函数声明
    int incN = 5; //设置数组初始长度
    int maxN = 600;
    int numTrials = 200;       //测试次数
    char Alg[20] = "Uniquify"; //算法的名称
    char outFileName[20];      //测试结果存放的文件名

    FILE *fp;
    errno_t err;
    //创建一个名为Alg的txt文件
    strcpy_s(outFileName, Alg);
    strcat_s(outFileName, ".txt");
    err = fopen_s(&fp, outFileName, "w+");
    printf("# Results for %d  次测试", numTrials);
    printf("# n   time (msec)");
    printf("# ---------------\n");
    //统计Alg算法对大小为incN，2*incN,3*incN,...,maxN的数组进行一次操作的时间
    timeAlg(fp, incN, maxN, numTrials);
    fclose(fp);
    printf("done!  results in %s\n\n\n\n", Alg);

    cout << "作业测试第二部分（功能测试）：" << endl;
    int i, test[10] = {6, 5, 3, 8, 2, 7, 1, 9, 4, 4};

    LinkedList<int> OrderList1, OrderList2, OrderList3, List1;

    for (i = 0; i < 10; i++)
    {
        List1.Insert(i, test[i]);
    }
    //List1.Sort();
    List1.output(); //output: 6 5 3 8 2 7 1 9 4 4

    for (i = 0; i < 4; i++)
    {
        OrderList1.OrderInsert(test[i]);
    }
    OrderList1.output(); //输出: 3,5,6,8

    for (i = 4; i < 10; i++)
    {
        OrderList2.OrderInsert(test[i]);
    }
    OrderList2.output(); //输出：1,2,4,4,7,9

    OrderList3.Merge(OrderList1, OrderList2);
    OrderList3.output(); //应该输出:1,2,3,4,4,5,6,7,8,9

    system("pause");
    return 0;
}