1.1雙向鍊錶指標域**
從圖中可以看出雙向鍊錶的前向指標指向前乙個結點的首位址,後向指標指向下乙個節點的首位址,並且指標型別相同,且只能指向與自己型別相同的結構體。
1.2通用鍊錶指標域**
從圖中可以看出通用鍊錶的前向指標指向前乙個結點的指標域的首位址,後向指標指向下乙個節點的指標域的首位址,所以在不同的結構體中定義相同的指標域就可以了,也就是說,單獨定義乙個結構體型別,其成員只有指標域,並且在其他結構體中定義這種結構體型別的變數就ok了。下面我們看一些**。
我這裡以學生管理系統為例對指標域型別的結構體,學生型別的結構體,教師型別的結構體進行演示
2.1定義指標域型別的結構體
先來看一下**:
//**************指標域************//
typedef
struct node //該結構體是專門的指標域,包含在每個節點之中
node,*pnode;
**注釋的已經很清楚了,我就不囉嗦了!!!
2.2定義學生、教師型別的結構體
2.2.1 學生結構體**:
typedef
struct student //學生
stu,*pstu;
2.2.2 教師結構體**:
typedef
struct teacher //教師
tea,*ptea;
結構體定義好之後我們來建立乙個鍊錶。
3.1建立煉表頭(頭結點的初始化)
在使用之前頭一定要有相應的空間
**如下:
#define head_node_initial(head) \
注意:巨集定義都是寫成一行,別丟了換行符 『\』,下同。
3.2插入結點
這裡需要注意的是我在寫插入結點**是沒有對該結點進行初始化,一定要記得在使用這個巨集定義之前先對結點進行初始化。
3.2.1 頭插法:
**如下:
#define insert_one_node_by_head(head,pnew) \
3.2.1 尾插法:**如下:
#define insert_one_node_by_tail(head,pnew) \
3.3刪除結點**如下:
#define delete_one_node(pdel) \
這一部分也是通用鍊錶裡面最難理解的一部分,由於通用鍊錶的結點的指標指向另外乙個結點的指標域的首位址,這就意味著不可以直接訪問資料域,所以需要通過指標域的首位址去找到結點的首位址,從而進一步訪問資料域將該結點的首位址看作從位址 0 開始;
那麼從0到指標域的首位址就是偏移量;
指標域的首位址-偏移量=結點首位址;
4.1 求解結點的首位址
**如下:
#define get_node_first_addr(pload,type_struct,pointer) \
下面我對這段**進行一下分析:
(type_struct*)(char *)(pload)
pload—-該結點指標域的首位址。
(char *)&(((type_struct*)0)->pointer)
((type_struct*)0)
—-將節點的起始位置看作從 0 開始,強制轉換型別取決於結點的結構體型別
(char *)&(((type_struct*)0)->pointer)
—-指標域首位址,這裡的指標域首位址就等於偏移量(因為結點首位址從0開始的)
指標域的首位址-偏移量=結點首位址;
以上**都是我親測過的,你只需要在我的**基礎上直接呼叫巨集就可以使用。
多型實現通用鍊錶
鍊錶節點的資料域型別不再為具體的資料型別,而是通過乙個基類指標引入,達到不借助模板而是通過多型實現通用鍊錶 define crt secure no warnings include include using namespace std class object virtual object vi...
資料結構 鍊錶 雙向通用鍊錶
目錄參考 節點 非通用鍊錶自理解概念 節點攜帶資訊 襪子 掛在到鉤子的東西 通用鍊錶自理解概念 資訊攜帶節點 襪子 擺到晾衣架圓形框的一截上,使得節點成為襪子的乙個成員指標變數 通用鍊錶與非通用鍊錶的區別 通用鍊錶節點被放到資訊結構體中,通過偏移找到所在的結構體 即是通過偏移找到襪子頭 而非通用鍊錶...
鍊錶的通用實現方式
在鍊錶的使用時,結構物件所包含的資料各不相同,所以在鍊錶的儲存需要針對不同的鍊錶物件重複編寫相應的儲存方法,能不能實現一種通用的方式,能夠針對不同的結構物件,實現統一的儲存方法?當然能。一般我們在儲存鍊錶時,都會儲存鍊錶物件結構的首位址,也就是結構指標。在計算機中,對於指標,在32位機器上,實際就是...