二重リンクリストを使用して優先キュー待機リストを実装しています。私のメソッドは新しいノード(優先度と学生ID)を作成します。ノードの優先度に応じて、メソッドはノードをキューにソートします。二重リンクリストを挿入したプライオリティキュー
what I get is what I should get
Waitlisted: 109 in 2123 | Waitlisted: 109 in 2123
Current waitlist: 109 | Current waitlist: 109
|
Waitlisted: 105 in 2123 | Waitlisted: 105 in 2123
Current waitlist: 105 | Current waitlist: 105 109
|
Waitlisted: 108 in 2123 | Waitlisted: 108 in 2123
Current waitlist: 109 105 | Current waitlist: 105 108 109
|
Waitlisted: 106 in 2123 | Waitlisted: 106 in 2123
Current waitlist: 106 | Current waitlist: 105 106 108 109
|
Waitlisted: 107 in 2123 | Waitlisted: 107 in 2123
Current waitlist: 109 106 | Current waitlist: 105 106 107 108 109
最初のループでキューが空の場合、新しいノードを挿入できます。 2回目の実行から、キューの戻り値が間違っています。
コード
void enqueue(PQNode** ppFront, WaitlistEntry info){
/* create a new node to store the info */
PQNode *temp = (PQNode*)malloc(sizeof(PQNode)); //create a new node to store the info
temp->info = info;
temp->pNext = NULL;
temp->pPrev = NULL;
/* check if the LL is empty and add the new node to the front if it is */
if(*ppFront == NULL){
*ppFront = temp;
return;
}
/* check if the new node should come before the first node in the LL */
if(temp->info.iPriority > (*ppFront)->info.iPriority){
temp->pNext = *ppFront;
(*ppFront)->pPrev = temp;
*ppFront = temp;
return;
}
/* walk back through the previous nodes in the LL until the correct insertion point is found */
/* remember to also check whether the previous node is NULL */
while((*ppFront)->pNext != NULL && temp->info.iPriority <= (*ppFront)->info.iPriority){
*ppFront = (*ppFront)->pNext;
}
/* insert the new node into the place you found with your loop */
/* note you may need a special case for when the previous node is NULL */
if((*ppFront)->pNext == NULL){
(*ppFront)->pNext = temp;
temp->pPrev = *ppFront;
return;
}
temp->pPrev = *ppFront;
temp->pNext = (*ppFront)->pNext;
(*ppFront)->pNext->pPrev = temp;
(*ppFront)->pNext = temp;
return;
}
構造体は
typedef struct{
int iPriority; /* Priority of the student to be enrolled */
int iStudentID; /* ID of the student */
} WaitlistEntry;
typedef struct PQNode {
WaitlistEntry info; /* WaitlistEntry stored in the node (sorted with largest priority first) */
struct PQNode* pNext; /* Pointer to next node in the LL */
struct PQNode* pPrev; /* Pointer to previous node in the LL */
} PQNode;
typedef struct{
int iCourseNumber; /* Course number of the course */
int* iStudentIDs; /* Array of IDs of students enrolled in the course */
int iNumEnrolled; /* Number of Students currently enrolled in course */
int iMaxEnrolled; /* Max number of Students that can enroll in the course */
PQNode* pFront; /* Priority queue representing the waitlist for the course */
} Course;
私はいくつかのコードを修正するために管理してきましたが、私はまだこだわっています。
は 'enqueue'ロジックに誤りがあり得るが、それはそれに関係なく表示機能にエラーがあると推測されます。 – BLUEPIXY
小さな関数に分割することで、このようなことが起こったときにロジックをデバッグするのに役立ちます。例えば、二重リンクリストを扱う場合、NULLリストを扱う際にロジックが混乱する可能性があるため、 'connect(prev、current、next)'と 'disconnect(prev、next)'関数のセットに依存する傾向があります。 、NULLのprev/nextポインタなどがあります。同様に、挿入ポイントの検索も独自の関数に組み込むことができます。 [このペーストを参照してください](https://pastebin.com/XpbNaG7a)私が話していることの例です。見るべき主な機能は 'FindPriorityEnd'と' Enqueue'です。 –