2016-04-27 11 views
-5

パラメータとして正の整数nをとる関数moveNthFrontの定義を記述します。この関数は、キューのn番目の要素を前面に移動します。残りの要素の順序は変更されません。たとえば、仮定:プログラムが破損し続ける

キュー= {5、11、34、67、43、55}であり、n =関数moveNthFrontの呼び出し後3

キュー= {34、 5,11,67,43,55}。

この関数をクラスqueueTypeに追加します。また、あなたのメソッドをテストするためのプログラムを書いてください。

はここにここに私のヘッダー

#ifndef queueType_H 
#define queueType_H 
#include<iostream> 

class queueType 
{ 
private: 
    class Queue 
    { 
     friend class queueType; 
     int value; 
     Queue *next; 
     Queue(int value1, Queue *next1 = NULL) 
     { 
      value = value1; 
      next = next1; 
     } 
    }; 
    // These track the front and rear of the queue 
    Queue *front; 
    Queue *rear; 
    Queue *head; 


public: 
    void moveNthFront(int); 

あるヘッダのCPPです。

#include"queueType.h" 
#include<iostream> 
using namespace std; 

queueType::queueType() { 
front = NULL; 
rear = NULL; 
} 

queueType::~queueType() { 
clear(); 
} 

void queueType::enqueue(int num) 
{ 
    if (isEmpty()) 
    { 
     front = new Queue(num); 
     rear = front; 
    } 
    else 
    { 
     rear->next = new Queue(num); 
     rear = rear->next; 
    } 
} 
void queueType::dequeue(int &num) 
{ 
    Queue *temp; 
    if (isEmpty()) 
    { 
     cout << "The queue is empty.\n"; 
     exit(1); 
    } 
    else 
    { 
     num = front->value; 
     temp = front; 
     front = front->next; 
     delete temp; 
    } 
} 

bool queueType::isEmpty() const 
{ 
    if (front == NULL) 

     return true; 
    else 
     return false; 
} 

int queueType::search(int x) 
{ 
    if (front == NULL) 
     return -1; 
    else 
    { 
     int count = 0; 
     Queue *aptr = front; 
     while (aptr != NULL) 
     { 
     if (aptr->value == x) 
      return count; 
      aptr = aptr->next; 
      count++; 
     } 
     return -1; 
    } 
} 

void queueType::clear() 
{ 
    int value; // Dummy variable for dequeue 

    while (!isEmpty()) 
     dequeue(value); 
} 
void queueType::remove(int pos) 
{ 
    if (front == NULL) 
     return; 
    else if (pos == 0) 
     front = front->next; 
    else 
    { 
     int count = 0; 
     Queue *now = front, *past; 
     while (now != NULL && count != pos) 
     { 
      past = now; 
      now = now->next; 
      count++; 
     } 
    if (now) 
     { 
      past->next = now->next; 
      delete now; 
     } 
    } 
} 
void queueType::insert(int x, int pos) 
{ 
    Queue *now, *past; 
    if (front == NULL) 
     front = new Queue(x); 
    else if (now != NULL && pos == 0) 
    { 
    now = front; 
    ; 
     for (int i = 0; i < 5; i++) 
     { 
      past = now; 
      now = now->next; 

     } 
     past->next = new Queue(x, now); 
    } 
    else 
    { 
     now = front; 
     int count = 0; 
     while (now != NULL && count != pos) 
     { 
      past = now; 
      now = now->next; 
      count++; 
     } 
     past->next = new Queue(x, now); 
    } 
} 

は、ここでは初期化されていないようになりましnullであるため、実行することはできません私のメインのinsertメソッドで

#include"queueType.h" 
#include<iostream> 
using namespace std; 

int main() { 

queueType intqueue; 

int input, temp, x = 0; 

for (int i = 0; i < 5; i++) { 
    intqueue.enqueue(i*i); 
} 
cout << "The values in the queue were:\n"; 
while (!intqueue.isEmpty()) 
{ 
    int value; 
    intqueue.dequeue(value); 
    cout << value << " "; 
} 

for (int i = 0; i < 5; i++) { 
    intqueue.enqueue(i*i); 
} 
cout << "\nEnter the value to find:" << endl; 
cin >> input; 
intqueue.search(input); 
temp = intqueue.search(input); 
intqueue.remove(temp); 
intqueue.insert(input, 0); 

cout << "\nThe values after change was made:\n"; 
while (!intqueue.isEmpty()) 
{ 
    int value; 
    intqueue.dequeue(value); 
    cout << value << " "; 
} 
return 0; 

}

+0

私はこの ボイド挿入(int型のx、int型POS)のような位置によって挿入機能を使用しようとしていました。私が0点を置くと壊れます –

+0

どのようなエラーが出ていますか? – Jay

+0

時間チェックの失敗 –

答えて

1

else if (now != NULL && pos == 0) { この部分です。 次に、制御はelse部分に移ります。 ここで、pos = 0 *の場合、pastは決して初期化されません。 *を最初に初期化してください。他 あなたは一部ならば、他の削除とちょうど私がそれを編集したwhileループの外に一度すなわち

else 
{ 
    now = front; 
    int count = 0;//here initialize past once past=now; 
    while (now != NULL && count != pos) 
    { 
     past = now; 
     now = now->next; 
     count++; 
    } 
    past->next = new Queue(x, now); 
} 
0

を*過去を初期化することができます。 0ポジションを除くすべてのポジションで機能します。 キューの先頭に移動するには要素が必要です。

void queueType::insert(int x, int pos) 
{ 
    Queue *now, *past; 
    if (front == NULL) 
    front = new Queue(x); 
    else 
    { 
    now = front; 

    int count = 0; 
    while (now != NULL && count != pos) 
    { 
     past = now; 
     now = now->next; 
     count++; 
    } 
    past->next = new Queue(x, now); 
} 

}

関連する問題