雙向鏈表是指鏈表中的每個節點都有兩個指針域,一個指向直接前驅節點,一個指向直接後繼節點,定義如下:
typedef struct DoubleNode
{
int data;
struct DoubleNode* pre;
struct DoubleNode* next;
}DbleList;
下面分別講解對雙向鏈表的創建,插入和刪除操作
1.創建
創建鏈表就是創建一個空的鏈表,首先明確任務爲創建一個鏈表,我們需要做的是,創建一個頭結點head,並將頭結點的next和pre設置爲NULL
如下:
//創建雙向鏈表
DbleList* CreateListNode()
{
DbleList* pHeader = new DbleList();
pHeader->data = -1;
pHeader->pre = NULL;
pHeader->next = NULL;
return pHeader;
}
2.插入
鏈表的插入操作是在鏈表中插入一個節點,這裏有兩個方式,第一種方式,直接在鏈表末尾插入節點,第二種方式在指定位置插入節點
第一種方式:需要做的是,找到鏈表的末尾節點,將末尾的節點的next指向我們需要插入的節點pInsert,然後將pInsert的next設置爲NULL,將pInsert的pre指向末尾節點
//在鏈表末尾插入一個節點
int InsertListNode(DbleList* pHeader, DbleList* pInsert)
{
if(!pHeader || !pInsert)
return -1;
//找到尾部節點
DbleList* pTmp = pHeader;
while (pTmp->next)
{
pTmp = pTmp->next;
}
pTmp->next = pInsert;//末尾的節點的next指向我們需要插入的節點pInsert
pInsert->pre = pTmp;//pInsert的pre指向末尾節點
pInsert->next = NULL;//pInsert的next設置爲NULL
return 0;
}
第二種方式:需要做的工作是,找到插入點i的位置節點ptmp,然後將ptmp的next賦值給pInsert的next,ptmp的next的pre賦值爲pInsert,pInsert的pre賦值爲ptmp,ptmp的next賦值爲pInsert
如下:
//在指定位置插入一個節點
int InsertListNode(DbleList* pHeader, DbleList* pInsert, int iPos)
{
if (!pHeader || !pInsert)
{
return -1;
}
DbleList* pTmp = pHeader;
int i = 0;
while (i++ < iPos && pTmp->next) //找到插入點i的位置節點ptmp
{
pTmp = pTmp->next;
}
pInsert->next = pTmp->next; //將ptmp的next賦值給pInsert的next
pInsert->pre = pTmp; //pInsert的pre賦值爲ptmp
pTmp->next->pre = pInsert; //ptmp的next的pre賦值爲pInsert
pTmp->next = pInsert; //ptmp的next賦值爲pInsert
return 0;
}
3.刪除
鏈表的刪除操作爲刪除指定的元素,我們需要知道被刪除節點的位置或者被刪除節點的內容,可以通過節點內容找到對應的節點位置,故只給出刪除對應位置節點的操作
如下:
//刪除指定位置的節點
int DelListNode(DbleList* pHeader, int iPos)
{
if (!pHeader)
{
return -1;
}
int i = 0;
DbleList* pTmp = pHeader;
while (i++ < iPos && pTmp->next)//找到對應ipos的節點
{
pTmp = pTmp->next;
}
pTmp->pre->next = pTmp->next; //將pTmp的pre的next指針域賦值爲ptmp->next
pTmp->next->pre = pTmp->pre; //將pTmp的next的pre指針域賦值爲pTmp->pre
delete pTmp; //釋放內存
pTmp = NULL;
return 0;
}
ps:水平有限,供參考使用。請大家批評指正,互相學習進步