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

萬星星@豌豆莢 歡迎加入我們
一個吃軟飯的男人!!!!!我只想寫程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0

一個學期課程結束,接著去公司改bug。以前做的一個網格控件老是出問題,于是下狠心重新實現一個!

準備實現一個網格數據結構,來存儲網格控件數據。為了以后也可以使用,寫了一個模板類,基本思想是寫3個類:

/********************************************************************
 created: 2006/01/12
 created: 12:1:2006   14:30
 filename:  E:\MyProject\WLWLib\WLWGrid\WLWGrid.h
 file path: E:\MyProject\WLWLib\WLWGrid
 file base: WLWGrid
 file ext: h
 author:  萬連文
 
 purpose: 為了存儲二維網格m×n數據,實現插入刪除訪問
    用鏈表實現,適合大數據量(非海量數據)頻繁插入刪除使用
    不適合稀疏矩陣使用,不適合海量數據,因為稀疏矩陣會浪費
    很多單元格,海量數據會浪費很多單元格里面的指針
*********************************************************************/

// 網格單元類,存儲數據,記錄方位
template<class T>
class WLWGridCell
{
public:
 WLWGridCell(T xData, WLWGridCell* pLeft=0, WLWGridCell* pUp=0, WLWGridCell* pRight=0, WLWGridCell* pDown=0)
 {
  SetData(xData);
  SetLeft(pLeft);
  SetRight(pRight);
  SetUp(pUp);
  SetDown(pDown);
  m_lReserve = 0;
 }
 ~WLWGridCell()
 {
  SetLeft(0);
  SetRight(0);
  SetUp(0);
  SetDown(0);
 }
 // 設置數據
 void   SetData(T xData);

 // 獲得數據
 T    GetData();

 // 設置保留數據
 void   SetReserve(long lReserve);

 // 獲得保數據
 long   GetReserve();
 
 // 設置上方單元
 void   SetUp(WLWGridCell* pUp);

 // 獲得上方單元
 WLWGridCell* GetUp();

 // 設置下方單元
 void   SetDown(WLWGridCell* pDown);

 // 獲得下方單元
 WLWGridCell* GetDown();

 // 設置左方單元
 void   SetLeft(WLWGridCell* pLeft);

 // 獲得左方單元
 WLWGridCell* GetLeft();

 // 設置右方單元
 void   SetRight(WLWGridCell* pRight);

 // 獲得右方單元
 WLWGridCell* GetRight();
private:
 WLWGridCell* m_pUp;  // 上方單元
 WLWGridCell* m_pDown; // 下方單元
 WLWGridCell* m_pLeft; // 左方單元
 WLWGridCell* m_pRight; // 右方單元

 T    m_xData; // 存儲數據
 long   m_lReserve; // 保留數據
};

// 網格行類,存儲一行數據
template<class T>
class WLWGridRow
{
public:
 WLWGridRow(WLWGridRow<T>* pUp=0, WLWGridRow<T>* pDown=0)
 {
  m_pHead  = 0;
  m_pTail  = 0;
  m_pCurr  = 0;
  m_lReserve = 0;
  m_pUp  = pUp;
  m_pDown  = pDown;
 }
 ~WLWGridRow()
 {
  // 銷毀所有網格
  Empty();
 }

 // 獲得當前的行頭指針
 WLWGridCell<T>* GetHead();

 // 獲得當前的行尾指針
 WLWGridCell<T>* GetTail();

 // 設置上一行
 void   SetUpRow(WLWGridRow<T>* pUp);

 // 獲得上一行
 WLWGridRow<T>* GetUpRow();

 // 設置下一行
 void   SetDownRow(WLWGridRow<T>* pDown);

 // 獲得下一行
 WLWGridRow<T>* GetDownRow();

 // 獲得當前的游標指針
 WLWGridCell<T>* GetCurrent();

 // 按照索引獲得單元格
 WLWGridCell<T>* GetCellByIndex(int iIndex);

