青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

KISS(Keep It Simple, Standard)

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  10 Posts :: 0 Stories :: 24 Comments :: 0 Trackbacks

常用鏈接

留言簿(10)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

2008年2月1日 #


這步還有句要說(shuō)的就是:(在把OPEN表中最優(yōu)值的節(jié)點(diǎn)插入 CLOSE表中時(shí)如果在CLOSE表中已經(jīng)存在那就要比較,如果存在的節(jié)點(diǎn)的權(quán)值比要插入的大,就要把存在的替換掉(節(jié)點(diǎn)中所有內(nèi)容),否則就忽略).

第3步:就是重復(fù)第2步驟(示例圖如下)

我想因該明白了吧!










好了最后一張完工!

終點(diǎn)(12節(jié)點(diǎn))找到了是吧!我想因該明白了吧!
posted @ 2008-02-01 17:09 QUIRE-0216 閱讀(1301) | 評(píng)論 (4)編輯 收藏

最近做了路徑搜索,看了網(wǎng)上的描述真是晦澀,所以自己就整理下!
圖畫(huà)的不太好, :)
綠色的是節(jié)點(diǎn),紅色的為權(quán)值,箭頭為可通行的標(biāo)志.

現(xiàn)在我們要從 0 節(jié)點(diǎn) 到 12 節(jié)點(diǎn) 找一條最優(yōu)路徑:
首先咱們要解決NODE點(diǎn)存貯的信息(結(jié)構(gòu)):
struct NodeBaseInfo
{
   unsigned short nNodeID;   //番號(hào)
   unsigned long  nMeasure;            //權(quán)值
   NodeBaseInfo *pParent;            //父節(jié)點(diǎn)
};

我寫(xiě)了簡(jiǎn)單的結(jié)構(gòu)大家可以根據(jù)自己需要定義(定義這個(gè)結(jié)構(gòu)是為了更好理解)
下面講的是最主要的了:
DIJKSTAR算法中要定義兩個(gè)表:OPEN 和 CLOSE  (其實(shí)可以看作鏈表)
他的原理就是把沒(méi)有遍歷的點(diǎn)放在 OPEN 表中,把從 OPEN表中遍歷到的最短權(quán)值的點(diǎn)放入
CLOSE 表中,當(dāng)插入 CLOSE表中的節(jié)點(diǎn)的番號(hào)于我們要的重點(diǎn)時(shí)算法結(jié)束;然后按照父節(jié)點(diǎn)(pParent)
向上遞歸就可以得到我們要的最優(yōu)路徑了。

第一步:應(yīng)為 OPEN 和CLOSE表都是空的,把起點(diǎn)(0節(jié)點(diǎn))插入CLOSE標(biāo)中,它的權(quán)值為0。把起點(diǎn)(0節(jié)點(diǎn))附近的節(jié)點(diǎn)(因該為可通行的)插入OPEN 表中(最好按權(quán)值從大道小的順序插入,這樣取得最優(yōu)值時(shí),這樣速度就會(huì)很快)。(如示例圖)

第2步:從OPEN表中找到權(quán)值最小的節(jié)點(diǎn),把它插入CLOSE 表中, 把這個(gè)節(jié)點(diǎn)的可連通的節(jié)點(diǎn)查入OPEN
表,(如果OPEN表中存在要查入的點(diǎn),如果要插入的節(jié)點(diǎn)的權(quán)值比已經(jīng)存在的小,就把已經(jīng)查入的權(quán)值該為最小的,如果要插入的節(jié)點(diǎn)的權(quán)值比已經(jīng)存在的大,就忽落它.)
(為了更好的理解我把父節(jié)點(diǎn)也加入了,如示例圖)

posted @ 2008-02-01 16:13 QUIRE-0216 閱讀(3916) | 評(píng)論 (12)編輯 收藏

2008年1月23日 #

本算法只采用移位、加減法、判斷和循環(huán)實(shí)現(xiàn),因?yàn)樗恍枰↑c(diǎn)運(yùn)算,也不需要乘除運(yùn)算,因此可以很方便地運(yùn)用到各種芯片上去。

