예제 #1
0
		public override void ExecuteAndUpdateCurrentLine()
		{
			switch (CurrentLine)
			{
				case 0:
					CurrentLine = 3;
					return;
				case 3:  //L=(LinkList)malloc(sizeof(Lnode));  L->next=NULL;
					//生成一个头节点
					LinkCircleNode headNode = null;
					LinkLineNode   headLineNode = null;
					headNode = new LinkCircleNode(40,50,diameter,status.头结点颜色,"H");
					headLineNode = new LinkLineNode(40 + diameter,50 + diameter/2,40 + diameter + lineLength,50 + diameter/2,lineWidth,Color.Red);
					headNode.Next = null;
					headLineNode.Next = null;
					circleNodeIterator = headNode.CreateIterator(); 
					lineNodeIterator = headLineNode.CreateIterator();
					break;
				case 4:  //for(i=n;i>0;i--){
					if(status.I == 0)
					{
						CurrentLine = 9;
						return;
					}
					break;
				case 5:  //p=(LinkList)malloc(sizeof(Lnode));  scanf(&p->data);
					if(iteratorInsertNode != null)
					{
						((NodeListIterator)circleNodeIterator).RefreshAllNodes((LinkCircleNode)iteratorInsertNode.First().CurrentItem,40,50,diameter,lineLength,status.结点颜色);
					}
					iteratorInsertNode = new LinkCircleNode(40 + diameter - 4,50 + diameter,diameter,status.插入结点颜色,status.L[status.I - 1].ToString()).CreateIterator();
					status.CanEdit = true;
					status.P = "p当前指向结点" + ((LinkCircleNode)iteratorInsertNode.First().CurrentItem).Text;
					break;
				case 6:  //p->next=L->next;
					((LinkCircleNode)iteratorInsertNode.First().CurrentItem).Next = ((LinkCircleNode)circleNodeIterator.First().CurrentItem).Next;
					//生成贝赛尔曲线
					nullIteratorBezierLine = new BezierLine(new Rectangle(1,1,1,1),GetPoints(),lineWidth,Color.Red).CreateIterator();
					break;
				case 7:  //L->next=p;
					((LinkCircleNode)circleNodeIterator.First().CurrentItem).Next = (LinkCircleNode)iteratorInsertNode.First().CurrentItem;
					//刷新所有的结点的位置
					((NodeListIterator)circleNodeIterator).RefreshAllNodes((LinkCircleNode)iteratorInsertNode.First().CurrentItem,40,50,diameter,lineLength,status.结点颜色);
					//设置当前结点的颜色
					((NodeListIterator)circleNodeIterator).SetCurrentItemNewColor(iteratorInsertNode.First().CurrentItem,status.插入结点颜色,status.结点颜色);
					//以下是生成一个箭头,并把它插入到箭头链表,最后刷新这个箭头链表
					LinkLineNode lineNode = new LinkLineNode(1,1,1 + lineLength,1,2,Color.Red);
					lineNode.Next = ((LinkLineNode)lineNodeIterator.First().CurrentItem).Next;
					((LinkLineNode)lineNodeIterator.First().CurrentItem).Next = lineNode;
					((NodeListIterator)lineNodeIterator).RefreshAllNodes((LinkLineNode)lineNodeIterator.First().CurrentItem,40 - lineLength,50 + diameter/2,diameter,lineLength,Color.Red);
					//删除贝赛尔曲线
					nullIteratorBezierLine = null;
					//i--
					status.CanEdit = true;
					status.I--;
					CurrentLine = 4;
					return;
				case 9:
					return;
			}
			CurrentLine++;
		}