 // 按照單元格獲得索引,失敗返回-1
 int    GetIndexByCell(WLWGridCell<T>* pCell);

 // 當前指針右移
 void   MoveNext();

 // 當前指針左移
 void   MoveBack();

 // 當前指針行頭
 void   MoveHead();

 // 當前指針行尾
 void   MoveTail();

 // 判斷是否有下一個
 bool   HasNext();

 // 判斷是否有上一個
 bool   HasBack();

 // 判斷是否為空
 bool   IsEmpty();

 // 清空行數據
 void   Empty();

 // 設置保留數據
 void   SetReserve(long lReserve);

 // 獲得保數據
 long   GetReserve();

 // 添加一個單元格,bRight=true表示添加在pos后面
 // 可能修改m_pHead、m_pTail
 // 返回<0表示添加失敗;=0表示已存在;>0表示成功
 int    AddCell(WLWGridCell<T>* pCell, WLWGridCell<T>* pPos, bool bRight=true);
 
 // 添加一個單元格,iIndex是索引,bRight=true表示添加在iIndex后面
 // 可能修改m_pHead、m_pTail
 // 返回<0表示添加失敗;=0表示已存在;>0表示成功
 int    AddCell(WLWGridCell<T>* pCell, int iIndex, bool bRight=true);

 // 刪除指定單元格,可能修改m_pHead、m_pTail、m_pCurr
 void   DelCell(WLWGridCell<T>* pCell);

 // 刪除指定單元格,iIndex是索引,表示單元格的位置
 // 可能修改m_pHead、m_pTail、m_pCurr
 void   DelCell(int iIndex);

 // 查找指定值的單元格,失敗返回-1,否則返回索引
 int    Find(T x);

 // 重載[]運算符
 WLWGridCell<T>* operator[](int iIndex);
private:
 WLWGridCell<T>* m_pHead; // 記錄一行的頭
 WLWGridCell<T>* m_pTail; // 記錄一行的尾
 WLWGridCell<T>* m_pCurr; // 當前游標位置,遍歷的時候使用

 WLWGridRow<T>* m_pUp;  //上一行
 WLWGridRow<T>* m_pDown; //下一行
 long   m_lReserve; // 保留數據
};

// 網格類,實現二維表格結構
template<class T>
class WLWGrid
{
public:
 WLWGrid()
 {
  m_pHead  = 0;
 }
 ~WLWGrid()
 {
  Empty();
 }
 // 獲得頭行
 WLWGridRow<T>* GetHead();

 // 獲得列數
 int    GetCols();

 // 獲得行數
 int    GetRows();

 // 判斷是否為空
 bool   IsEmpty();

 // 清空表格
 void   Empty();

 // 按照索引獲得行
 WLWGridRow<T>* GetRowByIndex(int iIndex);

 // 按照行獲得索引,失敗返回-1
 int    GetIndexByRow(WLWGridRow<T>* pRow);
 
 // 指定位置添加一行,bRight=true表示添加在pos后面
 // 可能修改m_pHead
 // 注意行的單元格數目必須等于Grid的列數,否則不添加
 // 返回<0添加失敗,0已存在,>0添加成功
 int    AddRow(WLWGridRow<T>* pRow, WLWGridRow<T>* pPos, bool bDown=true);
 
 // 指定位置添加一行,iIndex是索引,bRight=true表示添加在pos后面
 // 可能修改m_pHead
 // 注意行的單元格數目必須等于Grid的列數,否則不添加
 // 返回<0添加失敗,0已存在,>0添加成功
 int    AddRow(WLWGridRow<T>* pRow, int iIndex, bool bDown=true);

 // 指定位置添加值為xData的一行,bRight=true表示添加在pos后面
 // 可能修改m_pHead
 void   AddRow(T xData, WLWGridRow<T>* pPos, bool bDown=true);
 