我們先來(lái)看看10進(jìn)制下是如何手工計(jì)算開(kāi)方的。
先看下面兩個(gè)算式,
x = 10*p + q  (1)
公式(1)左右平方之后得:
x^2 = 100*p^2 + 20pq + q^2 (2)
現(xiàn)在假設(shè)我們知道x^2和p,希望求出q來(lái),求出了q也就求出了x^2的開(kāi)方x了。
我們把公式(2)改寫(xiě)為如下格式:
q = (x^2 - 100*p^2)/(20*p+q) (3)

這個(gè)算式左右都有q,因此無(wú)法直接計(jì)算出q來(lái),因此手工的開(kāi)方算法和手工除法算法一樣有一步需要猜值。

我們來(lái)一個(gè)手工計(jì)算的例子:計(jì)算1234567890的開(kāi)方

首先我們把這個(gè)數(shù)兩位兩位一組分開(kāi),計(jì)算出最高位為3。也就是(3)中的p,最下面一行的334為余數(shù),也就是公式(3)中的(x^2 - 100*p^2)近似值
    3
  ---------------
 / 12 34 56 78 90
    9
  ---------------
 /  3 34

下面我們要找到一個(gè)0-9的數(shù)q使它最接近滿(mǎn)足公式(3)。我們先把p乘以20寫(xiě)在334左邊:
                           3  q
                         ---------------
                        / 12 34 56 78 90
                           9
                         ---------------
(20*3+q)*q      /  3 34

我們看到q為5時(shí)(60+q)*q的值最接近334,而且不超過(guò)334。于是我們得到:
      3  5
    ---------------
   / 12 34 56 78 90
      9
    ---------------
65 /  3 34
      3 25
    ---------------
         9 56

接下來(lái)就是重復(fù)上面的步驟了,這里就不再啰嗦了。

這個(gè)手工算法其實(shí)和10進(jìn)制關(guān)系不大,因此我們可以很容易的把它改為二進(jìn)制,改為二進(jìn)制之后,公式(3)就變成了:
q = (x^2 - 4*p^2)/(4*p+q) (4)

我們來(lái)看一個(gè)例子,計(jì)算100(二進(jìn)制1100100)的開(kāi)方:
       1  0  1  0
      -----------
     / 1 10 01 00
       1
      -----------
 100 / 0 10
       0 00
      -----------
1001 /   10 01
         10 01
      -----------
          0 00

這里每一步不再是把p乘以20了,而是把p乘以4,也就是把p右移兩位,而由于q的值只能為0或者1,所以我們只需要判斷余數(shù)(x^2 - 4*p^2)和(4*p+1)的大小關(guān)系,如果余數(shù)大于等于(4*p+q)那么該上一個(gè)1,否則該上一個(gè)0。

下面給出完成的C語(yǔ)言程序,其中root表示p,rem表示每步計(jì)算之后的余數(shù),divisor表示(4*p+1),通過(guò)a>>30取a的最高 2位,通過(guò)a<<=2將計(jì)算后的最高2位剔除。其中root的兩次<<1相當(dāng)于4*p。程序完全是按照手工計(jì)算改寫(xiě)的,應(yīng)該不難理解。
unsigned short sqrt(unsigned long a){
  unsigned long rem = 0;
  unsigned long root = 0;
  unsigned long divisor = 0;
  for(int i=0; i<16; ++i){
    root <<= 1;
    rem = ((rem << 2) + (a >> 30));
    a <<= 2;
    divisor = (root<<1) + 1;
    if(divisor <= rem){
      rem -= divisor;
      root++;
    }
  }
  return (unsigned short)(root);
}

posted @ 2008-01-23 14:21 QUIRE-0216 閱讀(5292) | 評(píng)論 (1)編輯 收藏

2007年8月30日 #

