?🌈 個人主頁:白子寰
🔥 分類專欄:C++打怪之路,python從入門到精通,數據結構,C語言,C語言題集👈 希望得到您的訂閱和支持~
💡 堅持創作博文(平均質量分82+),分享更多關于深度學習、C/C++,python領域的優質內容!(希望得到您的關注~)
?
目錄
雙向循環鏈表
結構
介紹
圖示
雙向鏈表的實現
在List.h中
定義雙向鏈表的結構
實現雙向鏈表的接口/方法
?在List.c中
初始化
銷毀鏈表
打印鏈表
判斷鏈表是否為空
尾插
測試
頭插
測試
?編輯尾刪
測試
?編輯頭刪
測試
?編輯在pos位置之后插入數據
測試
?編輯刪除pos指定節點
測試
查找鏈表的指定元素
雙向循環鏈表
結構
包含數據域,指針域(前驅節點prev和后繼節點next)
介紹
結構最復雜,一般用在單獨存儲數據。
實際中使用的鏈表數據結構,都是帶頭雙向循環鏈表。
另外這個結構雖然結構復雜,
但是使用代碼實現以后會發現結構會帶來很多優勢,但實現簡單
圖示
雙向鏈表的實現
在List.h中
定義雙向鏈表的結構
typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* prev;struct ListNode* next;
}LTNode;
?
實現雙向鏈表的接口/方法
//初始化
LTNode* LTInit();
//銷毀鏈表
void LTDestroy(LTNode* phead);
//打印鏈表
void LTPrint(LTNode* phead);
//判斷鏈表是否為空
bool LTEmpty(LTNode* phead);
//尾插
void LTPushBack(LTNode* phead, LTDataType x);
//頭插
void LTPushFront(LTNode* phead, LTDataType x);
//尾刪
void LTPopBack(LTNode* phead);
//頭刪
void LTPopFront(LTNode* phead);
//在pos位置之后插入數據
void LTInsert(LTNode* pos, LTDataType x);
//刪除pos指定節點
void LTErase(LTNode* pos);
//查找鏈表的指定元素
LTNode* LTFind(LTNode* phead, LTDataType x);
?
?在List.c中
初始化
//初始化
LTNode* LTInit()
{LTNode* phead = LTBuyNode(-1);return phead;
}
銷毀鏈表
//銷毀
void LTDestroy(LTNode* phead)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead){LTNode* next = pcur->next;free(pcur);pcur = next;}//最后釋放頭節點的內存并置空free(phead);phead = NULL;
}
打印鏈表
//打印雙向鏈表
void LTPrint(LTNode* phead)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead){printf("%d->", pcur->data);pcur = pcur->next;}printf("\n");
}
判斷鏈表是否為空
bool LTEmpty(LTNode* phead)
{if (phead->next == phead){return true;}else { return false; }
}
尾插
//尾插
void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);newnode->next = phead;newnode->prev = phead->prev;phead->prev->next = newnode;phead->prev = newnode;
}
后四行的方向和賦值問題?
有新開節點newnode
?
測試
頭插
//頭插
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);LTNode* pcur = phead->next;newnode->next = pcur;newnode->prev = phead;phead->next = newnode;pcur->prev = newnode;
}
測試
尾刪
//尾刪
void LTPopBack(LTNode* phead)
{assert(phead);LTNode* p1 = phead->prev;LTNode* pcur = p1->prev;pcur->next = phead;phead->prev = pcur;free(p1);p1 = NULL;
}
測試
頭刪
//頭刪
void LTPopFront(LTNode* phead)
{assert(phead);LTNode* pcur = phead->next->next;LTNode* p1 = phead->next;phead->next = pcur;pcur->prev = phead;free(p1);p1 = NULL;
}
測試
在pos位置之后插入數據
//在pos位置之后插入數據
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* newnode = LTBuyNode(x);newnode->next = pos->next;newnode->prev = pos;//如果pos是最后一個節點if (pos->next == NULL){newnode->next = NULL;}else{pos->next->prev = newnode;}pos->next = newnode;
}
測試
刪除pos指定節點
//刪除pos節點
void LTErase(LTNode* pos)
{assert(pos);LTNode* p1 = pos->prev;LTNode* pcur = pos->next;p1->next = pcur;pcur->prev = p1;free(pos);pos = NULL;
}
測試
查找鏈表的指定元素
//查找元素
LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* pcur = phead->next;while (pcur != phead) //注意循環條件!{if (pcur->data == x){return pcur;}else{pcur = pcur->next;}}return NULL;
}
?
?
?***********************************************************分割線*****************************************************************************
完結!!!
感謝瀏覽和閱讀。
等等等等一下,分享最近喜歡的一句話:“人生如逆旅,我亦是行人”。
我是白子寰,如果你喜歡我的作品,不妨你留個點贊+關注讓我知道你曾來過。
你的點贊和關注是我持續寫作的動力!!!?
好了劃走吧。