 // 指定位置添加值為xData的一行,iIndex是索引,bRight=true表示添加在pos后面
 // 可能修改m_pHead
 void   AddRow(T xData, int iIndex, bool bDown=true);
 
 // 刪除指定行,可能修改m_pHead
 void   DelRow(WLWGridRow<T>* pRow);

 // 刪除指定索引的行,可能修改m_pHead
 void   DelRow(int iIndex);

 // 指定位置添加值為xData的一列,bRight表示在iIndex索引右面添加,否則在左面添加
 // 添加成功返回true
 bool   AddCol(T xData, int iIndex, bool bRight=true);

 // 刪除下標為iIndex的一列
 void   DelCol(int iIndex);

 // 重載[]運算符
 WLWGridRow<T>* operator[](int iIndex);
private:
 WLWGridRow<T>* m_pHead; // 頭行

 // 更新行單元格的指針,確保兩行長度一致,否則會導致非預期結果(0指針除外)
 void   UpdateRowCellPtr(WLWGridRow<T>* pUp, WLWGridRow<T>* pDown);
};

化了接近一天時間寫完,并經過簡單測試,沒有發現內存泄漏問題。

看測試截圖  表現網格結構

下載網格數據結構及測試代碼

希望大家下載使用,提出建議,報告bug,最重要是內存泄漏問題,謝謝!

posted on 2006-01-13 17:12 萬連文 閱讀(1313) 評論(4)  編輯 收藏 引用 所屬分類: 亂七八糟

FeedBack:
# re: 數據結構之網格實現
2006-01-16 10:36 | 小明
意見來了。

看一個庫的接口好壞,從使用者上看是一個好的角度

你的測試代碼
m_aRow = new WLWGridRow<int>();
m_aRow->AddCell(new WLWGridCell<int>(1), m_aRow->GetTail());
if(m_aGrid.AddRow(m_aRow, m_aGrid.GetHead()) < 0)


1.為什么要new WLWGridCell<int>(0)
這樣是不是更好
m_aRow->AddCell(1, m_aRow->GetTail());

2.如果使用者這樣寫
WLWGridRow<int> wl;
if(m_aGrid.AddRow(&wl, m_aGrid.GetHead()) < 0)
程序會崩潰吧,兩次delete,STL容器使用的方法普遍是copy in,copy out,效率是要付出一些,但是很穩定可靠

如果一定是使用指針傳入,建議可以使用這樣聲明的方式
Class WLWGrid
...
int AddRow(WLWGridRow<T>* &pRow, WLWGridRow<T>* pPos, bool bDown=true)
{
pRow = 0; //avoid delete twice
}

WLWGridRow<T>* &pRow聲明成指針引用的形式,表明你是要代替使用者來管理節點類的生命周期

3.其實使用vector< vector<type*> > 就能很好的實現你的需要,簡單可靠

4.不要把template的實現放在cpp文件中



  回復  更多評論
  
# re: 數據結構之網格實現
2006-01-16 20:26 | 萬連文
非常感謝批評!!
對于1建議非常好,當時由于時間以及個人主觀因素沒有實現
對于2由于現在在公司,沒法看,但是有可能是自己代碼有問題。里面的小技巧很少用,呆會研究一下,謝謝共享技術
對于3我則不認同,如果vector< vector<type*> >可以方便實現我的需求的話我不會花費那么大代價了。其實一般獲取數據是可以滿足的,但是在插入和刪除數據時會非常麻煩(不在尾部的話)。還考慮到移動數據的原因所以采用鏈表實現,其實可以采用list實現,處于一個想學數據結構的朋友的建議才自己動手的
對于4其實我是違背了模板的思想,強制把實現放入cpp,可能會誤導他人,當時只是為了玩玩,原以為可以show一下,沒想到貽笑大方了
再次感謝小明兄,技術可見厲害。  回復  更多評論
  