void TransparentBlt(CDC *pDestDC, int nXDest, int nYDest, int nWidth, int nHeight, CBitmap * pBitmap, int nXsrc, int nYsrc, COLORREF clr)
{
 CDC maskDC, ImageDC;
 maskDC.CreateCompatibleDC(pDestDC);
 ImageDC.CreateCompatibleDC(pDestDC);

 CBitmap maskBMP;
 maskBMP.CreateBitmap(nWidth, nHeight, 1, 1, NULL);//創(chuàng)建單色掩碼位圖
 CBitmap *pOldBMP = ImageDC.SelectObject(pBitmap);
 CBitmap *maskOldBMP = maskDC.SelectObject(&maskBMP);
 
 ImageDC.SetBkColor(clr);// 設(shè)置透明色
 maskDC.BitBlt(0, 0, nWidth, nHeight, &ImageDC, nXsrc, nYsrc, SRCCOPY);

 //設(shè)置背景色為黑色,前景色為白色,將掩碼位圖與原位圖相"與"
 ImageDC.SetBkColor(RGB(0, 0, 0));
 ImageDC.SetTextColor(RGB(255, 255, 255));
 ImageDC.BitBlt(0, 0, nWidth, nHeight, &maskDC, nXsrc, nYsrc, SRCAND);

 //設(shè)置背景色為白色,前景色為黑色,將掩碼位圖與背景進(jìn)行“與”運(yùn)算
 pDestDC->SetBkColor(RGB(255, 255, 255));
 pDestDC->SetTextColor(RGB(0, 0, 0));
 pDestDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &maskDC, nXsrc, nYsrc, SRCAND);
 // "或"運(yùn)算,生成最終效果
 pDestDC->BitBlt(nXDest, nYDest, nWidth, nHeight, &ImageDC, nXsrc, nYsrc, SRCPAINT);

 if (pOldBMP) ImageDC.SelectObject(pOldBMP);
 ImageDC.DeleteDC();
 if (maskOldBMP) maskDC.SelectObject(maskOldBMP);
 maskDC.DeleteDC();
 if (maskBMP.m_hObject) maskBMP.DeleteObject();
}

我就不怎么解釋了!如不理解,請(qǐng)看我轉(zhuǎn)的(透明位圖的顯示中的(二、實(shí)現(xiàn)TransparentBlt函數(shù))的原理),其他部分都就什么必要了!呵呵!
posted @ 2007-08-30 17:05 QUIRE-0216 閱讀(561) | 評(píng)論 (2)編輯 收藏

包含透明色的位圖的繪制方法有多種,最簡(jiǎn)單的方法是調(diào)用現(xiàn)成的函數(shù):TransparentBlt,也可以通過(guò)自己的代碼實(shí)現(xiàn)類(lèi)似 TransparentBlt的功能,實(shí)現(xiàn)過(guò)程也有兩種形式,一種是事先做一張掩碼位圖,另一種是動(dòng)態(tài)生成掩碼位圖。本文將介紹動(dòng)態(tài)生成掩碼位圖繪制具有透明區(qū)域位圖的方法。

一、TransparentBlt 函數(shù)的使用

TransparentBlt 函數(shù)在Windows98/Windows2000以上版本運(yùn)行,系統(tǒng)中需要包含 Msimg32.dll,使用時(shí)可以鏈接 Msimg32.lib。
Windows98下的TransparentBlt會(huì)產(chǎn)生資源泄漏,所以不建議在WIN98下使用該函數(shù)。
TransparentBlt函數(shù)原型如下:

BOOL TransparentBlt(
HDC hdcDest,      // 目標(biāo)DC
int nXOriginDest,   // 目標(biāo)X偏移
int nYOriginDest,   // 目標(biāo)Y偏移
int nWidthDest,     // 目標(biāo)寬度
int hHeightDest,    // 目標(biāo)高度
HDC hdcSrc,         // 源DC
int nXOriginSrc,    // 源X起點(diǎn)
int nYOriginSrc,    // 源Y起點(diǎn)
int nWidthSrc,      // 源寬度
int nHeightSrc,     // 源高度
UINT crTransparent  // 透明色,COLORREF類(lèi)型
);
使用示例:
CBitmap FootballBMP;
FootballBMP.LoadBitmap(IDB_FOOTBALLBMP);
CDC ImageDC;
ImageDC.CreateCompatibleDC(pDC);
CBitmap *pOldImageBMP = ImageDC.SelectObject(&FootballBMP);
TransparentBlt(pDC->m_hDC, 0, 0, 218, 199, ImageDC.m_hDC, 0, 0, 218, 199, RGB(0,0,0xff));
ImageDC.SelectObject(pOldImageBMP);
二、實(shí)現(xiàn)TransparentBlt函數(shù)

