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(); }
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 } } }