C和指標 第12章 使用結構和指標

2021-08-19 17:22:22 字數 1991 閱讀 8504

2.單列表插入函式示例

#include #include typedef struct nodenode;

int sll_insert( register node **rootp, int new_value )

以上**為最終修改和簡化後**,修改和簡化有如下幾點:

1.函式不能越過鍊錶尾部,所以採用判斷current值是否為空。防止越位

2.函式不能處理頭指標,所以採用將頭指標作為乙個引數傳遞給函式,即使用node **而不是node *。

3.為消除把節點插入鍊錶起始位置作為特殊情況來處理的情況,採用linkp = ¤t->link來簡化,此時linkp指向的是指向結構的link欄位。只需2個指標而不是3個。

4.由於迴圈之前的最後一條語句和迴圈之前的語句相同,將current的賦值嵌入到while表示式中。消除current的冗餘賦值。

3.雙向鍊錶

#include #include typedef struct nodenode;

int sll_insert( node **rootp, int new_value )

newnode = (node *)malloc( sizeof( node ) );

if( newnode == null )

return -1;

else

newnode->value = new_value;

if( next != null)

else

}else

else

}return 1;

}

簡化插入函式:

if( next != null)

else

next->bwk = newnode;

} else

else

rootp->bwk = newnode;

}

再一步簡化:

newnode->fwk = next;

if( this != rootp )

else

if( next != null)

next->bwk = newnode;

else

rootp->bwk = newnode;

再簡化:

int sll_insert( register node **rootp, int new_value )

newnode = (node *)malloc( sizeof( node ) );

if( newnode == null )

return -1;

else

newnode->value = new_value;

newnode->fwk = next;

this->fwk = newnode;

if( this != rootp )

newnode->bwk = this;

else

newnode->bwk = null;

if( next != null)

next->bwk = newnode;

else

rootp->bwk = newnode;

return 1;

}

倘若喪心病狂,那麼如下定是極好的:

newnode->fwk = next;

this->fwk = newnode;

newnode->bwk = ( this != rootp) ? this : null;

( next != null ? next : rootp )->bwk = newnode

總結:

1.消除特殊情況使**易於維護。

2.通過提煉語句消除if中的重複語句。

3.不要僅僅根據**的大小評估其質量。

C和指標 第10章 結構和聯合

1.結構 struct x struct y 20 z 警告 以上兩個宣告被編譯器當做兩個截然不同的型別。即y和z為同一型別,但與x型別不用。使用結構標籤宣告結構 struct 此時 是結構標籤,使用標籤建立需要如下 struct x struct y 20 z 使用typedef定義乙個新型別 t...

第 章 陣列和指標

第 章 陣列和指標 現代c 程式應使用vector和迭代器代替陣列和指標,除非前二者不滿足對效率的特殊要求 陣列 陣列是由型別說明符 識別符號和維度組成的復合型別,能儲存一組某種型別的未命名物件 定義和初始化 型別說明符規定了存放於陣列中元素的型別 可使用除引用外的任意型別,包括陣列本身 陣列的陣列...

C和指標第10章結構和聯合學習總結

下面圖中stmple是標籤 下面中 是乙個型別名 箭頭操作符 接受兩個引數,左運算元為乙個指向結構體的指標,右運算元為乙個結構成員。箭頭操作符會自動對左操數執行間接訪問取得指標所指向的結構,因此表示式 cp f和表示式cp f的結果是一樣的,cp f的結果是乙個結構。可以在乙個結構內部包含乙個指向該...