深入解析C++的循環(huán)鏈表與雙向鏈表設(shè)計(jì)的API實(shí)現(xiàn)
循環(huán)鏈表設(shè)計(jì)與API實(shí)現(xiàn)
基本概念
循環(huán)鏈表的定義:將單鏈表中最后一個(gè)數(shù)據(jù)元素的next指針指向第一個(gè)元素
循環(huán)鏈表擁有單鏈表的所有操作
- 創(chuàng)建鏈表
- 銷毀鏈表
- 獲取鏈表長(zhǎng)度
- 清空鏈表
- 獲取第pos個(gè)元素操作
- 插入元素到位置pos
- 刪除位置pos處的元素
新增功能:游標(biāo)的定義
在循環(huán)鏈表中可以定義一個(gè)“當(dāng)前”指針,這個(gè)指針通常稱為游標(biāo),可以通過這個(gè)游標(biāo)來遍歷鏈表中的所有元素。
循環(huán)鏈表新操作
將游標(biāo)重置指向鏈表中的第一個(gè)數(shù)據(jù)元素
CircleListNode* CircleList_Reset(CircleList* list);
獲取當(dāng)前游標(biāo)指向的數(shù)據(jù)元素
CircleListNode* CircleList_Current(CircleList* list);
將游標(biāo)移動(dòng)指向到鏈表中的下一個(gè)數(shù)據(jù)元素
CircleListNode* CircleList_Next(CircleList* list);
直接指定刪除鏈表中的某個(gè)數(shù)據(jù)元素
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node); // 根據(jù)元素的值 刪除 元素 pk根據(jù)元素的位置 刪除 元素
最后加了一個(gè)循環(huán)鏈表的應(yīng)用:求解約瑟夫問題
約瑟夫問題-循環(huán)鏈表典型應(yīng)用
n 個(gè)人圍成一個(gè)圓圈,首先第 1 個(gè)人從 1 開始一個(gè)人一個(gè)人順時(shí)針報(bào)數(shù),報(bào)到第 m 個(gè)人,令其出列。然后再?gòu)南乱?個(gè)人開始從 1 順時(shí)針報(bào)數(shù),報(bào)到第 m 個(gè)人,再令其出列,…,如此下去,求出列順序。
代碼:
// circlelist.h
// 循環(huán)鏈表API聲明
#ifndef _CIRCLELIST_H_
#define _CIRCLELIST_H_
typedef void CircleList;
typedef struct _tag_CircleListNode
{
struct _tag_CircleListNode *next;
}CircleListNode;
// 創(chuàng)建鏈表
CircleList* CircleList_Create();
// 銷毀鏈表
void CircleList_Destroy(CircleList* list);
// 清空鏈表
void CircleList_Clear(CircleList* list);
// 獲取鏈表的長(zhǎng)度
int CircleList_Length(CircleList* list);
// 在pos位置插入結(jié)點(diǎn)node
int CircleList_Insert(CircleList* list,CircleListNode* node, int pos);
// 獲取pos位置的結(jié)點(diǎn)
CircleListNode* CircleList_Get(CircleList* list, int pos);
// 刪除pos位置的結(jié)點(diǎn)
CircleListNode* CircleList_Delete(CircleList* list, int pos);
// 根據(jù)結(jié)點(diǎn)的值進(jìn)行數(shù)據(jù)刪除
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node);
// 重置游標(biāo)
CircleListNode* CircleList_Reset(CircleList* list);
// 獲取當(dāng)前游標(biāo)所指結(jié)點(diǎn)
CircleListNode* CircleList_Current(CircleList* list);
// 將原始游標(biāo)所指結(jié)點(diǎn)返回給上層,然后讓游標(biāo)移到下一個(gè)結(jié)點(diǎn)
CircleListNode* CircleList_Next(CircleList* list);
#endif
// circlelist.cpp
// 循環(huán)鏈表API實(shí)現(xiàn)
#include <iostream>
#include <cstdio>
#include "circlelist.h"
typedef struct _tag_CircleList
{
CircleListNode header;
CircleListNode *silder;
int length;
}TCircleList;
// 創(chuàng)建鏈表
CircleList* CircleList_Create()
{
TCircleList *ret = (TCircleList *)malloc(sizeof(TCircleList));
if (ret == NULL) {
return NULL;
}
// 初始化
ret->header.next = NULL;
ret->silder = NULL;
ret->length = 0;
return ret;
}
// 銷毀鏈表
void CircleList_Destroy(CircleList* list)
{
if (list == NULL) {
return;
}
free(list);
return;
}
// 清空鏈表
void CircleList_Clear(CircleList* list)
{
if (list == NULL) {
return;
}
TCircleList *tList = (TCircleList *)list;
tList->header.next = NULL;
tList->silder = NULL;
tList->length = 0;
return;
}
// 獲取鏈表的長(zhǎng)度
int CircleList_Length(CircleList* list)
{
if (list == NULL) {
return -1;
}
TCircleList *tList = (TCircleList *)list;
return tList->length;
}
// 在pos位置插入結(jié)點(diǎn)node
int CircleList_Insert(CircleList* list, CircleListNode* node, int pos)
{
if (list == NULL || node == NULL || pos < 0) {
return -1;
}
TCircleList *tList = (TCircleList *)list;
CircleListNode *cur = (CircleListNode *)tList;
for (int i = 0; i < pos; ++i) {
cur = cur->next;
}
node->next = cur->next;
cur->next = node;
// 如果是第一次插入
if (tList->length == 0) {
tList->silder = node;
}
++tList->length; // 記得長(zhǎng)度加1
// 如果是頭插法
if (cur == (CircleListNode *)tList) {
// 獲取最后一個(gè)元素
CircleListNode *last = CircleList_Get(tList, tList->length - 1);
last->next = cur->next;
}
return 0;
}
// 獲取pos位置的結(jié)點(diǎn)
CircleListNode* CircleList_Get(CircleList* list, int pos)
{
// 因?yàn)槭茄h(huán)鏈表,所以這里不需要排除pos>length的情況
if (list == NULL || pos < 0) {
return NULL;
}
TCircleList *tList = (TCircleList *)list;
CircleListNode *cur = (CircleListNode *)tList;
for (int i = 0; i < pos; ++i) {
cur = cur->next;
}
return cur->next;
}
// 刪除pos位置的結(jié)點(diǎn)
CircleListNode* CircleList_Delete(CircleList* list, int pos)
{
TCircleList *tList = (TCircleList *)list;
CircleListNode *ret = NULL;
if (tList != NULL && pos >= 0 && tList->length > 0) {
CircleListNode *cur = (CircleListNode *)tList;
for (int i = 0; i < pos; ++i) {
cur = cur->next;
}
// 若刪除頭結(jié)點(diǎn),需要求出尾結(jié)點(diǎn)
CircleListNode *last = NULL;
if (cur == (CircleListNode *)tList) {
last = CircleList_Get(tList, tList->length - 1);
}
ret = cur->next;
cur->next = ret->next;
--tList->length;
// 若刪除頭結(jié)點(diǎn)
if (last != NULL) {
tList->header.next = ret->next;
last->next = ret->next;
}
// 若刪除的元素為游標(biāo)所指的元素
if (tList->silder == ret) {
tList->silder = ret->next;
}
// 若刪除元素后鏈表長(zhǎng)度為0
if (tList->length == 0) {
tList->header.next = NULL;
tList->silder = NULL;
}
}
return ret;
}
// 根據(jù)結(jié)點(diǎn)的值進(jìn)行數(shù)據(jù)刪除
CircleListNode* CircleList_DeleteNode(CircleList* list, CircleListNode* node)
{
TCircleList *tList = (TCircleList *)list;
CircleListNode *ret = NULL;
if (list != NULL && node != NULL) {
CircleListNode *cur = (CircleListNode *)tList;
int i = 0;
for (i = 0; i < tList->length; ++i) {
if (cur->next == node) {
ret = cur->next;
break;
}
cur = cur->next;
}
// 如果找到
if (ret != NULL) {
CircleList_Delete(tList, i);
}
}
return ret;
}
// 重置游標(biāo)
CircleListNode* CircleList_Reset(CircleList* list)
{
TCircleList *tList = (TCircleList *)list;
CircleListNode* ret = NULL;
if (list != NULL) {
tList->silder = tList->header.next;
ret = tList->silder;
}
return NULL;
}
// 獲取當(dāng)前游標(biāo)所指結(jié)點(diǎn)
CircleListNode* CircleList_Current(CircleList* list)
{
TCircleList *tList = (TCircleList *)list;
CircleListNode* ret = NULL;
if (list != NULL) {
ret = tList->silder;
}
return ret;
}
// 將原始游標(biāo)所指結(jié)點(diǎn)返回給上層,然后讓游標(biāo)移到下一個(gè)結(jié)點(diǎn)
CircleListNode* CircleList_Next(CircleList* list)
{
TCircleList *tList = (TCircleList *)list;
CircleListNode* ret = NULL;
if (list != NULL && tList->silder != NULL) {
ret = tList->silder;
tList->silder = ret->next;
}
return ret;
}
joseph.h
// 用循環(huán)鏈表API求解約瑟夫問題
#include <cstdio>
#include "circlelist.h"
const int maxp = 8;
struct Person
{
CircleListNode circlenode;
int id;
};
void joseph()
{
Person s[maxp];
for (int i = 0; i < maxp; ++i) {
s[i].id = i + 1;
}
CircleList *list = NULL;
list = CircleList_Create();
// 插入元素
for (int i = 0; i < maxp; ++i) {
// 尾插法
int ret = CircleList_Insert(list, (CircleListNode *)&s[i], CircleList_Length(list));
if (ret < 0) {
printf("function CircleList_Insert err: %d\n", ret);
}
}
// 遍歷鏈表
for (int i = 0; i < CircleList_Length(list); ++i) {
Person *tmp = (Person *)CircleList_Get(list, i);
if (tmp == NULL) {
printf("function CircleList_Get err.\n");
}
printf("age: %d\n", tmp->id);
}
// 求解約瑟夫問題
while (CircleList_Length(list) > 0)
{
Person* pv = NULL;
for (int i = 1; i < 3; i++)
{
CircleList_Next(list);
}
pv = (Person*)CircleList_Current(list);
printf("%d ", pv->id);
CircleList_DeleteNode(list, (CircleListNode *)pv); //根據(jù)結(jié)點(diǎn)的值,進(jìn)行結(jié)點(diǎn)元素的刪除
}
printf("\n");
CircleList_Destroy(list);
}
main.cpp
// 循環(huán)鏈表測(cè)試程序
#include <iostream>
#include <cstdio>
#include "circlelist.h"
#include "joseph.h"
const int maxn = 5;
struct Student
{
CircleListNode circlenode;
char name[32];
int age;
};
void play01()
{
Student s[maxn];
for (int i = 0; i < maxn; ++i) {
s[i].age = i + 1;
}
CircleList *list = NULL;
list = CircleList_Create(); // 創(chuàng)建鏈表
// 插入元素
for (int i = 0; i < maxn; ++i) {
// 尾插法
int ret = CircleList_Insert(list, (CircleListNode *)&s[i], CircleList_Length(list));
if (ret < 0) {
printf("function CircleList_Insert err: %d\n", ret);
}
}
// 遍歷鏈表
// 這里遍歷打印兩邊,可以證明這是一個(gè)循環(huán)鏈表
for (int i = 0; i < 2 * CircleList_Length(list); ++i) {
Student *tmp = (Student *)CircleList_Get(list, i);
if (tmp == NULL) {
printf("function CircleList_Get err.\n");
}
printf("age: %d\n", tmp->age);
}
// 刪除結(jié)點(diǎn),通過結(jié)點(diǎn)位置
while (CircleList_Length(list)) {
Student *tmp = (Student *)CircleList_Delete(list, CircleList_Length(list) - 1);
if (tmp == NULL) {
printf("function CircleList_Delete err.\n");
}
printf("age: %d\n", tmp->age);
}
// 銷毀鏈表
CircleList_Destroy(list);
}
int main()
{
play01(); // 為了測(cè)試數(shù)據(jù)的生命周期,所以另寫一個(gè)函數(shù)調(diào)用運(yùn)行
joseph();
return 0;
}
雙向鏈表設(shè)計(jì)與API實(shí)現(xiàn)
為什么需要雙向鏈表?
- 單鏈表的結(jié)點(diǎn)都只有一個(gè)指向下一個(gè)結(jié)點(diǎn)的指針
- 單鏈表的數(shù)據(jù)元素?zé)o法直接訪問其前驅(qū)元素
- 逆序訪問單鏈表中的元素是極其耗時(shí)的操作!
雙向鏈表的定義
在單鏈表的結(jié)點(diǎn)中增加一個(gè)指向其前驅(qū)的pre指針
雙向鏈表擁有單鏈表的所有操作
- 創(chuàng)建鏈表
- 銷毀鏈表
- 獲取鏈表長(zhǎng)度
- 清空鏈表
- 獲取第pos個(gè)元素操作
- 插入元素到位置pos
- 刪除位置pos處的元素
插入操作
插入操作異常處理
插入第一個(gè)元素異常處理
在0號(hào)位置處插入元素;
刪除操作
雙向鏈表的新操作
- 獲取當(dāng)前游標(biāo)指向的數(shù)據(jù)元素
- 將游標(biāo)重置指向鏈表中的第一個(gè)數(shù)據(jù)元素
- 將游標(biāo)移動(dòng)指向到鏈表中的下一個(gè)數(shù)據(jù)元素
- 將游標(biāo)移動(dòng)指向到鏈表中的上一個(gè)數(shù)據(jù)元素
- 直接指定刪除鏈表中的某個(gè)數(shù)據(jù)元素
雙向鏈表重要技術(shù)場(chǎng)景
循環(huán)鏈表插入結(jié)點(diǎn)技術(shù)場(chǎng)景
循環(huán)鏈表刪除結(jié)點(diǎn)技術(shù)場(chǎng)景
優(yōu)點(diǎn):雙向鏈表在單鏈表的基礎(chǔ)上增加了指向前驅(qū)的指針
功能上雙向鏈表可以完全取代單鏈表的使用
雙向鏈表的Next,Pre和Current操作可以高效的遍歷鏈表中的所有元素
缺點(diǎn):代碼復(fù)雜
代碼示例:
dlinklist.h
// 雙向鏈表API聲明
#ifndef _DLINKLIST_H_
#define _DLINKLIST_H_
typedef void DLinkList;
typedef struct _tag_DLinkListNode
{
_tag_DLinkListNode *next;
_tag_DLinkListNode *pre;
}DLinkListNode;
// 創(chuàng)建鏈表
DLinkList* DLinkList_Create();
// 銷毀鏈表
void DLinkList_Destroy(DLinkList *list);
// 清空鏈表
void DLinkList_Clear(DLinkList *list);
// 獲取鏈表長(zhǎng)度
int DLinkList_Length(DLinkList *list);
// 在pos位置,插入結(jié)點(diǎn)node
int DLinkList_Insert(DLinkList *list, DLinkListNode *node, int pos);
// 獲取pos位置的結(jié)點(diǎn),返回給上層
DLinkListNode* DLinkList_Get(DLinkList *list, int pos);
// 刪除pos位置的結(jié)點(diǎn)
DLinkListNode* DLinkList_Delete(DLinkList *list, int pos);
// 刪除值為node的結(jié)點(diǎn)
DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node);
// 重置游標(biāo)
DLinkListNode* DLinkList_Reset(DLinkList* list);
// 獲取當(dāng)前游標(biāo)所指的結(jié)點(diǎn)
DLinkListNode* DLinkList_Current(DLinkList* list);
// 獲取游標(biāo)當(dāng)前所指結(jié)點(diǎn),然后讓游標(biāo)指向下一個(gè)結(jié)點(diǎn)
DLinkListNode* DLinkList_Next(DLinkList* list);
// 獲取游標(biāo)當(dāng)前所指結(jié)點(diǎn),然后讓游標(biāo)指向前一個(gè)結(jié)點(diǎn)
DLinkListNode* DLinkList_Pre(DLinkList* list);
#endif
dlinklist.cpp
// 循環(huán)鏈表API實(shí)現(xiàn)
#include <cstdio>
#include <malloc.h>
#include "dlinklist.h"
typedef struct _tag_DLinkList
{
DLinkListNode header;
DLinkListNode *slider;
int length;
}TDLinkList;
// 創(chuàng)建鏈表
DLinkList* DLinkList_Create()
{
TDLinkList *ret = (TDLinkList *)malloc(sizeof(TDLinkList));
if (ret != NULL) {
ret->header.next = NULL;
ret->header.pre = NULL;
ret->slider = NULL;
ret->length = 0;
}
return ret;
}
// 銷毀鏈表
void DLinkList_Destroy(DLinkList *list)
{
if (list != NULL) {
free(list);
}
return;
}
// 清空鏈表
void DLinkList_Clear(DLinkList *list)
{
TDLinkList *tList = (TDLinkList *)list;
if (tList != NULL) {
tList->header.next = NULL;
tList->header.pre = NULL;
tList->slider = NULL;
tList->length = 0;
}
return;
}
// 獲取鏈表長(zhǎng)度
int DLinkList_Length(DLinkList *list)
{
TDLinkList *tList = (TDLinkList *)list;
int ret = -1;
if (tList != NULL) {
ret = tList->length;
}
return ret;
}
// 在pos位置,插入結(jié)點(diǎn)node
int DLinkList_Insert(DLinkList *list, DLinkListNode *node, int pos)
{
TDLinkList *tList = (TDLinkList *)list;
int ret = -1, i = 0;
if (list != NULL && node != NULL && pos >= 0)
{
ret = 0;
DLinkListNode *cur = (DLinkListNode *)tList;
DLinkListNode *next = NULL;
for (i = 0; i < pos && cur->next != NULL; ++i) {
cur = cur->next;
}
next = cur->next;
cur->next = node;
node->next = next;
// 當(dāng)鏈表插入第一個(gè)結(jié)點(diǎn)時(shí)需要進(jìn)行特殊處理
if (next != NULL) {
next->pre = node;
}
node->pre = cur;
if (tList->length == 0) {
tList->slider = node; // 當(dāng)鏈表插入第一個(gè)元素處理游標(biāo)
}
// 若在0位置插入,需要特殊處理,新來的結(jié)點(diǎn)next前pre指向NULL
if (cur == (DLinkListNode *)tList) {
node->pre = NULL;
}
++tList->length;
}
return ret;
}
// 獲取pos位置的結(jié)點(diǎn),返回給上層
DLinkListNode* DLinkList_Get(DLinkList *list, int pos)
{
TDLinkList *tList = (TDLinkList *)list;
DLinkListNode* ret = NULL;
int i = 0;
if (list != NULL && pos >= 0 && pos < tList->length) {
DLinkListNode *cur = (DLinkListNode *)tList;
for (i = 0; i < pos; ++i) {
cur = cur->next;
}
ret = cur->next;
}
return ret;
}
// 刪除pos位置的結(jié)點(diǎn)
DLinkListNode* DLinkList_Delete(DLinkList *list, int pos)
{
TDLinkList *tList = (TDLinkList *)list;
DLinkListNode* ret = NULL;
int i = 0;
if (tList != NULL && pos >= 0) {
DLinkListNode *cur = (DLinkListNode *)tList;
DLinkListNode *next = NULL;
for (i = 0; i < pos && cur->next != NULL; ++i) {
cur = cur->next;
}
ret = cur->next;
next = ret->next;
cur->next = next;
if (next != NULL) {
next->pre = cur;
if (cur == (DLinkListNode *)tList) { // 第0個(gè)位置,需要特殊處理
next->pre = NULL;
}
}
if (tList->slider == ret) {
tList->slider = next;
}
--tList->length;
}
return ret;
}
// 刪除值為node的結(jié)點(diǎn)
DLinkListNode* DLinkList_DeleteNode(DLinkList* list, DLinkListNode* node)
{
TDLinkList *tList = (TDLinkList *)list;
DLinkListNode* ret = NULL;
int i = 0;
if (tList != NULL) {
DLinkListNode *cur = (DLinkListNode *)tList;
for (i = 0; i < DLinkList_Length(tList); ++i) {
if (cur->next == node) {
ret = cur->next;
break;
}
cur = cur->next;
}
if (!ret) {
DLinkList_Delete(tList, i);
}
}
return ret;
}
// 重置游標(biāo)
DLinkListNode* DLinkList_Reset(DLinkList* list)
{
TDLinkList *tList = (TDLinkList *)list;
DLinkListNode* ret = NULL;
if (tList != NULL) {
tList->slider = tList->header.next;
ret = tList->slider;
}
return ret;
}
// 獲取當(dāng)前游標(biāo)所指的結(jié)點(diǎn)
DLinkListNode* DLinkList_Current(DLinkList* list)
{
TDLinkList *tList = (TDLinkList *)list;
DLinkListNode* ret = NULL;
if (tList != NULL) {
ret = tList->slider;
}
return ret;
}
// 獲取游標(biāo)當(dāng)前所指結(jié)點(diǎn),然后讓游標(biāo)指向下一個(gè)結(jié)點(diǎn)
DLinkListNode* DLinkList_Next(DLinkList* list)
{
TDLinkList *tList = (TDLinkList *)list;
DLinkListNode* ret = NULL;
if (tList != NULL && tList->slider != NULL) {
ret = tList->slider;
tList->slider = ret->next;
}
return ret;
}
// 獲取游標(biāo)當(dāng)前所指結(jié)點(diǎn),然后讓游標(biāo)指向前一個(gè)結(jié)點(diǎn)
DLinkListNode* DLinkList_Pre(DLinkList* list)
{
TDLinkList *tList = (TDLinkList *)list;
DLinkListNode* ret = NULL;
if (tList != NULL && tList->slider != NULL) {
ret = tList->slider;
tList->slider = ret->pre;
}
return ret;
}
main.cpp
// 循環(huán)線表測(cè)試程序
#include <cstdio>
#include "dlinklist.h"
const int maxn = 5;
struct Student
{
DLinkListNode node;
int age;
};
void play()
{
Student s[maxn];
for (int i = 0; i < maxn; ++i) {
s[i].age = i + 21;
}
DLinkList *list = NULL;
list = DLinkList_Create(); // 創(chuàng)建鏈表
// 插入結(jié)點(diǎn)
for (int i = 0; i < maxn; ++i) {
int ret = DLinkList_Insert(list, (DLinkListNode *)&s[i], DLinkList_Length(list));
if (ret < 0) {
return;
printf("function DLinkList_Insert err.\n");
}
}
// 遍歷鏈表
for (int i = 0; i < DLinkList_Length(list); ++i) {
Student *tmp = (Student *)DLinkList_Get(list, i);
if (tmp == NULL) {
printf("function DLinkList_Get err.\n");
return;
}
printf("age: %d\n", tmp->age);
}
DLinkList_Delete(list, DLinkList_Length(list) - 1); // 刪除尾結(jié)點(diǎn)
DLinkList_Delete(list, 0); // 刪除頭結(jié)點(diǎn)
// 用游標(biāo)遍歷鏈表
for (int i = 0; i < DLinkList_Length(list); ++i) {
Student *tmp = (Student *)DLinkList_Next(list);
if (tmp == NULL) {
printf("function DLinkList_Next err.\n");
return;
}
printf("age: %d\n", tmp->age);
}
printf("\n");
DLinkList_Reset(list);
DLinkList_Next(list);
Student *tmp = (Student *)DLinkList_Current(list);
if (tmp == NULL) {
printf("function DLinkList_Current err.\n");
return;
}
printf("age: %d\n", tmp->age);
DLinkList_DeleteNode(list, (DLinkListNode*)tmp);
tmp = (Student *)DLinkList_Current(list);
if (tmp == NULL) {
printf("function DLinkList_Current err.\n");
return;
}
printf("age: %d\n", tmp->age);
printf("length: %d\n", DLinkList_Length(list));
DLinkList_Pre(list);
tmp = (Student *)DLinkList_Current(list);
if (tmp == NULL) {
printf("function DLinkList_Current err.\n");
return;
}
printf("age: %d\n", tmp->age);
printf("length: %d\n", DLinkList_Length(list));
DLinkList_Destroy(list);
return;
}
int main()
{
play();
return 0;
}
上一篇:C語言中壓縮字符串的簡(jiǎn)單算法小結(jié)
欄 目:C語言
本文標(biāo)題:深入解析C++的循環(huán)鏈表與雙向鏈表設(shè)計(jì)的API實(shí)現(xiàn)
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/2436.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解約瑟夫環(huán)的數(shù)學(xué)優(yōu)化方法
- 01-10深入二叉樹兩個(gè)結(jié)點(diǎn)的最低共同父結(jié)點(diǎn)的詳解
- 01-10數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)- 解析最少換車次數(shù)的問題詳解
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10深入第K大數(shù)問題以及算法概要的詳解
- 01-10深入解析最長(zhǎng)公共子串
- 01-10c++中inline的用法分析


閱讀排行
- 1C語言 while語句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對(duì)數(shù)函數(shù)的表達(dá)式 c語言中對(duì)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10delphi制作wav文件的方法
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什