# re: 數據結構之網格實現
2006-01-16 22:12 | 萬連文
問題一已經修改,添加兩個接口函數
// 添加一個單元格,bRight=true表示添加在pos后面
// 可能修改m_pHead、m_pTail
// 返回<=0表示添加失敗;>0表示成功
int AddCell(T xData, WLWGridCell<T>* pPos, bool bRight=true);

// 添加一個單元格,iIndex是索引,bRight=true表示添加在iIndex后面
// 可能修改m_pHead、m_pTail
// 返回<=0表示添加失敗;>0表示成功
int AddCell(T xData, int iIndex, bool bRight=true);
問題二無法修改,因為不想拷貝,使用的時候必須要交付內存管理權限否則無法正確運行,必須注意。  回復  更多評論
  
# re: 數據結構之網格實現
2006-01-17 20:48 | 萬連文
針對以上建議做如下修改:
2006-1-16
WLWGridRow類添加兩個函數接口以方便用戶使用:
int AddCell(T xData, WLWGridCell<T>* pPos, bool bRight=true);
int AddCell(T xData, int iIndex, bool bRight=true);

2006-1-17
WLWGridRow類和WLWGrid類接口傳遞指針方式改為傳遞指針引用,
為了避免用戶傳入棧地址導致兩次析構,如:
int AddCell(WLWGridCell<T>* pCell, int iIndex, bool bRight=true);
改為:
int AddCell(WLWGridCell<T>*& pCell, int iIndex, bool bRight=true);

2006-1-17
WLWGridRow類添加一個拷貝構造函數  回復  更多評論
  
簡歷下載
聯系我

<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(66)

隨筆分類

隨筆檔案