為了理解具有透明色位圖的繪制過(guò)程,我們來(lái)親手建立一個(gè)具有同TransparentBlt功能一致的實(shí)驗(yàn)函數(shù),稱(chēng)之為T(mén)ransparentBlt2。

實(shí)驗(yàn)素材:有兩張位圖:bk.bmp是背景位圖,football.bmp包含透明區(qū)域,透明色為藍(lán)色RGB(0,0,0xff)
實(shí)驗(yàn)?zāi)康模阂詁k.bmp為背景,將football.bmp繪制到背景中,形成如下的最終效果圖。

 



2.1 透明位圖繪制原理
假設(shè)football.bmp ->載入 HBITMAP hImageBMP -> 選入 HDC hImageDC

2.1.1 生成足球的單色掩碼位圖,透明區(qū)域?yàn)榘咨ㄈ?),非透明區(qū)域?yàn)楹谏ㄈ?)
HBITMAP hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 建立單色位圖
SetBkColor(hImageDC, RGB(0,0,0xff)); // 設(shè)置背景色為藍(lán)色
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY); // 拷貝到hMaskDC
這樣足球位圖中藍(lán)色區(qū)域在掩碼位圖中成了白色,其它區(qū)域?yàn)楹谏藭r(shí)hMaskBMP 如下圖:
(圖一)

2.1.2 設(shè)置背景色為黑色,前景色為白色,將掩碼位圖(圖一)與足球位圖相"與"
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
這樣,掩碼位圖中背景色(黑色)的區(qū)域在hImageBMP中被保留,前景色(白色)的部分變?yōu)楹谏?此時(shí)hImageBMP 如下圖:
(圖二)

2.1.3 設(shè)置背景色為白色,前景色為黑色,將掩碼位圖(圖一)與背景進(jìn)行“與”運(yùn)算
SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
掩碼中白色區(qū)域(數(shù)據(jù)與1相“與”結(jié)果不變)使背景保持不變,黑色區(qū)域變成黑色,此時(shí)背景顯示如下:
(圖三)

2.1.4 將hImageBMP(圖二)與背景(圖三)進(jìn)行“或”運(yùn)算
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
這樣就將足球繪制到背景上了。

2.2 TransparentBlt2函數(shù)全部實(shí)現(xiàn)代碼
void TransparentBlt2( HDC hdcDest,      // 目標(biāo)DC
int nXOriginDest,   // 目標(biāo)X偏移
int nYOriginDest,   // 目標(biāo)Y偏移
int nWidthDest,     // 目標(biāo)寬度
int nHeightDest,    // 目標(biāo)高度
HDC hdcSrc,         // 源DC
int nXOriginSrc,    // 源X起點(diǎn)
int nYOriginSrc,    // 源Y起點(diǎn)
int nWidthSrc,      // 源寬度
int nHeightSrc,     // 源高度
UINT crTransparent  // 透明色,COLORREF類(lèi)型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest);	// 創(chuàng)建兼容位圖
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL);			// 創(chuàng)建單色掩碼位圖
HDC		hImageDC = CreateCompatibleDC(hdcDest);
HDC		hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);
// 將源DC中的位圖拷貝到臨時(shí)DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);
// 設(shè)置透明色
SetBkColor(hImageDC, crTransparent);
// 生成透明區(qū)域?yàn)榘咨渌鼌^(qū)域?yàn)楹谏难诖a位圖
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);
// 生成透明區(qū)域?yàn)楹谏渌鼌^(qū)域保持不變的位圖
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// 透明部分保持屏幕不變,其它部分變成黑色
SetBkColor(hdcDest,RGB(255,255,255));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);
// "或"運(yùn)算,生成最終效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);
// 清理、恢復(fù)
SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);
}
2.3 TransparentBlt的另外一個(gè)版本:TransparentBltU

