In: Computer Science
public class CDLL_Node<T>
{
private T data;
private CDLL_Node<T> prev, next; // EACH CDLL_Node PTS TO ITS PREV & NEXT
public CDLL_Node()
{
this( null, null, null ); // 3 FIELDS TO INIT
}
public CDLL_Node(T data)
{
this( data, null, null);
}
public CDLL_Node(T data, CDLL_Node<T> prev, CDLL_Node<T> next)
{
setData( data );
setPrev( prev );
setNext( next );
}
public T getData()
{
return data;
}
public CDLL_Node<T> getPrev()
{
return prev;
}
public CDLL_Node<T> getNext()
{
return next;
}
public void setData(T data)
{
this.data = data;
}
public void setNext(CDLL_Node<T> next)
{
this.next = next;
}
public void setPrev(CDLL_Node<T> prev)
{
this.prev = prev;
}
public String toString()
{
return ""+getData();
}
} //EOF
import java.io.*;
import java.util.*;
public class CDLL_List<T>
{
private CDLL_Node<T> head; // pointer to the front (first) element of the list
private int count=0;
public CDLL_List()
{
head = null; // compiler does this anyway. just for emphasis
}
// LOAD LINKED LIST FROM INCOMING FILE
@SuppressWarnings("unchecked")
public CDLL_List( String fileName, boolean orderedFlag )
{ head = null;
try
{
BufferedReader infile = new BufferedReader( new FileReader( fileName ) );
while ( infile.ready() )
{
if (orderedFlag)
insertInOrder( (T)infile.readLine() ); // WILL INSERT EACH ELEM INTO IT'S SORTED POSITION
else
insertAtTail( (T)infile.readLine() ); // TACK EVERY NEWELEM ONTO END OF LIST. ORIGINAL ORDER PRESERVED
}
infile.close();
}
catch( Exception e )
{
System.out.println( "FATAL ERROR CAUGHT IN C'TOR: " + e );
System.exit(0);
}
}
//-------------------------------------------------------------
// ########################## Y O U W R I T E T H E S E M E T H O D S ########################
// inserts new elem at front of list - pushing old elements back one place
public void insertAtFront(T data)
{
// WRITE THE LINES OF CODE TO DO THE INSERT
}
public void insertAtTail(T data)
{
// CALL INSERT AT FRONT HERE
// THEN ADJUST THE HEAD POINTER
}
public boolean removeAtTail() // RETURNS TRUE IF THERE WAS NODE TO REMOVE
{
return false; // YOUR CODE HERE. TRY TO DO CODE RE-USE SIMILAR TO FRONT
}
public boolean removeAtFront() // RETURNS TRUE IF THERE WAS NODE TO REMOVE
{
return false; // YOUR CODE HERE. // TRY TO DO CODE RE-USE SIMILAR TO FRONT
}
public String toString()
{
String toString = ""; // NO <=> DELIMITERS REQUIRED ANYWHERE IN OUTPUT
return toString; // JUST A SPACE BETEEN ELEMENTS LIKE IN LAB3
}
public int size() // OF COURSE MORE EFFICIENT to KEEP COUNTER BUT YOU MUST WRITE LOOP
{
return 0; // YOUR CODE HERE
}
public boolean empty()
{
return false; // YOUR CODE HERE
}
public boolean contains( T key )
{
return false; // YOUR CODE HERE
}
public CDLL_Node<T> search( T key )
{
return null; // YOUR CODE HERE
}
@SuppressWarnings("unchecked") //CAST TO COMPARABLE THROWS WARNING
public void insertInOrder(T data)
{
// YOUR CODE HERE
}
public boolean remove(T key)
{
return false; // REPLACE WITH YOUR CODE
}
public CDLL_List<T> union( CDLL_List<T> other )
{
CDLL_List<T> union = new CDLL_List<T>();
// YOUR CODE HERE
return union;
}
public CDLL_List<T> inter( CDLL_List<T> other )
{
CDLL_List<T> inter = new CDLL_List<T>();
// YOUR CODE HERE
return inter;
}
public CDLL_List<T> diff( CDLL_List<T> other )
{
CDLL_List<T> diff = new CDLL_List<T>();
// YOUR CODE HERE
return diff;
}
public CDLL_List<T> xor( CDLL_List<T> other )
{
return null; // REPLACE WITH YOUR CODE
}
} //END CDLL_LIST CLASS
// A D D C D L L N O D E C L A S S D O W N H E R E
// R E M O V E A L L P U B L I C & P R I V A T E (except toString)
// R E M O V E S E T T E R S & G E T T E R S
// M A K E T O S T R I N G P U B L I C
import java.io.*;
import java.util.*;
public class CDLL_Tester
{
public static void main( String args[] ) throws Exception
{
CDLL_List<String> list1 = new CDLL_List<String>( args[0], false ); // false = INSERTATTAIL CALLED ON EACH T READ FROM FILE
System.out.format("list1 %s size %d unordered %s\n",args[0],list1.size(),list1 ); // invokes toString
list1.remove( "charlie" ); list1.remove("echo"); list1.remove("zebra"); // HEAD, TAIL, NOWHERE
System.out.format("list1 (after remove charlie, echo & zebra) %s\n",list1 ); // invokes toString
CDLL_List<String> list2 = new CDLL_List<String>( args[0], true ); // true = INSERTINORDER CALLED ON EACH T READ FROM FILE
System.out.format("list2 %s size %d ordered %s\n",args[0],list2.size(),list2 ); // invokes toString
CDLL_List<String> list3 = new CDLL_List<String>( args[1], true ); // true = INSERTINORDER CALLED ON EACH T READ FROM FILE
System.out.format("list3 %s size %d ordered %s\n",args[1],list3.size(),list3 ); // invokes toString
// MUST RETURN ALL SET OP LISTS IN SORTED ORDER NO DUPES
CDLL_List<String> unionList = list2.union(list3);
System.out.println("list2.union(list3) " + unionList);
CDLL_List<String> interList = list2.inter(list3);
System.out.println("list2.inter(list3) " + interList);
CDLL_List<String> diffList = list2.diff(list3);
System.out.println("list2.diff(list3) " + diffList);
CDLL_List<String> xorList = list2.xor(list3);
System.out.println("list2.xor(list3) " + xorList);
// ECHO LISTS 2 & 3 TO PROVE THEY WERE NOT MODIFIED
System.out.println();
System.out.println( "list2 after set ops: " + list2 );
System.out.println( "list3 after set ops: " + list3 );
// DESTROY LIST2 BY REPEATEDLY CALLING REMOVE AT TAIL UNTIL EMPTY
while ( ! list2.empty() ) list2.removeAtTail();
// DESTROY LIST3 BY REPEATEDLY CALLING REMOVE AT FRONT
while ( ! list3.empty() ) list3.removeAtFront();
// ECHO LISTS 2 & 3 TO PROVE THEY WERE DESTROYED
System.out.println();
System.out.println( "list2 after all nodes removedAtTail: " + list2 );
System.out.println( "list3 after all nodes removedAtFront: " + list3 );
} // END MAIN
} // EOF
set1.txt
charlie bravo delta alpha golf india hotel echo
set2.txt
foxtrot baker xray zebra charlie victor
//============CDLL_Node.java======================
public class CDLL_Node<T>
{
private T data;
private CDLL_Node<T> prev, next; // EACH CDLL_Node PTS TO ITS
PREV & NEXT
public CDLL_Node()
{
this( null, null, null ); // 3 FIELDS TO INIT
}
public CDLL_Node(T data)
{
this( data, null, null);
}
public CDLL_Node(T data, CDLL_Node<T> prev,
CDLL_Node<T> next)
{
setData( data );
setPrev( prev );
setNext( next );
}
public T getData()
{
return data;
}
public CDLL_Node<T> getPrev()
{
return prev;
}
public CDLL_Node<T> getNext()
{
return next;
}
public void setData(T data)
{
this.data = data;
}
public void setNext(CDLL_Node<T> next)
{
this.next = next;
}
public void setPrev(CDLL_Node<T> prev)
{
this.prev = prev;
}
public String toString()
{
return ""+getData();
}
} //EOF CDLL_Node.java
//==================================
//============CDLL_List.java======================
import java.io.*;
public class CDLL_List<T>
{
private CDLL_Node<T> head; // pointer to the front (first)
element of the list
private int count=0;
//________________________________
public CDLL_List()
{
head = null; // compiler does this anyway. just for emphasis
}
// LOAD LINKED LIST FROM INCOMING FILE
//________________________________
@SuppressWarnings("unchecked")
public CDLL_List( String fileName, boolean orderedFlag )
{ head = null;
try
{
BufferedReader infile = new BufferedReader( new FileReader(
fileName ) );
while ( infile.ready() )
{
if (orderedFlag)
insertInOrder( (T)infile.readLine() ); // WILL INSERT EACH ELEM
INTO IT'S SORTED POSITION
else
insertAtTail( (T)infile.readLine() ); // TACK EVERY NEWELEM ONTO
END OF LIST. ORIGINAL ORDER PRESERVED
}
infile.close();
}
catch( Exception e )
{
System.out.println( "FATAL ERROR CAUGHT IN C'TOR: " + e );
System.exit(0);
}
}
//________________________________
public void insertAtFront(T data)
{
CDLL_Node<T> node=new CDLL_Node<T>(data);
if(head==null) {
node.setNext(node);
node.setPrev(node);
head=node;
return;
}
node.setNext(head);
node.setPrev(head.getPrev());
head.getPrev().setNext(node);
head.setPrev(node);
head=node;
}
//________________________________
public void insertAtTail(T data)
{
insertAtFront(data);
head=head.getNext();
}
//________________________________
public T removeAtFront() // RETURNS TRUE IF THERE WAS NODE TO
REMOVE
{
if(head==null)
return null;
//only one item
if(head.getNext()==head.getPrev()) {
T key=head.getData();
head=null;
return key;
}
T key=head.getData();
head.getNext().setPrev(head.getPrev());
head.getPrev().setNext(head.getNext());
head=head.getNext();
return key;
}
//________________________________
public boolean removeAtTail() // RETURNS TRUE IF THERE WAS NODE TO
REMOVE
{
if(head==null)
return false;
//only one item
if(head.getNext()==head.getPrev()) {
head=null;
return true;
}
head=head.getPrev();
removeAtFront();
return true;
}
//________________________________
public String toString()
{
String toString = ""; // NO <=> DELIMITERS REQUIRED ANYWHERE
IN OUTPUT
CDLL_Node<T> temp=head;
if(head==null)
return toString;
//only one item
if(head.getNext()==head.getPrev()) {
toString=toString+head.getData();
return toString;
}
toString=toString+temp.getData()+" ";
temp=temp.getNext();
while(temp!=head) {
toString=toString+temp.getData()+" ";
temp=temp.getNext();
}
return toString; // JUST A SPACE BETEEN ELEMENTS LIKE IN LAB3
}
//________________________________
public int size() // OF COURSE MORE EFFICIENT to KEEP COUNTER BUT
YOU MUST WRITE LOOP
{
int count=0;
CDLL_Node<T> temp=head;
if(head==null)
return count;
//only one item
if(head.getNext()==head.getPrev()) {
count++;
return count;
}
count++;
temp=temp.getNext();
while(temp!=head) {
count++;
temp=temp.getNext();
}
return count;
}
//________________________________
public boolean empty()
{
return head==null; // YOUR CODE HERE
}
//________________________________
public boolean contains( T key )
{
CDLL_Node<T> temp=head;
if(head==null)
return false;
//only one item
if(head.getNext()==head.getPrev()) {
if(key==head.getData())
return true;
else
return false;
}
//check the first node
if(key==head.getData())
return true;
//check rest of the nodes
temp=temp.getNext();
while(temp!=head) {
if(key==head.getData())
return true;
temp=temp.getNext();
}
return false; // YOUR CODE HERE
}
//________________________________
public CDLL_Node<T> search( T key )
{
CDLL_Node<T> temp=head;
if(head==null)
return null;
//only one item
if(head.getNext()==head.getPrev()) {
if(key==head.getData())
return temp;
else
return null;
}
//check the first node
if(key==temp.getData())
return temp;
//check rest of the nodes
temp=temp.getNext();
while(temp!=head) {
if(key==head.getData())
return temp;
temp=temp.getNext();
}
return null; // YOUR CODE HERE
}
//________________________________
//@SuppressWarnings("unchecked") //CAST TO COMPARABLE THROWS
WARNING
public void insertInOrder(T data)
{
if(head==null) {
insertAtFront(data);
return;
}
CDLL_Node<T> node=new CDLL_Node<T>(data);
CDLL_Node<T> temp=head;
if(head.getNext()==head.getPrev()) {
if(data.toString().compareTo(head.getData().toString())<=0)
insertAtFront(data);
else {
node.setNext(head.getNext());
node.setPrev(head);
head.setNext(node);
}
return;
}
do {
if(data.toString().compareTo(temp.getData().toString())>=0
&&
data.toString().compareTo(temp.getNext().getData().toString())<0)
{
node.setNext(temp.getNext());
node.setPrev(temp);
temp.getNext().setPrev(node);
temp.setNext(node);
return;
}
temp=temp.getNext();
}while(temp!=head);
//insert at the tail of the list
insertAtTail(data);
}
//________________________________
public boolean remove(T key)
{
if(head==null)
return false;
if(head.getData()==key) {
removeAtFront();
return true;
}
CDLL_Node<T> temp=head;
do {
if(temp.getData()==key) {
temp.getPrev().setNext(temp.getNext());
temp.getNext().setPrev(temp.getPrev());
return true;
}
temp=temp.getNext();
}while(temp!=head);
return false; // REPLACE WITH YOUR CODE
}
//________________________________
public CDLL_List<T> union( CDLL_List<T> other )
{
CDLL_List<T> union = new CDLL_List<T>();
CDLL_List<T> tempList = new CDLL_List<T>();
if(!empty()) {
CDLL_Node<T> temp=head;
do {
union.insertAtFront(temp.getData());
temp=temp.getNext();
}while(temp!=head);
}
while(!other.empty()) {
T key=other.removeAtFront();
if(union.contains(key)==false)
union.insertAtFront(key);
tempList.insertAtTail(key);
}
other=tempList;
return union;
}
//________________________________
public CDLL_List<T> inter( CDLL_List<T> other )
{
CDLL_List<T> inter = new CDLL_List<T>();
if(!empty()) {
CDLL_Node<T> temp=head;
do {
if(other.contains(temp.getData())==true) {
inter.insertAtFront(temp.getData());
}
temp=temp.getNext();
}while(temp!=head);
}
return inter;
}
//________________________________
public CDLL_List<T> diff( CDLL_List<T> other )
{
CDLL_List<T> diff = new CDLL_List<T>();
if(!empty()) {
CDLL_Node<T> temp=head;
do {
if(other.contains(temp.getData())==false) {
diff.insertAtFront(temp.getData());
}
temp=temp.getNext();
}while(temp!=head);
}
return diff;
}
//________________________________
public int getCount() {
size();
return
count;
}
//________________________________
}
//=====end of CDLL_List.java====================================
//============CDLL_Tester.java========================
public class CDLL_Tester
{
public static void main( String args[] ) throws Exception
{
CDLL_List<String> list1 = new CDLL_List<String>(
args[0], false ); // false = INSERTATTAIL CALLED ON EACH T READ
FROM FILE
System.out.format("list1 %s size %d unordered
%s\n",args[0],list1.size(),list1 ); // invokes toString
list1.remove( "charlie" ); list1.remove("echo");
list1.remove("zebra"); // HEAD, TAIL, NOWHERE
System.out.format("list1 (after remove charlie, echo & zebra)
%s\n",list1 ); // invokes toString
CDLL_List<String> list2 = new CDLL_List<String>(
args[0], true ); // true = INSERTINORDER CALLED ON EACH T READ FROM
FILE
System.out.format("list2 %s size %d ordered
%s\n",args[0],list2.size(),list2 ); // invokes toString
CDLL_List<String> list3 = new CDLL_List<String>(
args[1], true ); // true = INSERTINORDER CALLED ON EACH T READ FROM
FILE
System.out.format("list3 %s size %d ordered
%s\n",args[1],list3.size(),list3 ); // invokes toString
// MUST RETURN ALL SET OP LISTS IN SORTED ORDER NO DUPES
CDLL_List<String> unionList = list2.union(list3);
System.out.println("list2.union(list3) " + unionList);
CDLL_List<String> interList = list2.inter(list3);
System.out.println("list2.inter(list3) " + interList);
CDLL_List<String> diffList = list2.diff(list3);
System.out.println("list2.diff(list3) " + diffList);
// ECHO LISTS 2 & 3 TO PROVE THEY WERE NOT MODIFIED
System.out.println();
System.out.println( "list2 after set ops: " + list2 );
System.out.println( "list3 after set ops: " + list3 );
// DESTROY LIST2 BY REPEATEDLY CALLING REMOVE AT TAIL UNTIL
EMPTY
while ( ! list2.empty() ) list2.removeAtTail();
// DESTROY LIST3 BY REPEATEDLY CALLING REMOVE AT FRONT
while ( ! list3.empty() ) list3.removeAtFront();
// ECHO LISTS 2 & 3 TO PROVE THEY WERE DESTROYED
System.out.println();
System.out.println( "list2 after all nodes removedAtTail: " + list2
);
System.out.println( "list3 after all nodes removedAtFront: " +
list3 );
} // END MAIN
} // EOF
//===========end of CDLL_Tester.java=================