相冊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产欧美精品一区aⅴ影院| 久久福利影视| 国产精品国色综合久久| 亚洲女同同性videoxma| 国产精品一级久久久| 国产精品久久久91| 国产欧美日韩精品专区| 国产亚洲精品高潮| 欧美一站二站| 欧美一区二区三区视频在线观看| 中文一区二区在线观看| 亚洲欧美综合网| 午夜精品视频一区| 亚洲一区二区三区涩| 亚洲午夜国产一区99re久久| 亚洲视频久久| 中文亚洲免费| 欧美在线黄色| 欧美精品一区二区精品网| 久久久99久久精品女同性| 欧美与欧洲交xxxx免费观看| 噜噜噜噜噜久久久久久91| 亚洲电影第1页| 久久久久免费观看| 久久夜色精品| 欧美韩日视频| 亚洲一级高清| 欧美chengren| 国产精品区免费视频| 国产真实久久| 99热在这里有精品免费| 欧美一区中文字幕| 亚洲欧洲一区二区三区久久| 性欧美xxxx大乳国产app| 欧美在线综合视频| 欧美精品一区二区三区在线播放 | 亚洲国产影院| 午夜在线成人av| 欧美韩日视频| 国产一区二区无遮挡| 欧美激情a∨在线视频播放| 国产精品视频精品| 在线一区观看| 男同欧美伦乱| 亚洲一区日韩在线| 欧美成人官网二区| 国产亚洲精品7777| 性做久久久久久免费观看欧美| 免费亚洲电影在线| 亚洲免费在线精品一区| 欧美激情第9页| 国内精品美女av在线播放| 亚洲欧美日韩一区二区三区在线| 一区二区三区四区五区视频| 香蕉久久a毛片| 久久精品一二三| 欧美日韩国内自拍| 又紧又大又爽精品一区二区| 欧美在线一二三四区| 亚洲国产高清aⅴ视频| 午夜一级久久| 国产日韩精品一区二区| 午夜精品久久久久久99热软件| 亚洲精品国产精品国产自| 久久成人精品无人区| 国产精品国产精品| 日韩一级精品| 欧美大学生性色视频| 亚洲欧美国产制服动漫| 欧美天天视频| 伊人影院久久| 噜噜噜噜噜久久久久久91| 欧美在线视频免费观看| 国内成人精品2018免费看 | 亚洲一区二区精品| 亚洲二区三区四区| 免费看精品久久片| 亚洲国产专区校园欧美| 亚洲二区三区四区| 欧美黄污视频| 一本色道久久综合狠狠躁的推荐| 亚洲激情视频在线播放| 麻豆精品在线观看| 一区二区三区视频在线看| 9色porny自拍视频一区二区| 国产欧美日韩综合一区在线观看| 日韩视频一区二区三区| 巨胸喷奶水www久久久免费动漫| 欧美一区深夜视频| 在线视频成人| 亚洲激情成人网| 欧美日韩精品一本二本三本| 亚洲综合三区| 香蕉国产精品偷在线观看不卡| 亚洲一级黄色片| 亚洲日本在线视频观看| 久久福利视频导航| 亚洲男同1069视频| 男人的天堂亚洲在线| 久久久另类综合| 亚洲综合日韩在线| 国产专区综合网| 一区二区91| 国产精品亚洲视频| 午夜久久福利| 美日韩精品免费| 亚洲尤物在线视频观看| 久久久精品国产99久久精品芒果| 亚洲精品在线三区| 欧美亚洲在线| 亚洲午夜成aⅴ人片| 久久另类ts人妖一区二区| 9l国产精品久久久久麻豆| 亚洲免费视频一区二区| 亚洲美女啪啪| 可以免费看不卡的av网站| 午夜精品国产| 欧美日韩一区视频| 亚洲国产成人精品久久| 国产精品永久免费观看| 日韩亚洲精品视频| 亚洲电影成人| 久久精品国产综合| 欧美专区日韩专区| 国产精品入口66mio| 99精品99| 中日韩高清电影网| 嫩草影视亚洲| 亚洲高清激情| 亚洲国产一区二区视频| 久久精品亚洲| 裸体素人女欧美日韩| 国产主播在线一区| 欧美一级播放| 久久九九热re6这里有精品| 国产精品入口福利| 午夜天堂精品久久久久| 久久成人18免费网站| 国产情人综合久久777777| 亚洲一区国产| 久久精品国语| 一区精品在线播放| 麻豆精品在线观看| 亚洲另类在线一区| 亚洲视频在线一区| 国产精品私房写真福利视频| 午夜精品久久久久久99热| 久久久99国产精品免费| 国产一区二区av| 久久久国产亚洲精品| 女人天堂亚洲aⅴ在线观看| 亚洲国产精品99久久久久久久久| 另类综合日韩欧美亚洲| 亚洲国产精品一区二区第四页av| 亚洲精品极品| 国产精品久久久久77777| 亚洲欧美中文字幕| 欧美黄色一区| 亚洲一区精彩视频| 韩国av一区二区三区在线观看 | 亚洲欧洲视频| 欧美精品首页| 亚洲在线免费视频| 麻豆精品91| 亚洲视频电影在线| 国产欧美欧美| 欧美国产精品久久| 在线综合亚洲欧美在线视频| 久久久精品午夜少妇| 亚洲综合导航| 欧美一区二区在线免费观看| 国内精品国语自产拍在线观看| 久久综合久久综合久久| av成人免费| 一区二区三区精品视频在线观看| 美女国产精品| 亚洲国产精品日韩| 亚洲图片在线| 国产欧美一区二区精品忘忧草 | 亚洲天堂男人| 老色鬼精品视频在线观看播放| 亚洲理论在线| 国产一区二区三区在线免费观看| 欧美电影免费观看高清完整版| 中文亚洲字幕| 亚洲区一区二| 久久午夜影视| 亚洲一区二区三区激情| 亚洲高清激情| 国产亚洲欧美日韩日本| 欧美日韩高清免费| 久久米奇亚洲| 欧美一区二区视频97| 一区二区欧美日韩| 欧美激情第9页| 久热精品在线视频| 久久er精品视频| 午夜精品国产更新| 亚洲自拍电影| 亚洲一区二区欧美日韩|