我正在使用雙向鏈表實現優先級隊列等待列表。我的方法創建一個新節點(優先級和學生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
我能夠在第一個循環中的隊列爲空時插入一個新節點。從第二次運行開始,隊列的返回值是錯誤的。
代碼
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;
}
的Structs
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
將事情分解爲更小的函數可以幫助您在出現類似情況時調試邏輯。例如,當我處理雙向鏈表時,我傾向於依賴一組'connect(prev,current,next)'和'disconnect(prev,next)'函數,因爲在處理NULL列表時邏輯可能會造成混淆,NULL prev/next指針等。同樣,找到插入點也可以放入其自己的函數中。 [見此貼](https://pastebin.com/XpbNaG7a)作爲我正在談論的一個例子。查看的主要功能是FindPriorityEnd和Enqueue。 –