1

二重にリンクされたリストを含むことにひどく迷っている割り当てがあります(組み込みの API を使用するのではなく、ゼロから作成することになっていることに注意してください)。このプログラムは、基本的にクレジットカードを追跡することになっています。私の教授は、これを達成するために二重連結リストを使用することを望んでいます。問題は、この本はこの主題について詳しく説明しておらず (二重連結リストに関する疑似コードさえ示していない)、単に二重連結リストとは何かを説明し、小さな段落でコードを一切説明せずに絵だけで話していることです。とにかく、私は不平を言いました。ノードクラスの作成方法とその仕組みを完全に理解しています。問題は、ノードを使用してリストを作成する方法です。これが私がこれまでに持っているものです。

public class CardInfo 
{
private String name;
private String cardVendor;
private String dateOpened;
private double lastBalance;
private int accountStatus;

private final int MAX_NAME_LENGTH = 25;
private final int MAX_VENDOR_LENGTH = 15;

CardInfo()
{

}

CardInfo(String n, String v, String d, double b, int s)
{
    setName(n);
    setCardVendor(v);
    setDateOpened(d);
    setLastBalance(b);
    setAccountStatus(s);
}

public String  getName()
{
    return name;
}

public String getCardVendor()
{
    return cardVendor;
}

public String getDateOpened()
{
    return dateOpened;
}

public double getLastBalance()
{
    return lastBalance;
}

public int getAccountStatus()
{
    return accountStatus;
}

public void setName(String n)
{
    if (n.length() > MAX_NAME_LENGTH)
        throw new IllegalArgumentException("Too Many Characters");
    else 
        name = n;           
}

public void setCardVendor(String v)
{
    if (v.length() > MAX_VENDOR_LENGTH)
        throw new IllegalArgumentException("Too Many Characters");
    else
        cardVendor = v;
}

public void setDateOpened(String d)
{
    dateOpened = d;
}

public void setLastBalance(double b)
{
    lastBalance = b;
}

public void setAccountStatus(int s)
{
    accountStatus = s;
}

public String toString()
{
    return String.format("%-25s     %-15s     $%-s     %-s     %-s",
            name, cardVendor, lastBalance, dateOpened, accountStatus);
}
}

public class CardInfoNode 
{
CardInfo thisCard;

CardInfoNode next;
CardInfoNode prev;

CardInfoNode()
{

}

 public void setCardInfo(CardInfo info)
 {
     thisCard.setName(info.getName());
     thisCard.setCardVendor(info.getCardVendor());
     thisCard.setLastBalance(info.getLastBalance());
     thisCard.setDateOpened(info.getDateOpened());
     thisCard.setAccountStatus(info.getAccountStatus());
 }

 public CardInfo getInfo()
 {
     return thisCard;
 }


 public void setNext(CardInfoNode node)
 {
     next = node;
 }

 public void setPrev(CardInfoNode node)
 {
     prev = node;
 }

 public CardInfoNode getNext()
 {
     return next;
 }

 public CardInfoNode getPrev()
 {
     return prev;
 }
}

public class CardList
{
CardInfoNode head;
CardInfoNode current;
CardInfoNode tail;

CardList()
{
    head = current = tail = null;
}


public void insertCardInfo(CardInfo info)
{
    if(head == null)
    {
        head = new CardInfoNode();
        head.setCardInfo(info);
        head.setNext(tail);
        tail.setPrev(node) // here lies the problem. tail must be set to something
                               // to make it doubly-linked. but tail is null since it's
                               // and end point of the list.
    }

}


}

何が必要で、さらに重要なことに、私が理解していない部分を明確にするのに役立つ場合は、割り当て自体を次に示します。ありがとう https://docs.google.com/open?id=0B3vVwsO0eQRaQlRSZG95eXlPcVE

4

2 に答える 2

0

CardList実際の二重リンクリストの実装をカプセル化することを意図していると思います。

ノードが 1 つしかない DLL の基本ケースを考えてみましょう。ノードの参照prevnext参照は null (またはそれ自体) になります。リストのカプセル化headtail参照は両方とも単一のノードになります (ノードはリストの開始と終了の両方であるため)。それについて理解するのがとても難しいのは何ですか?

CardListNB: それが DLL 構造のカプセル化 (操作ではなく) であると仮定すると、CardInfoNode currentフィールドを持つ理由はありません。そのような状態情報は、構造上で動作するアルゴリズムにのみ有用であり、それ自体が維持されます。 (また、クラスがスレッドセーフではなくなります)。

于 2012-09-23T03:21:58.153 に答える
0
if(head == null)
    {
        head = new CardInfoNode();
        head.setCardInfo(info);
        head.setNext(tail);
        tail.setPrev(node) // here lies the problem. tail must be set to something
                               // to make it doubly-linked. but tail is null since it's
                               // and end point of the list.
    }

上記のコードは、リストにノードがない場合のためのものです。ここでは、リストにノードを追加します。つまり、リストするノード
は、同じノードに頭と尾を指しています。

于 2012-09-23T03:24:53.130 に答える