-1

200 から 800 までの SAT グレードの二重リンク リストを使用しようとしています。リストからすべての重複を削除する必要があります。つまり、すべての重複を削除して、各成績が 1 回だけ表示されるようにします。

#define HIGHEST_GRADE 800

typedef struct dListNode{
    int* dataPtr;
    struct dListNode* next;
    struct dListNode* prev;
}DListNode;

typedef struct dList

{
    DListNode* head;
    DListNode* tail;
}DList;

void removeDuplicates(DList* lst)
{
    int i;
    int gradesBucket [numOfGrades];
    DListNode* temp;
    temp = lst->head;

    for(i=200 ; i<HIGHEST_GRADE ; i++) /*creating 600 buckets - each bucket for a grade*/
        gradesBucket[i] = FALSE;

    while (temp)
    {
        if ((gradesBucket [*temp->dataPtr]) == TRUE) /*if current grade has already  */
                                                     /* appeared earlier on the list */
        {
            deleteFromList (temp);  /*delete that grade's cell*/
        }
        else
            gradesBucket[*temp->dataPtr] = TRUE; /* mark grade bucket as true, meaning */
                                                 /* the grade already appeared*/
        temp = temp->next; /*moving on to next grade*/
    }
}

void deleteFromList(DListNode*  toRemove)
{
    toRemove->prev->next = toRemove->next;
    toRemove->next->prev = toRemove->prev;

    deAllocateListCell (toRemove);    
}

void deAllocateListCell (DListNode* cell)
{
    free (cell->dataPtr);
    free (cell);
}

何が悪いのか理解してください。


これは修正されたコードですが、まだ正しく動作しません。これでコンパイルできますが、画面には何も表示されません。ちなみに、最初の数字は決して重複することはできないため、頭を削除する必要はありません...しかし、頭がNULLの場合に備えてそれを処理しました。
また、削除したいセルの前のセルを関数deleteFromListに送信します。それでもうまくいきません。何か案は?ありがとう!

    void deleteFromList(DList* lst, DListNode*  p)
{

DListNode* del_cell = p->next;   /* cell to delete*/

if (p->next->next == NULL) /*if cell to remove is the tail*/
{
    deAllocateListCell (p->next); /* freeing current tail */
    lst->tail = p;  /* p is the new tail */
    p->next = NULL; /* tail points to NULL */
}
else /* if cell to remove is not the tail (note: can't be head beacuse no duplicates can be found in the first grade) */
{
    p->next = del_cell->next;
    del_cell->next->prev = p;
    deAllocateListCell (del_cell);
    }
}
4

3 に答える 3

0

これを修正するために書く必要がありwhile(temp->next)ます....また、無料を使用してノードの割り当てを解除することもできます。ダングリングポインターの問題を解消するには、そのノードを解放した後にNULLにする必要があります

于 2013-04-17T12:21:43.030 に答える