動態連結串列佇列--記憶體溢位異常-和邊界溢位
public classListQueue {
static ListQueue listfront;
static int front;
static ListQueue listrear;
static int rear;
static{ //最初建立頭佇列節點
listfront=listrear=new ListQueue();
rear=0;
front=0;
}
// member of no-static
int[] date
static final int MaxSize=100;
ListQueuenext;
public ListQueue(){
date=new int[MaxSize];
}
public void insertnumber(int number){
if(rear<(MaxSize-1)&&rear+1!=front){ //listrear尾節點索引的節點中還有空餘記憶體儲存資料
rear=rear+1;
listrear.date[rear
// System.out.println(listrear.date[rear]);
}
else if((rear==(MaxSize-1))&&(front==0)){ //listfront頭結點索引的節點沒有空餘記憶體
listrear.next=new ListQueue();
listrear=listrear.next;
listrear.next=listfront; //insert numberto rear.date;
rear=0;
listrear.date[rear]=number;
// System.out.println(listrear.date[rear]);
}
else if(rear==(MaxSize-1)&&front!=0){ //頭結點中還有空餘記憶體儲存資料
listrear=listfront; //move list-rear,attention to that rear should be zero;
rear=0;
listrear.date[rear]=number;
// System.out.println(listrear.date[rear]);
}
else if((rear+1)==front&&listfront==listrear){ //在陣列的中間出現佇列滿的情況
listfront=listrear.next;
listrear.next=new ListQueue();
listrear.next.next=listfront;
listfront=listrear.next; //申請一個新的頭結點
for(int count=MaxSize-1;count>front;count--){ //講原先頭結點的資料複製到新的頭結點中
listfront.date[count]=listrear.date[count];
}
rear=rear+1;
listrear.date[rear]=number;
// System.out.println(listrear.date[rear]);
}
}
intgetanddeletenumber(){ //和getnumber相同,主要區別在於front會向前移動達到對資料的刪除操作
if(front==rear&&listfront==listrear){
//throw exception of empty queue
return 0;
}
if(front<MaxSize-1){
front=front+1;
return listfront.date[front];
}
else if(front==MaxSize-1&&listfront!=listrear){
listfront=listfront.next;
listrear.next=listfront;
front=0;
return listfront.date[front];
}
else{ //front==MaxSize-1&&listfront==listrear)
front=0;
return listfront.date[0];
}
}
int getnumber(){
if(front==rear&&listfront==listrear){ //空佇列的判定
System.out.println("exception");
return 0;
//exception of empty queue;
}
else{ //為非空佇列
if(front<MaxSize-1){ //頭索引的下表不在節點陣列的尾部,
// System.out.println(listfront.date[front+1]);
return listfront.date[front+1];
}
else if(front==MaxSize-1&&listfront!=listrear){ //遍歷下個節點
ListQueuelistmid=listfront.next;
// System.out.println(listmid.date[0]);
return listmid.date[0];
}
else{ //(front==MaxSize-1&&listfront==listrear) //同一個節點的遍歷
// System.out.println(listfront.date[0]);
return listfront.date[0];
}
}
}
void showalldate(){
if(front==rear&&listfront==listrear){ //判定是否為空佇列
System.out.println("empty Queue");
//**
// 注意這裡需要呼叫跑出個錯誤,不是異常
}
else{
int mid=front+1; //遍歷不能破壞原本的索引,需要額外的索引
ListQueuelistmid=listfront;
while(!(listmid==listrear&&mid==rear+1)){
if(listmid!=listrear){ //有多個節點佇列的遍歷
for(;mid<MaxSize;mid++){
System.out.println(listmid.date[mid]);
}
listmid=listmid.next;
mid=0;
}
else{ //只有一個節點的時候的遍歷
for(;mid<=rear;mid++){
System.out.println(listmid.date[mid]);
}
}
}
}
}
}
public classhellojava {
public static void main(String[]args){
ListQueuemyqueue=newListQueue();
for(inti=88;i<321;i++){
myqueue.insertnumber(i);
}
myqueue.getnumber();
myqueue.showalldate();
}
}