TransparentBltU是Christian Graus 在WinDEV發(fā)表的一個(gè)函數(shù),功能與TransparentBlt一致,以下是全部實(shí)現(xiàn)代碼:
bool TransparentBltU(
HDC dcDest,         // handle to Dest DC
int nXOriginDest,   // x-coord of destination upper-left corner
int nYOriginDest,   // y-coord of destination upper-left corner
int nWidthDest,     // width of destination rectangle
int nHeightDest,    // height of destination rectangle
HDC dcSrc,          // handle to source DC
int nXOriginSrc,    // x-coord of source upper-left corner
int nYOriginSrc,    // y-coord of source upper-left corner
int nWidthSrc,      // width of source rectangle
int nHeightSrc,     // height of source rectangle
UINT crTransparent  // color to make transparent
)
{
if (nWidthDest < 1) return false;
if (nWidthSrc < 1) return false;
if (nHeightDest < 1) return false;
if (nHeightSrc < 1) return false;
HDC dc = CreateCompatibleDC(NULL);
HBITMAP bitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, GetDeviceCaps(dc,
BITSPIXEL), NULL);
if (bitmap == NULL)
{
DeleteDC(dc);
return false;
}
HBITMAP oldBitmap = (HBITMAP)SelectObject(dc, bitmap);
if (!BitBlt(dc, 0, 0, nWidthSrc, nHeightSrc, dcSrc, nXOriginSrc,
nYOriginSrc, SRCCOPY))
{
SelectObject(dc, oldBitmap);
DeleteObject(bitmap);
DeleteDC(dc);
return false;
}
HDC maskDC = CreateCompatibleDC(NULL);
HBITMAP maskBitmap = CreateBitmap(nWidthSrc, nHeightSrc, 1, 1, NULL);
if (maskBitmap == NULL)
{
SelectObject(dc, oldBitmap);
DeleteObject(bitmap);
DeleteDC(dc);
DeleteDC(maskDC);
return false;
}
HBITMAP oldMask =  (HBITMAP)SelectObject(maskDC, maskBitmap);
SetBkColor(maskDC, RGB(0,0,0));
SetTextColor(maskDC, RGB(255,255,255));
if (!BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,NULL,0,0,BLACKNESS))
{
SelectObject(maskDC, oldMask);
DeleteObject(maskBitmap);
DeleteDC(maskDC);
SelectObject(dc, oldBitmap);
DeleteObject(bitmap);
DeleteDC(dc);
return false;
}
SetBkColor(dc, crTransparent);
BitBlt(maskDC, 0,0,nWidthSrc,nHeightSrc,dc,0,0,SRCINVERT);
SetBkColor(dc, RGB(0,0,0));
SetTextColor(dc, RGB(255,255,255));
BitBlt(dc, 0,0,nWidthSrc,nHeightSrc,maskDC,0,0,SRCAND);
HDC newMaskDC = CreateCompatibleDC(NULL);
HBITMAP newMask;
newMask = CreateBitmap(nWidthDest, nHeightDest, 1,
GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);
if (newMask == NULL)
{
SelectObject(dc, oldBitmap);
DeleteDC(dc);
SelectObject(maskDC, oldMask);
DeleteDC(maskDC);
DeleteDC(newMaskDC);
DeleteObject(bitmap);
DeleteObject(maskBitmap);
return false;
}
SetStretchBltMode(newMaskDC, COLORONCOLOR);
HBITMAP oldNewMask = (HBITMAP) SelectObject(newMaskDC, newMask);
StretchBlt(newMaskDC, 0, 0, nWidthDest, nHeightDest, maskDC, 0, 0,
nWidthSrc, nHeightSrc, SRCCOPY);
SelectObject(maskDC, oldMask);
DeleteDC(maskDC);
DeleteObject(maskBitmap);
HDC newImageDC = CreateCompatibleDC(NULL);
HBITMAP newImage = CreateBitmap(nWidthDest, nHeightDest, 1,
GetDeviceCaps(newMaskDC, BITSPIXEL), NULL);
if (newImage == NULL)
{
SelectObject(dc, oldBitmap);
DeleteDC(dc);
DeleteDC(newMaskDC);
DeleteObject(bitmap);
return false;
}
HBITMAP oldNewImage = (HBITMAP)SelectObject(newImageDC, newImage);
StretchBlt(newImageDC, 0, 0, nWidthDest, nHeightDest, dc, 0, 0, nWidthSrc,
nHeightSrc, SRCCOPY);
SelectObject(dc, oldBitmap);
DeleteDC(dc);
DeleteObject(bitmap);
BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
newMaskDC, 0, 0, SRCAND);
BitBlt( dcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest,
newImageDC, 0, 0, SRCPAINT);
SelectObject(newImageDC, oldNewImage);
DeleteDC(newImageDC);
SelectObject(newMaskDC, oldNewMask);
DeleteDC(newMaskDC);
DeleteObject(newImage);
DeleteObject(newMask);
return true;
}

