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的結果是乙個結構。可以在乙個結構內部包含乙個指向該...