import java.awt.*;
import java.awt.event.*;
import java.applet.Applet;

public class LinkApplet extends Applet implements ActionListener
{
        private Label title1,title2;
        private TextField field1,field2;
        private Button insert,delete;
        private LinkList1 newList;
        private int num1,b=0;
        private double num2;
        private boolean add;

        public void init()
        {
                title1=new Label("Enter the first number");
                add(title1);

                field1=new TextField(6);
                add(field1);

                title2=new Label("Enter the second number");
                add(title2);

                field2=new TextField(6);
                add(field2);

                insert=new Button("Insert");
                add(insert);
                insert.addActionListener(this);

                delete=new Button("Delete");
                add(delete);
                delete.addActionListener(this);

                newList=new LinkList1();
         }
         public void actionPerformed(ActionEvent e)
         {
                
                if(e.getSource()==insert)
                {
                        num1=Integer.parseInt(field1.getText());
                        num2=Double.valueOf(field2.getText()).doubleValue();
                        newList.insertFirst(num1,num2);
                        add=true;

                        field1.setText("");
                        field2.setText("");
                        field1.requestFocus();
                }
                else if(e.getSource()==delete)
                {
                     add=false;
                     if(!newList.isEmpty())
                     {
                        newList.deleteFirst();
                     }
                     else
                        newList.deleted=false;
                }
                repaint();
         }
         public void paint(Graphics g)
         {
                newList.displayList(g,add);
         }
}
class LinkList1
{
        private Link1 first;
        private Link1 temp;
        private int height=20, width=40;
        public boolean deleted,empty;

        public LinkList1()
        {
                first=null;
        }
        public boolean isEmpty()
        {
                return (first==null);
        }
        public void insertFirst(int id, double dd)
        {
                Link1 newLink=new Link1(id,dd);
                newLink.next=first;
                first=newLink;
                deleted=false;
                empty=false;

        }
        public void deleteFirst()
        {
                deleted=true;
                temp=first;
                first=first.next;
        }
        public void displayList(Graphics g,boolean add)
        {
                if(first==null)
                {
                        g.drawString(""+first,5,100+height*3/4);
                        g.drawString("Empty List", 250,100);
                }
                else
                        g.drawLine(10,120,10,140);

                if(deleted==true)
                        temp.displayDeleted(g);
                else
                        g.drawString("",100,100);

                g.drawString("The List",5,60);
                g.drawRect(0,60,width,height);
                g.drawString("First",11,100);
                g.drawRect(0,100,width,height);
                g.drawLine(10,80,10,100);

                Link1 current=first;
                while(current!=null)
                {
                        current.displayLink(g,add);
                        current=current.next;
                }
        }
}


class Link1
{
        public int iData;
        public double dData;
        public Link1 next;
        private int height=20,width=40;
        private int startY=140;
        private int startX=-60;
        

        private int y;

        public Link1(int id, double dd)
        {
                iData=id;
                dData=dd;
        }
        public void displayLink(Graphics g,boolean add)
        {
             y=startY;
             if(add==true)
             {
                startX=startX+width+20;
             }
             else
                startX=startX-width-20;


          if((startX>=0)&&(startX<=360))
          {
             for(int i=0;i<3;i++)
             {
                        g.setColor(Color.magenta);
                        g.fillRect(startX,y,width,height);
                        g.setColor(Color.black);
                        g.drawRect(startX,y,width,height);

                       if(i==0)
                                g.drawString(""+iData,startX,y+height*3/4);
                       else if(i==1)
                                g.drawString(""+dData,startX,y+height*3/4);

                       else if(i==2)
                        {
                                if(next==null)
                                        g.drawString(""+next,startX,y+height*3/4);
                                else
                                {
                                        int j=startX+width;
                                        if(j<400)
                                        {
                                                g.drawLine(startX+width,y+height/2,startX+width+10,y+height/2);
                                                g.drawLine(startX+width+10,y+height/2,startX+width+10,y-height*3/2);
                                                g.drawLine(startX+width+10,y-height*3/2,startX+width+20,y-height*3/2);
                                        }
                                        else if(j>=400)
                                        {
                                                g.drawLine(startX+width,y+20,startX+width+10,y+20);
                                                g.drawLine(startX+width+10,y+20,startX+width+10,y+30);
                                                g.drawLine(startX+width+10,y+30,10,y+30);
                                                g.drawLine(10,y+30,10,y+40);
                                                g.drawLine(6,y+35,10,y+40);
                                                g.drawLine(14,y+35,10,y+40);
                                        }
                                }
                        }
                        y=y+height;
             }
          }
          else if(startX>360)
          {
                startX=-60;
                startY=startY+3*height+20;
                displayLink(g,add);
          }
          else if(startX<0)
          {
                startX=420;
                startY=startY-3*height-20;
                displayLink(g,add);
          }
                
        }
        public void displayDeleted(Graphics g)
        {
                g.drawString("Deleted :{"+iData+", "+dData+"}",100,100);
        }
}

