這一章主要就是實現了乙個鍊錶:
第一段程式
int
sll_insert( node *current, int new_value )
new = (node *)malloc( sizeof( node ) );
if( new == null )
return false;
new->value = new_value;
new->link = current;
previous->link = new;
return true;
}
錯誤在於做標記的那乙個迴圈,可能如果一直找到最後沒找到,是不是就發生了越界現象。同時,如果我們在第乙個結點之前插入乙個結點,如何去訪問到這個結點,那是很困難的。
所以第二個程式引入了root指標作為形參。
二重鍊錶:int
sll_insert( node **rootp, int new_value )
new = (node *)malloc( sizeof( node ) );
if( new == null )
return false;
new->value = new_value;
new->link = current;
if( previous == null )//判斷是不是為第乙個結點
*rootp = new;
else
previous->link = new;
return true;
}
int
sll_insert( register node **linkp, int new_value )
寫的程式和書上不同,比較要注意的地方就是,if語句裡面如果有相同的語句可以往前或者往後提出,只要不對它在if裡面之後的動作的結果產生影響。
再次簡化就考慮if的條件,然後看看哪些值是和這個條件一樣的,就可以從語句中提出。
程式如下
#include typedef int valuetype;
struct node;
struct list
;struct node;
void dll_insert(register list* mylist,valuetype new_value);
fuctionn.cpp
#include "linked_list_node.h"
#include #include void dll_insert(register list* mylist,valuetype new_value)
register node* newnode = (node*)malloc(sizeof(node));
if(newnode == null)
newnode->value = new_value;
newnode->next = current;
if (current != null)
else
}else
else
mylist->last = newnode;
}}
main.cpp
#include "linked_list_node.h"
#include #include int main()
主要就是判斷當前鍊錶是不是為空,這個結點要插在鍊錶的頭,尾,還是中間。
課後題:
鍊錶的反**利用3個指標的不斷移動,就可以做到反向連線。
node* sll_reverse(node* first)
cur->next = pre;
return cur;
}
附上單鏈表的整個源**:
linked_node.h
#include #include typedef int valuetype;
struct node
;bool dll_insert(register node** root,valuetype newvalue);
node* sll_reverse(node* first);
int sll_remove(register node** rootp,register node* node);
functionn.cpp
#include "linked_node.h"
#include #include bool dll_insert(register node** root,valuetype newvalue)
register node* newnode = (node*)malloc(sizeof(node));
if(newnode == null)
newnode->value = newvalue;
newnode->next = *root;//或者current
*root = newnode;//即使root沒改變是指向頭結點的指標的指標,也是成立
return true;
}node* sll_reverse(node* first)
cur->next = pre;
return cur;
}int sll_remove(register node** rootp,register node* node)
if(current == null)
return false;
*rootp = current->next;
free(node);
return true;
}
#include #include "linked_node.h"
#include int main()
root = null;
dll_insert(&root,1);
dll_insert(&root,2);
dll_insert(&root,3);//為什麼不管怎麼插入永遠指向頭結點
dll_insert(&root,4);
dll_insert(&root,3);
root = sll_reverse(root);
register node* node = root;
while (node != null && node->value != 2)
if (node != null)
sll_remove(&root,node);
return exit_success;
}
這裡包括了課後題的刪除結點和鍊錶反轉
第十二章 使用繼承
繼承反映了類與類關係 為了宣告乙個類從另乙個類繼承,需要使用以下語法 class derivedclass baseclass derivedclass 派生類 將從baseclass 基類 繼承,基類中的方法會成為派生類的一部分。在c 中,乙個類最多允許從乙個其他的派生類 不允許從兩個或者更多的派...
第十二章 檔案
文字檔案 文字檔案是一種由若干字元構成的檔案,可以用文字編輯器進行閱讀或編輯。以txt py html等為字尾的檔案都是文字檔案。2.二進位制檔案 二進位制檔案一般是指不能用文字編輯器閱讀或編輯的檔案。以 mp4 png等為字尾的檔案都是二進位制檔案,如果想要開啟或修改這些檔案,必須通過特定軟體進行...
第十二章 dp
動態規劃策略 將原始問題拆分為多個子問題,將子問題結果記錄,方便復用子問題的解 遞迴 記憶化 遞推 是動態規劃的一體兩面,本質都是一樣的 遞推減少了呼叫次數,空間上還能優化,一般選擇遞推方式 遞迴 記憶化 int memo maxn 將o 2 n o n intfibonacci int n 遞推 ...