int main()
{
   int a[] = {1,9,3,5,19,38,29,2,4,25,61,-1,7};
   LinkList<int>* list = new LinkList<int>(a, 13);
   list->PrintLinkList();
   int listlength = list->ListLength();
   std::cout<<"the list length is"<<listlength<<std::endl;
   int theLastElement = list->Get(13);
   assert(theLastElement == 7);
   std::cout<<"the last  element value   is"<< theLastElement << std::endl;
   std::cout<<"the values  that  the  array  contained currently display"<<std::endl;
   list->PrintLinkList();
   std::cout<<std::endl;
   std::cout<<"delete the  eigth element 2";
   std::cout<<std::endl;
   list->Delete(8);
   std::cout<<"the values  that  the  array  contained currently display"<<std::endl;
   std::cout<<"the  position of 61 is";
   std::cout<<std::endl;
   int position = list->Locate(61);
   std::cout<<std::endl;
   std::cout<<position<<std::endl;
   std::cout<<"the values  that  the  array  contained currently display"<<std::endl;
   list->PrintLinkList();
   std::cout<<std::endl;
    std::cout<<"now we add a value  at first  position"<<std::endl;
   list->Insert(1, 11111);
   std::cout<<"the values  that  the  array  contained currently display"<<std::endl;
   list->PrintLinkList();
   std::cout<<std::endl;
   list->Invert();
   std::cout<<"the  invert  array list is"<<std::endl;
   list->PrintLinkList();
}
void Display(LinkList<T> &list)
{
    cout << list.Count() << " element(s): ";
    for (int i = 1; i <= list.Count(); i++)
    {
        cout << list.Get(i) << " ";
    }
    cout << endl;
}
int main()
{
    LinkList<int> ll;
    cout << "Created a link list..." << endl;
    cout << "length = " << ll.Count() << endl;

    for (int i = 1; i <= 10; i++)
    {
        int val = i * 2;
        ll.Insert(val, ll.Count() + 1);
        cout << val << " inserted. length = " << ll.Count() << endl;
    }
    Display(ll);

    cout << "Reversing ..." << endl;
    ll.Reverse();
    Display(ll);

    cout << "Reversing again ..." << endl;
    ll.Reverse();
    Display(ll);

    int idx = 1;
    int val = ll.Get(idx);
    cout << "Get(" << idx << ") = " << val << "." << endl;
    idx = ll.Locate(val);
    cout << "Locate(" << val << ") = " << idx << "." << endl;
    if (idx == ll.Locate(val))
    {
        cout << val << " is at " << idx << "." << endl;
    }

    idx = 7;
    val = ll.Get(idx);
    if (idx == ll.Locate(val))
    {
        cout << val << " is at " << idx << "." << endl;
    }

    idx = ll.Count();
    val = ll.Get(idx);
    if (idx == ll.Locate(val))
    {
        cout << val << " is at " << idx << "." << endl;
    }

    val = 9999999;
    if (-1 == ll.Locate(val))
    {
        cout << "Unable to locate " << val << "." << endl;
    }

    cout << "Inserting 3 at 3 ..." << endl;
    ll.Insert(3, 3);
    Display(ll);
    cout << "Deleting 3 ..." << endl;
    ll.Delete(3);
    Display(ll);

    cout << "Inserting 0 at 1 ..." << endl;
    ll.Insert(0, 1);
    Display(ll);
    cout << "Deleting 0 ..." << endl;
    ll.Delete(1);
    Display(ll);

    cout << "Inserting 11 at 12 ..." << endl;
    ll.Insert(11, 11);
    Display(ll);
    cout << "Deleting 11 ..." << endl;
    ll.Delete(11);
    Display(ll);
    try
    {
        cout << "call LinkList<int> lla = ll ..." << endl;
        LinkList<int> lla = ll;
        cout << "lla.length = " << lla.Count() << endl;

        cout << "call LinkList<int> llb(ll) ..." << endl;
        LinkList<int> llb(ll);
        cout << "llb.length = " << llb.Count() << endl;
        llb.Insert(77, 7);
        cout << "llb.length = " << llb.Count() << endl;

        cout << "call llb = lla ..." << endl;
        llb = lla;
        cout << "llb.length = " << llb.Count() << endl;
        cout << "lla.length = " << lla.Count() << endl;

        cout << "Splitting llb ..." << endl;
        llb.Insert(88, 8);
        cout << "llb.length = " << llb.Count() << endl;
        LinkList<int> llb2 = llb.Split();
        Display(llb);
        Display(llb2);

        cout << "Splitting ll ..." << endl;
        LinkList<int> llc = ll.Split();
        Display(ll);
        Display(llc);

        cout << "Sorting llc ..." << endl;
        llc.Insert(33, 6);
        llc.Insert(11, 1);
        llc.Insert(20, 2);
        llc.Insert(17, 3);
        llc.Insert(1, 6);
        Display(llc);
        llc.InsertSort();
        Display(llc);

        cout << "Intersecting on llb and llc ..." << endl;
        Display(llb);
        Display(llc);
        LinkList<int> lld = llb.Intersect(llc);
        Display(lld);

        cout << "Merging llc into ll ..." << endl;
        ll.Merge(llc);
        Display(ll);
        Display(llc);
    }
    catch (const char *&ex)
    {
        cout << "Error: " << ex << endl;
    }

    cout << "End." << endl;
    return 0;
}
//define 3 指针 a p q;
void paint(vector<Evertex> v)//边类,存储一条边的两个端点
{
    int i,j; //两个循环控制变量,在下面的向量循环和数组循环中将被多次调用。
    Node<AELvertex>* a[screenheight]; //扫描线数组指针 AELvertex 有线段顶点的y值,和另一端点的x值,还有斜率的倒数
    Node<AELvertex>* p; //p和q为扫描线类指针,是用来对指针链表进行插入和循环时用的
    Node<AELvertex>* q;
    
    int m;
    
    bool tag = true;//填充颜色变化的控制变量
    bool red_tag = true;
    bool green_tag = true;
    bool blue_tag = true;

    
    for(i = 0; i < screenheight; i++) //将扫描线数组指针制空 水平scan
        a[i] = NULL;
    int k = 0; //下面要进行的是将多边形的边信息转化为扫描线信息
    
    for(j = 0; j < v.size(); j++)//边的个数
    {
        p = new Node<AELvertex>; //new一个扫描线类空间,next为null
        p->next = NULL;
        if(v[j].y1 < v[j].y2) //两个if判断将线段两个端点中y坐标较大,将y值存入扫描线中,x坐标较小的,将x值存入扫描线中。
        {
            k = v[j].y1;//
            p->data.x = v[j].x1;
            p->data.y = v[j].y2;
            p->data.dx = (v[j].x1 * 1.0 - v[j].x2 * 1.0) / (v[j].y1 * 1.0 - v[j].y2 * 1.0);
        }
        if(v[j].y1 > v[j].y2)
        {
            k = v[j].y2;
            p->data.x = v[j].x2;
            p->data.y = v[j].y1;
            p->data.dx = (v[j].x1 * 1.0 - v[j].x2 * 1.0) / (v[j].y1 * 1.0 - v[j].y2 * 1.0);
        } //两个y值相等说明线段平行于x轴,直接忽略
        //将申请的空间连接到扫描线链表中
        if(a[k] == NULL) //若为空,则直接将数组元素指针指向新空间
            a[k] = p;
        
        else //不为空,则通过尾插法将新空间插入链表尾部,
        {
            q = a[k];
            while(q->next)
                q = q->next;
            q->next = p;
        }
    }
    //填充部分
    
    LinkList<AELvertex> AEL; //动态扫描线链表,动态扫描线类
    
    for(i = 0; i < screenheight; i++) //动态扫描链表的结点添加
    {
        
        if(a[i] != NULL) //当元素不为空,即在此处有扫描线结点时
        {
            
            p = AEL.first; //尾插法将a[i]中的结点信息插入AEL中
            while(p->next != NULL)
                p = p->next;
            p->next = a[i];
            a[i] =  NULL; //a[i]制空,防止野指针出现
            vector<AELvertex> sort; //一个动态扫描线类向量,用来对AEL链表进行排序用的
            p = AEL.first->next;
            while(p) //将AEL链表中的所有扫描线点的信息给sort
            {
                sort.push_back(p->data);
                p = p->next;
            }
            for(j = 0; j < sort.size(); j++) //对sort中的值排序,扫描线生成时需要所有点从小到大排好
            {
                for(k = 0; k < sort.size() - 1; k++)
                {
                    if(sort[k].x > sort[k+1].x)
                        Sort(sort[k], sort[k+1]); //值交换,开头声明的Sort函数就是在这里用的
                }
            }
            p = AEL.first->next;
            j = 0;
            while(p && j < sort.size()) //将排好序的结点在放回AEL链表中
            {
                Sort(p->data, sort[j]);
                j++;
                p = p->next;
            }
            sort.clear();
        }
        
        
        //扫描线生成,核心中的核心
        p = AEL.first->next;
        if(p) //判断AEL中是否有结点
        {
            for(j = 1; j <= AEL.Length(); j++)
            {
                k = AEL.Get(j).y; //取出每个结点的y的值,判断与当前扫描线的y坐标值即i比较,判断是否已经到线段顶部
                if(k <= i) //这里我用了一个小技巧,没有按课上讲的通过端点是否为极值点来判断端点应该去还是留
                    //我用的方法是判断端点是线段起点还是终点,是起点的改点保存,是终点就delete,
                {
                    AEL.Delete(j);
                    j--;
                }
            }
            p = AEL.first;
            while(p->next) //将AEL链表中的点信息结点两两取出连线
            {
                
                p = p->next;
                q = p->next;
                k = (p->data.x + 0.5); //简单的四舍五入取整
                j = (q->data.x + 0.5);
                
                switch(Bcolor)
                {
                    case red://红
                        glColor3f(1.0,0.0,0.0);
                        glBegin(GL_LINES);
                        glVertex2i(k, i);
                        glVertex2i(j, i);
                        glEnd();
                        break;
                    case green://绿
                        glColor3f(0.0,1.0,0.0);
                        glBegin(GL_LINES);
                        glVertex2i(k, i);
                        glVertex2i(j, i);
                        glEnd();
                        break;
                    case blue://蓝
                        glColor3f(0.0,0.0,1.0);
                        glBegin(GL_LINES);
                        glVertex2i(k, i);
                        glVertex2i(j, i);
                        glEnd();
                        break;
                    case colorful://彩色填充
                        
//                        if(i%12 ==0 || i%12 ==1 || i%12 ==3)
//                        {
//                            red_tag = !red_tag;
//                        }
//                        if (red_tag) {
//                            glColor3f(1.0, 0.0, 0.0);
//                        }
//                        glBegin(GL_LINES);
//                        glVertex2i(k, i);
//                        glVertex2i(j, i);
//                        glEnd();
//                        
//                        if(i%12 ==4 || i%12 ==5 || i%12 ==6)
//                        {
//                            green_tag = !green_tag;
//                        }
//                        if (green_tag) {
//                            glColor3f(0.0, 1.0, 0.0);
//                        }
//                        glBegin(GL_LINES);
//                        glVertex2i(k, i);
//                        glVertex2i(j, i);
//                        glEnd();
                        if(i%12 == 1 )
                        {
                            glColor3f(0.2, 0.2, 0.2);
                            //blue_tag = !blue_tag;
                        }
                        
                        else if(i%12 == 0 )
                        {
                            glColor3f(0.0, 1.0, 0.0);
                            //blue_tag = !blue_tag;
                        }
                        else if(i%12 == 2 )
                        {
                            glColor3f(0.0, 0.0, 1.0);
                            //blue_tag = !blue_tag;
                        }
                        else if(i%12 == 3 )
                        {
                            glColor3f(1.0, 1.0, 0.0);
                            //blue_tag = !blue_tag;
                        }
                        else if(i%12 == 4 )
                        {
                            glColor3f(1.0, 0.0, 1.0);
                            //blue_tag = !blue_tag;
                        }
                        else if(i%12 == 5 )
                        {
                            glColor3f(0.5, 1.0, 0.0);
                            //blue_tag = !blue_tag;
                        }
                        else if(i%12 == 6 )
                        {
                            glColor3f(0.0, 1.0, 0.5);
                            //blue_tag = !blue_tag;
                        }

                        else {
                            glColor3f(1, 1, 1);//white
                        }
                        glBegin(GL_LINES);
                        glVertex2i(k, i);
                        glVertex2i(j, i);
                        glEnd();
                        break;
                    case black_white_line:	//水平间隔填充
                        if(i%8 == 0)//int i,j; 两个循环控制变量.
                        {
                            tag = !tag;// bool tag = true,填充颜色变化的控制变量 表示变化快每隔12翻转一次
                        }
                        if(tag)
                            glColor3f(0.0,0.0,0.0);   //设定颜色,既是线段颜色也是填充色
                        else
                            glColor3f(1.0,1.0,1.0);
                        glBegin(GL_LINES);
                        glVertex2i(k, i);
                        glVertex2i(j, i);
                        glEnd();
                        break;
                    case col_line://竖直间隔填充
                        glBegin(GL_POINTS);
                        for(m = MIN(k,j); m <= MAX(k,j) ; m++)
                        {
                            
                            if(m%12 == 0 || m%12 == 1 || m%12 == 2 || m%12 == 3 ||m%12 ==4)
                                glColor3f(0,0,0.0);   //设定颜色,既是线段颜色也是填充色
                            else
                                glColor3f(1.0,1.0,1.0);
                            glVertex2i(m,i);
                        }
                        glEnd();
                        break;
                    case xie_line://斜线间隔填充
                        glBegin(GL_POINTS);
                        for(m = MIN(k,j); m <= MAX(k,j) ; m++)
                        {
                            if((m+i)%10 >= 0 &&(m+i)%10 <= 4)
                                glColor3f(0,0,0.0);   //设定颜色,既是线段颜色也是填充色
                            else
                                glColor3f(1.0,1.0,1.0);
                            glVertex2i(m,i);
                        }
                        glEnd();
                        break;
                    case black_white_sqare://heibai方格填充
                        glBegin(GL_POINTS);//对电进行扫描
                        for(m = MIN(k,j); m <= MAX(k,j) ; m++)
                        {
                            
                            if(m%30 >= 0 && m%30 <= 14)
                                if(i%30 >= 0 && i%30 <= 14)
                                    glColor3f(0.0,0.0,0.0);
                                else
                                    glColor3f(1.0,1.0,1.0);
                                else
                                    if(i%30 >= 0 && i%30 <= 14)
                                        glColor3f(1.0,1.0,1.0);
                                else
                                    glColor3f(0.0,0.0,0.0);
                            
                            
                            glVertex2i(m,i);
                        }
                        glEnd();
                        break;
//                    case black_white_triangle://三角形:
//                        glBegin(GL_POINTS);
//                        for(m = MIN(k,j); m <= MAX(k,j) ; m++)//k 多边形的边信息转化为扫描线信息
//                        {
//                            
//                            if(m%30 >= 0 && m%30 <= 14)
//                                if(i%30 >= 0 && i%30 <= 14)
//                                    glColor3f(1.0,0.0,0.0);//red
//                                else
//                                    glColor3f(0.0,1.0,0.0);//green
//                                else
//                                    if(i%30 >= 0 && i%30 <= 14)
//                                        glColor3f(0.0,0.0,1.0);//blue
//                                    else
//                                        glColor3f(0.0,0.0,0.0);//black
//                            
//                            
//                            glVertex2i(m,i);
//
//                        }
//                        glEnd();
//                        break;
                    case black_white_circle://方格填充
                        glBegin(GL_POINTS);
                        for(m = MIN(k,j); m <= MAX(k,j) ; m++)
                        {
                                                        if(m%40 >= 0 && m%40 <= 2)
                                                            if(i%6 >= 0 && i%6 <= 2)
                                                                glColor3f(0.0,0.0,0.0);
                                                            else
                                                                glColor3f(1.0,1.0,1.0);
                            
                                                        else
                                                                if(i%6 >= 0 && i%6 <= 2)
                                                                    glColor3f(1.0,1.0,1.0);
                                                                else
                                                                    glColor3f(0.0,0.0,0.0);
                                                        
                                                        
                                                        glVertex2i(m,i);
                        }
                        glEnd();
                        break;
                }
                
                
                p->data.x = p->data.x + p->data.dx; //对点进行数据更新
                q->data.x = q->data.x + q->data.dx;
                p = q;
                
            }
            glColor3f(0.0,0.0,0.0);//black
        }
        
    }
}