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

萬星星@豌豆莢 歡迎加入我們
一個吃軟飯的男人!!!!!我只想寫程序####
微博: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類添加一個拷貝構造函數  回復  更多評論
  
簡歷下載
聯系我

<2007年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用鏈接

留言簿(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>
            国产亚洲va综合人人澡精品| 亚洲视频在线观看视频| 日韩视频免费| 一本色道久久综合亚洲精品婷婷| 在线观看日韩av| 亚洲黄色小视频| 中文日韩在线| 久久久精品tv| 亚洲国产精品一区制服丝袜 | 99视频精品免费观看| 亚洲午夜久久久| 久久久久久网| 欧美日韩精品中文字幕| 国产亚洲欧美一区二区| 亚洲经典视频在线观看| 午夜精品福利一区二区蜜股av| 久久久中精品2020中文| 亚洲精品极品| 久久九九全国免费精品观看| 欧美日韩 国产精品| 影音先锋欧美精品| 亚洲欧美视频一区二区三区| 欧美岛国激情| 性欧美videos另类喷潮| 欧美日韩亚洲一区二区三区四区| 精久久久久久久久久久| 欧美一级理论片| 亚洲高清不卡在线观看| 久久成年人视频| 国产精品午夜国产小视频| 日韩一级精品| 欧美激情a∨在线视频播放| 亚洲网站在线播放| 欧美另类一区| 日韩视频在线播放| 欧美大片免费观看| 久久琪琪电影院| 韩国一区二区三区美女美女秀| 亚洲欧美国产毛片在线| 日韩视频中文| 欧美精品一区二区三区高清aⅴ| 一区福利视频| 久久免费国产精品1| 亚洲在线一区二区| 国产精品啊v在线| 亚洲香蕉在线观看| 亚洲最黄网站| 欧美性猛片xxxx免费看久爱| 亚洲图片激情小说| 欧美日韩国产高清| 老司机精品久久| 亚洲一区二区网站| 国产精品欧美日韩一区二区| 一本一本久久a久久精品综合妖精| 欧美大片一区二区三区| 另类综合日韩欧美亚洲| 亚洲成色www久久网站| 久热国产精品视频| 久久色中文字幕| 亚洲激情视频在线观看| 亚洲国产精品成人综合| 欧美日韩国产成人精品| 亚洲午夜一区二区三区| 亚洲一区二区动漫| 国产手机视频一区二区| 久久综合久久综合久久综合| 久久伊人精品天天| 亚洲欧洲综合| 一区二区日韩免费看| 国产亚洲精品bt天堂精选| 狂野欧美激情性xxxx欧美| 欧美电影在线免费观看网站| 亚洲香蕉视频| 久久久久国产精品午夜一区| 亚洲美女精品久久| 亚洲天堂av在线免费| 国产一区美女| 亚洲欧洲一级| 国产午夜精品一区二区三区视频| 久久夜色精品国产噜噜av| 欧美福利一区| 欧美一级视频免费在线观看| 久久精品中文| 99精品欧美一区二区三区| 亚洲综合国产| 91久久精品国产91久久性色| 一本大道久久精品懂色aⅴ| 国产日韩亚洲欧美精品| 亚洲成色777777在线观看影院| 欧美午夜精品理论片a级按摩 | 一区二区日本视频| 国语自产精品视频在线看抢先版结局| 欧美成人在线网站| 国产精品入口66mio| 欧美大片va欧美在线播放| 国产精品国产精品国产专区不蜜| 久久综合中文字幕| 国产精品久久久久国产精品日日| 美女精品视频一区| 国产精品久久久久久av福利软件| 欧美本精品男人aⅴ天堂| 国产精品日本精品| 亚洲人成网站在线观看播放| 国内精品久久久久影院优| 在线视频亚洲一区| 91久久久久久国产精品| 欧美一区影院| 午夜精品免费视频| 欧美精品在线一区二区| 美女精品在线观看| 欧美不卡视频| 亚洲欧洲日本在线| 香蕉久久夜色精品| 亚洲网在线观看| 女人天堂亚洲aⅴ在线观看| 欧美一区二区三区在线看| 欧美日韩国产色综合一二三四 | 欧美日韩成人综合在线一区二区| 久久视频在线看| 国产欧美精品在线播放| 日韩一区二区精品| 日韩亚洲欧美成人| 美女在线一区二区| 久久综合色天天久久综合图片| 国产精品日韩欧美综合| 一区二区免费在线观看| 中文日韩欧美| 欧美色视频日本高清在线观看| 亚洲欧洲综合另类在线| 亚洲激情一区二区| 嫩草影视亚洲| 亚洲黄色在线观看| 99视频精品在线| 欧美日韩精品一区二区三区| 亚洲精品久久久久中文字幕欢迎你 | 亚洲日本乱码在线观看| 欧美成人网在线| 亚洲国产午夜| 一区二区三区国产精品| 欧美日韩在线精品| 亚洲一级电影| 久久精品中文字幕免费mv| 国语精品中文字幕| 免费成人美女女| 亚洲精品在线二区| 亚洲午夜免费视频| 国产欧美日韩在线| 久久精品国产v日韩v亚洲| 久久综合一区| 亚洲裸体视频| 国产精品久久久久久久久久久久久 | 欧美日韩在线视频一区| 亚洲五月六月| 久久婷婷麻豆| 亚洲精品孕妇| 国产精品久久亚洲7777| 久久xxxx精品视频| 欧美激情免费在线| 亚洲一区二区三区777| 国产偷国产偷精品高清尤物| 久久久久久久久久久一区 | 一区二区三区精密机械公司| 国产精品av一区二区| 欧美一级视频一区二区| 欧美激情精品久久久久久黑人| 亚洲一区免费视频| 国产欧美日韩一区| 欧美+日本+国产+在线a∨观看| 久久婷婷影院| 亚洲全部视频| 国产精品理论片在线观看| 久久aⅴ国产欧美74aaa| 亚洲高清免费| 久久精品亚洲精品| 亚洲精品久久| 国产美女精品| 欧美激情第10页| 欧美一区二区三区四区高清| 亚洲国产1区| 久久精品观看| 中文亚洲免费| 亚洲欧洲精品一区二区三区不卡 | 久久久亚洲成人| 国产精品99久久久久久www| 欧美激情按摩| 久久久精品一品道一区| 亚洲特色特黄| 99riav国产精品| 在线免费观看成人网| 国产色综合久久| 国产精品福利网| 欧美精品观看| 美日韩精品视频| 久久九九免费| 欧美一区二区播放| 亚洲男人的天堂在线aⅴ视频| 亚洲精品精选| 亚洲激情在线激情| 欧美激情1区2区3区| 久久综合国产精品|