예제 #2
0
		Image CreatePreviewImage(string s)
		{
			int height = 80;
			int width = 530;
			int lineLength = 18;
			int diameter = 30;
			int leftSpan = 3;
			int topSpan = 20;


			IIterator circleNodeIterator;//用于输出结点链表的指针
			IIterator lineNodeIterator;//用于输出连接线链表的指针

			LinkCircleNode headNode = null;
			LinkLineNode   headLineNode = null;
			LinkCircleNode previousNode = null;
			LinkLineNode   previousLineNode = null;
			LinkCircleNode currentNode = null;
			LinkLineNode   currentLineNode = null;
			previousNode = headNode = new LinkCircleNode(leftSpan,topSpan,diameter,Color.Red,"H");
			previousLineNode = headLineNode = new LinkLineNode(leftSpan + diameter,topSpan + diameter/2,leftSpan + diameter + lineLength,topSpan + diameter/2,lineWidth,Color.Red);

			for(int i = 0;i < s.Length;i++)
			{
				currentNode = new LinkCircleNode(leftSpan + (i + 1) * (lineLength + diameter),topSpan,diameter,Color.DarkTurquoise,s[i].ToString());
				currentLineNode = new LinkLineNode(leftSpan + diameter + (i + 1) * (lineLength + diameter),topSpan + diameter/2,leftSpan + diameter + (i + 1) * (lineLength + diameter) + lineLength,topSpan + diameter/2,lineWidth,Color.Red);
				
				previousNode.Next = currentNode;
				previousLineNode.Next = currentLineNode;

				previousNode = currentNode;
				previousLineNode = currentLineNode;

			}

			if(currentNode != null)
			{
				currentNode.Next = null;
				currentLineNode.Next = null;
			}
			circleNodeIterator = headNode.CreateIterator(); 
			lineNodeIterator = headLineNode.CreateIterator();

			Bitmap bmp = new Bitmap(width,height);
			Graphics g = Graphics.FromImage(bmp);

			if(circleNodeIterator != null)
			{
				for(IIterator iterator = circleNodeIterator.First();!circleNodeIterator.IsDone();iterator = circleNodeIterator.Next())
				{
					iterator.CurrentItem.Draw(g);
				}
			}
			if(lineNodeIterator != null)
			{
				for(IIterator iterator = lineNodeIterator.First();!lineNodeIterator.IsDone();iterator = lineNodeIterator.Next())
				{
					iterator.CurrentItem.Draw(g);
				}
			}

			return bmp;

		}
예제 #3
0
		public override void InitGraph() 
		{
			LinkCircleNode previousNode = null; //当前要创建的节点的前驱节点
			LinkCircleNode currentNode = null;  //当前要创建的节点
			LinkCircleNode headNode = null;     //头节点

			//这里一条连接线也代表一个节点
			LinkLineNode   headLineNode = null;
			LinkLineNode   currentLineNode = null;     
			LinkLineNode   previousLineNode = null;

			headNode = new LinkCircleNode(40,50,diameter,status.头结点颜色,"H");  //先创建一个头节点
			headLineNode = new LinkLineNode(40 + diameter,50 + diameter/2,40 + diameter + lineLength,50 + diameter/2,lineWidth,Color.Red);

			for(int i=0;i<status.Length;i++)
			{
				currentNode = new LinkCircleNode(40 + (i+1)*(diameter + lineLength),50,diameter,status.结点颜色,status.L[i].ToString());
				currentLineNode = new LinkLineNode(40 + diameter + (i+1)*(diameter + lineLength),50 + diameter/2,40 + diameter + (i+1)*(diameter + lineLength) + lineLength,50 + diameter/2,lineWidth,Color.Red);
				
				if(i == 0)  //说明当前创建的节点为第一个节点
				{
					headNode.Next = currentNode;
					headLineNode.Next = currentLineNode;
				}
				else
				{
					previousNode.Next = currentNode;
					previousLineNode.Next = currentLineNode;
				}
				previousNode = currentNode;
				previousLineNode = currentLineNode;
			}

			currentNode.Next = null;  //这里要注意,要把最后一个节点的Next设置为null
			currentLineNode.Next = null;

			circleNodeIterator = headNode.CreateIterator(); 
			circleNodeIterator1 = headNode.CreateIterator(); 
			lineNodeIterator = headLineNode.CreateIterator();

		}