犯錯誤的地方:
1、雙鏈表的尾插發(fā)自己還想著跟在中間插入節(jié)點一樣的寫法,犯了很嚴(yán)重的錯誤,只需要這些代碼就能解決問題
pRear->pNext = s;
s->pPrior = pRear;
如果不是動手做自己并沒有意識到這樣。
2、結(jié)構(gòu)體中前一項人家給的是prior,自己習(xí)慣用的是pre,還是按照書上的說法來
3、在刪除和插入節(jié)點的時候都要對是否是在尾節(jié)點進(jìn)行操作進(jìn)行特殊處理,在做刪除操作的時候,是在寫完函數(shù)后才想到這一點,在追求正確率的路上,這是不應(yīng)該的。
void DoubleList::coutMSG(DLNode* pHead)
{
cout<<"輸出雙鏈表信息:"<<endl;
while (pHead->pNext!=NULL)
{
cout<<pHead->pNext->n<<endl;
pHead = pHead->pNext;
}
cout<<"輸出結(jié)束"<<endl;
}
void DoubleList::InitDLNode(DLNode *&pNode)
{
pNode = (DLNode*)malloc(sizeof(DLNode));
pNode->pNext = NULL;
pNode->pPrior = NULL;
}
void DoubleList::CreateeDBList(DLNode *&pHead,int num[],int n)
{
DLNode* s;
DLNode* pRear = pHead;
for (int i=0; i<n; i++)
{
InitDLNode(s);
s->n = num[i];
pRear->pNext = s;
s->pPrior = pRear;
// s->pNext = pRear->pNext;這兒記錄了尾插法自己在這兒添加如下代碼是多么的愚蠢,不是自己動手做,可能都沒意識到自己這兒會出這樣的問題
//? s->pPrior = pRear;
// if (pRear->pNext != NULL)
// {
// pRear->pNext->pPrior = s;
// }
// pRear->pNext = s;
pRear = pRear->pNext;
}
}
// 要刪除的節(jié)點所存儲的數(shù)據(jù)為n
void DoubleList::DeleteDLNode(DLNode *&pHead,int n)
{
DLNode* p = pHead->pNext;
while (p!=NULL)
{
if (p->n == n)
{
if (p->pNext != NULL) //第一時間沒有想到刪除節(jié)點的時候,需要加這個判斷語句,不能刪除尾節(jié)點的時候可能會報錯
{
p->pNext->pPrior = p->pPrior;
}
p->pPrior->pNext = p->pNext;
free(p);
break;
}
p = p->pNext;
}
}
// 在數(shù)據(jù)為n的節(jié)點后面插入節(jié)點pInsert
void DoubleList::InsertDLNode(DLNode *&pHead,int n,DLNode*& pInsert)
{
DLNode* p = pHead->pNext;
while (p!=NULL)
{
if (p->n == n)
{
if (p->pNext!=NULL)
{
pInsert->pNext = p->pNext;
pInsert->pPrior = p;
p->pNext->pPrior = pInsert;
p->pNext = pInsert;
}
else
{
pInsert->pPrior = p;
p->pNext = pInsert;
}
break;
}
p= p->pNext;
}
}