說(shuō)明:本文提供的TransparentBlt2函數(shù)旨在說(shuō)明透明位圖的顯示原理,在Windows2000以上環(huán)境實(shí)際運(yùn)用中建議使用現(xiàn)成的TransparentBlt函數(shù)來(lái)繪制透明位圖。
posted @ 2007-08-30 16:52 QUIRE-0216 閱讀(935) | 評(píng)論 (1)編輯 收藏

2007年8月24日 #

#ifndef _DOUBLE_H_
#define _DOUBLE_H_

template<class T>
class Double;

template<class T>
class DoubleNode
{
 friend class Double<T>;
private:
 T data;
 DoubleNode<T> *pre;
 DoubleNode<T> *next;
};

template<class T>
class Double
{
 public:
  Double();//{head=end=NULL;}
  ~Double();
  void Erase();
  void reverse();
  int GetLength()const;
  bool IsEmpty()const;
  bool Find(int k, T& x)const;
  int Search(T& x)const;
  Double<T>& Delete(int k, T& x);
  Double<T>& Insert(int k, const T& x);
  void output(ostream& out)const;
  friend ostream& operator << (ostream& out, const Double<T>& x);
 private:
  DoubleNode<T> *head;
  DoubleNode<T> *end;
  int length;
};

template<class T>
Double<T>::Double()
{
 head = new DoubleNode<T>;
 end = new DoubleNode<T>;
 head->pre = NULL;
 head->next = end;
 end->pre = head;
 end->next = NULL;

 length = 0;
}

template<class T>
Double<T>::~Double()
{
 Erase();
}

template<class T>
void Double<T>::Erase()
{
 DoubleNode<T> *current = head;
 while (current)
 {
  head = head->next;
  delete current;
  current = head;
 }
 length = 0;
}

template<class T>
int Double<T>::GetLength()const
{
 return length;
}

template<class T>
bool Double<T>::IsEmpty()const
{
 return length == 0;
}

template<class T>
bool Double<T>::Find(int k, T& x)const
{

 if (length == 0)
 {
  throw exception("DoubleNode is empty!");
 }
 else if(k<1 || k>length)
 {
  throw exception("no find the position of k");
 }

 DoubleNode<T> *current = head->next;
 for (int i=1; (i<k)&&current; ++i)
 {
  current = current->next;
 }

 if (current)
 {
  x = current->data;
  return true;
 }

 return false;
}


template<class T>
int Double<T>::Search(T& x)const
{
 int nIndex = 1;
 DoubleNode<T> *current = head->next;
 while (current && current->data != x)
 {
  ++nIndex;
  current = current->next;
 }

 if (current)
 {
  return nIndex;
 }

 return -1;
}

template<class T>
Double<T>& Double<T>::Delete(int k, T& x)
{
 if (length == 0)
 {
  throw exception("DoubleNode is empty!");
 }
 else if(k<1 || k>length)
 {
  throw exception("no find the position of k, so can't delete!");
 }

 DoubleNode<T> *current = head->next; 
 for (int i=1; (i<k)&&current; ++i)
 {
  current = current->next;
 }

 DoubleNode<T> * p = current;
 current->pre->next = current->next;
 current->next->pre = current->pre;

 x = p->data;
 delete p;
 p = NULL;
 --length;

 return *this;
}


template<class T>
Double<T>& Double<T>::Insert(int k, const T& x)
{
 if (k>=0 && k<= length)
 {
  DoubleNode<T> *newNode = new DoubleNode<T>;
  newNode->data = x;

  DoubleNode<T> *current = head;
  for (int i=0; i<k; ++i)
  {
   current = current->next;
  }

  newNode->pre = current;
  newNode->next = current->next;
  current->next->pre = newNode;
  current->next = newNode;
  
  
  ++length;
 }
 else
 {
  throw exception("no find the position of k, so can't insert!");
 }

 return *this;
}

template<class T>
void Double<T>::output(ostream& out)const
{
 DoubleNode<T> *current = head->next;
 while (current!=end)
 {
  out << current->data << " ";
  current = current->next;
 }
}

template<class T>
ostream& operator<< (ostream& out, const Double<T>& x)
{
 x.output(out);
 return out;
}

template<class T>
void Double<T>::reverse()
{
 DoubleNode<T> *p1 = head;
 DoubleNode<T> *p2 = NULL;
 DoubleNode<T> *pNode;

 while (p1 != NULL)
 {
  pNode = p1;
  pNode->pre = p1->next;
  p1 = p1->next;
  pNode->next = p2;
  p2 = pNode;
 }

 end = head;
 head = p2;
}

#endif

以上為雙鏈表的基本操作,代碼已經(jīng)測(cè)試過(guò)了,可以直接用!
其中,head. end在構(gòu)造函數(shù)時(shí),New了兩個(gè)對(duì)象,是為了Insert 和 Delete操作的方便!
更好的方式是:把指針和數(shù)據(jù)分開(kāi),這樣head,end就可以節(jié)省存貯空間了!
方式如下:
//指針數(shù)據(jù)部分(后續(xù)指針和前驅(qū)指針)
struct Node_base
{
 Node_base *next;
 Node_base *pre;
};

//添加實(shí)際數(shù)據(jù)部分
template <class T>
struct Node : public Node_base
{
 T m_data;
};

posted @ 2007-08-24 17:06 QUIRE-0216 閱讀(1415) | 評(píng)論 (4)編輯 收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区二区三区久久精品| 欧美一区三区二区在线观看| 欧美亚洲在线观看| 亚洲欧洲综合另类| 免费不卡中文字幕视频| 久色成人在线| 欧美电影免费观看网站| 欧美国产三级| 夜夜嗨网站十八久久| 欧美日韩1区2区| 久久综合色播五月| 欧美激情综合色| 亚洲午夜一区| 一区二区三区在线免费视频| 欧美aaa级| 欧美日在线观看| 亚洲视频一区二区| 欧美一区精品| 午夜精品福利电影| 久久成人免费电影| 欧美激情视频在线免费观看 欧美视频免费一 | 久久在线视频| 午夜在线精品偷拍| 老**午夜毛片一区二区三区| 亚洲一区二区网站| 欧美母乳在线| 亚洲电影在线观看| 国产视频一区二区在线观看| 亚洲视频网在线直播| 欧美激情国产日韩精品一区18| 亚洲精品欧美极品| 在线视频一区二区| 久久爱www久久做| 亚洲一区二区三区777| 久久精品视频在线看| 国产精品色婷婷| 一本大道av伊人久久综合| 欧美sm极限捆绑bd| 国产精品99久久久久久宅男| 麻豆亚洲精品| 欧美日韩调教| 亚洲成色777777女色窝| 欧美在线视频日韩| 亚洲亚洲精品在线观看| 免费在线观看日韩欧美| 国产乱码精品一区二区三区忘忧草| 亚洲国产第一页| 亚洲国产小视频| 影音先锋中文字幕一区二区| 亚洲精品视频在线看| 欧美日韩三区四区| 午夜一区不卡| 久久亚洲综合色| 久久久99国产精品免费| 国产精品日韩欧美一区二区三区| 一区二区亚洲精品| 亚洲精品影院| 国产欧美一区二区在线观看| 亚洲日韩成人| 先锋亚洲精品| 亚洲黄色视屏| 免费欧美电影| 久久电影一区| 国内在线观看一区二区三区| 欧美伊人精品成人久久综合97| 久久久久国产精品麻豆ai换脸| 在线亚洲观看| 欧美二区在线| 久久久精品一区| 久久xxxx精品视频| 欧美一区二区国产| 亚洲自拍三区| 国产一区激情| 欧美夫妇交换俱乐部在线观看| 国产精品欧美风情| 欧美日韩福利视频| 亚洲欧美日韩精品一区二区| 亚洲网站视频| 亚洲调教视频在线观看| 性久久久久久| 欧美日韩精品一区视频| 亚洲欧洲在线一区| 国内精品久久久久久影视8| 欧美二区在线| 在线亚洲+欧美+日本专区| 欧美主播一区二区三区美女 久久精品人| 国产原创一区二区| 日韩视频在线观看免费| 亚洲精品日产精品乱码不卡| 久久蜜桃资源一区二区老牛 | 欧美激情国产高清| 在线成人黄色| 老鸭窝亚洲一区二区三区| 亚洲美女av在线播放| 欧美在现视频| 最近看过的日韩成人| 国产精品久久久久久影视| 久久电影一区| 亚洲精品久久久蜜桃| 久久久人成影片一区二区三区观看 | 欧美午夜精彩| 欧美 日韩 国产在线| 久久久久一区| 久久精品九九| 蜜桃久久av一区| 亚洲图片自拍偷拍| 亚洲精品乱码久久久久久| 久久久噜噜噜久久久| 亚洲女与黑人做爰| 久久国产精品网站| 性一交一乱一区二区洋洋av| 好吊色欧美一区二区三区视频| 久久久亚洲高清| 99国产精品久久久久久久| 久久中文精品| 亚洲欧美欧美一区二区三区| 9l国产精品久久久久麻豆| 国产精品视频最多的网站| 一区二区三区色| 亚洲精品1区| 久久精品国产免费| 国产欧美一区二区白浆黑人| 在线亚洲+欧美+日本专区| 欧美在线播放一区二区| 性色av一区二区怡红| 欧美中文日韩| 亚洲宅男天堂在线观看无病毒| 国产免费观看久久黄| …久久精品99久久香蕉国产 | 欧美资源在线观看| 美女视频网站黄色亚洲| 一本色道久久综合亚洲精品不| 欧美在线91| 久久久av网站| 欧美在线影院在线视频| 美女精品自拍一二三四| 亚洲电影在线播放| 一本久道久久久| 午夜精品理论片| 久久久一二三| 欧美日韩一区综合| 一区二区高清视频| 欧美在线观看网站| 欧美激情视频一区二区三区免费| 欧美在线观看一区二区| 精品电影一区| 欧美a级一区二区| 一区二区三区日韩在线观看| 欧美一区二区高清| 在线视频日韩精品| 欧美日韩一区二区在线视频| 欧美精品七区| 亚洲一区观看| 午夜久久美女| 久久精品99久久香蕉国产色戒| 亚洲欧美日韩网| 国产永久精品大片wwwapp| 99综合精品| 亚洲欧洲美洲综合色网| 亚洲第一黄网| 亚洲欧美一区在线| 欧美激情按摩| 一区二区在线观看视频在线观看| 亚洲精品一区二区三区av| 亚洲色图在线视频| 国产婷婷色综合av蜜臀av| 久久久久国产精品一区二区| 欧美成人午夜剧场免费观看| 亚洲视频在线观看视频| 亚洲免费网址| 亚洲精品一区二区三区婷婷月| 亚洲国产老妈| 国产麻豆日韩欧美久久| 久久久国产精品一区二区三区| 久久久777| 亚洲女爱视频在线| 欧美在线一级视频| 国产视频在线观看一区二区| 亚洲久久成人| 欧美影院精品一区| 欧美中文字幕精品| 一区二区三区四区五区精品视频| 亚洲视频在线一区| 亚洲精品美女在线观看播放| 欧美在线观看网址综合| 亚洲天堂偷拍| 欧美久久久久免费| 欧美国产亚洲视频| 狠狠色狠狠色综合日日tαg| 一区二区激情小说| 夜夜嗨av一区二区三区网页| 久久久久久久性| 蜜桃av一区二区三区| 国产精品综合视频| 一区二区毛片| 午夜日本精品| 国产欧美视频一区二区| 亚洲欧美日韩国产综合在线| 香蕉精品999视频一区二区| 国产精品99免费看|