天天看點

資料結構

1、資料結構是一門研究非數值計算程式設計中操作對象,以及這些對象之間的關系和操作的學科;

     (資料結構是互相之間存在一種或多種特定關系的資料元素的集合。)

     資料結構包括兩個方面的内容:資料的邏輯結構和存儲結構。同一邏輯結構采用不同的存儲方法,可以得到不同的存儲結構。

2、算法是為了解決某類問題而規定的一個有限長的操作序列。

     算法具有五個特性:有窮性、确定性、可行性、輸入、輸出。

3、時間複雜度一般是算法中最大的語句頻率,一般情況下是最深層循環内的語句頻度。

    (1) 如果算法的執行時間不随着問題規模n的增加而增長,算法中語句的頻度就是某個常數。即使這個常數再大,算法的時間複雜度都是o(1);

     (2)當有若幹個循環語句時,算法的時間複雜度是由嵌套層次最深的循環語句中最内層語句的頻度f(n)決定的,例:

<a href="http://my.oschina.net/jacedy/blog/335902#">?</a>

1

2

3

4

<code>for</code><code>(i=0;i&lt;n;i++)</code>

<code>    </code><code>for</code><code>(j=0;j&lt;i;j++)</code>

<code>        </code><code>for</code><code>(k=0;k&lt;j;k++)</code>

<code>            </code><code>x++;            </code><code>//其時間複雜度為o(n^3)</code>

     (3)常見的時間複雜度按數量級遞增排列依次為:常數階o(1)、對數階o(log2n)、線性階o(n)、線性對數階o(nlog2n)、平方階o(n^2)、立方階o(n^3)、……、指數階o(2^n);

4、稀疏圖用 鄰接表 存儲節省空間,稠密圖用 鄰接矩陣 存儲節省空間;

5、單連結清單的操作:

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

<code>#include &lt;iostream&gt;</code>

<code>using</code> <code>namespace</code> <code>std;</code>

<code>typedef</code> <code>struct</code> <code>student {</code>

<code>    </code><code>int</code> <code>data;</code>

<code>    </code><code>struct</code> <code>student *next;</code>

<code>}node;</code>

<code>//建立單連結清單</code>

<code>node *create()    </code><code>//不帶空頭節點</code>

<code>{</code>

<code>    </code><code>int</code> <code>n;</code>

<code>    </code><code>node *p, *c, *head=null;</code>

<code>    </code><code>cout&lt;&lt;</code><code>"請輸入(以0結束): "</code><code>;</code>

<code>    </code><code>while</code> <code>(1)</code>

<code>    </code><code>{</code>

<code>        </code><code>cin&gt;&gt;n;</code>

<code>        </code><code>if</code><code>(n != 0)</code>

<code>        </code><code>{</code>

<code>            </code><code>c = (node *)</code><code>malloc</code><code>(</code><code>sizeof</code><code>(node));</code>

<code>            </code><code>c-&gt;data = n;</code>

<code>            </code><code>c-&gt;next = null;</code>

<code>            </code><code>if</code><code>(head == null)</code>

<code>                </code><code>head = c;</code>

<code>            </code><code>else</code>

<code>                </code><code>p-&gt;next = c;</code>

<code>            </code><code>p = c;</code>

<code>        </code><code>}</code>

<code>        </code><code>else</code>

<code>            </code><code>break</code><code>;</code>

<code>    </code><code>}</code>

<code>    </code><code>return</code> <code>head;</code>

<code>}</code>

<code>//求連結清單長度</code>

<code>int</code> <code>length(node *head)</code>

<code>    </code><code>int</code> <code>len=0;</code>

<code>    </code><code>node *p;</code>

<code>    </code><code>p = head;</code>

<code>    </code><code>while</code><code>(p)</code>

<code>        </code><code>len++;</code>

<code>        </code><code>p = p-&gt;next;</code>

<code>    </code><code>cout&lt;&lt;</code><code>"連結清單的長度為: "</code><code>&lt;&lt;len&lt;&lt;endl;</code>

<code>    </code><code>return</code> <code>len;</code>

<code>//插入節點</code>

<code>node *insert(node *head, </code><code>int</code> <code>dest, </code><code>int</code> <code>num)</code>

<code>    </code><code>int</code> <code>d=1,flag=0;</code>

<code>    </code><code>node *p0 ,*p1, *p2;</code>

<code>    </code><code>p0 = (node *)</code><code>malloc</code><code>(</code><code>sizeof</code><code>(node));</code>

<code>    </code><code>p0-&gt;data = num;</code>

<code>    </code><code>p1 = head;</code>

<code>    </code><code>while</code><code>(p1-&gt;next != null)</code>

<code>        </code><code>if</code><code>(dest == d)</code>

<code>            </code><code>if</code><code>(head == p1)       </code><code>//插入在頭節點前</code>

<code>            </code><code>{</code>

<code>                </code><code>p0-&gt;next = p1;</code>

<code>                </code><code>head = p0;</code>

<code>            </code><code>}</code>

<code>            </code><code>else</code>        <code>//插入在中間節點</code>

<code>                </code><code>p2-&gt;next = p0;</code>

<code>            </code><code>flag = 1;    </code><code>//表示節點已插入</code>

<code>        </code><code>p2 = p1;</code>

<code>        </code><code>p1 = p1-&gt;next;</code>

<code>        </code><code>d++;</code>

<code>    </code><code>if</code><code>(flag == 0)</code>

<code>        </code><code>p1-&gt;next = p0;    </code><code>//插入在尾節點</code>

<code>        </code><code>p0-&gt;next = null;</code>

<code>    </code><code>cout&lt;&lt;</code><code>"插入後的連結清單為:"</code><code>&lt;&lt;endl;</code>

<code>//連結清單排序</code>

<code>node *sort(node *head)</code>

<code>    </code><code>int</code> <code>n, temp;</code>

<code>    </code><code>n = length(head);</code>

<code>    </code><code>for</code><code>(</code><code>int</code> <code>i=0; i&lt;n-1; i++)</code>

<code>        </code><code>p = head;</code>

<code>        </code><code>for</code><code>(</code><code>int</code> <code>j=0; j&lt;n-1-i; j++)</code>

<code>            </code><code>if</code><code>(p-&gt;data &gt; p-&gt;next-&gt;data)</code>

<code>                </code><code>temp = p-&gt;data;</code>

<code>                </code><code>p-&gt;data = p-&gt;next-&gt;data;</code>

<code>                </code><code>p-&gt;next-&gt;data = temp;</code>

<code>            </code><code>p = p-&gt;next;</code>

<code>    </code><code>cout&lt;&lt;</code><code>"排序後的連結清單為:"</code><code>&lt;&lt;endl;</code>

<code>//連結清單逆置</code>

<code>node *reverse(node *head)</code>

<code>    </code><code>node *p1, *p2, *p3;</code>

<code>    </code><code>p2 = p1-&gt;next;</code>

<code>    </code><code>while</code><code>(p2)</code>

<code>        </code><code>p3 = p2-&gt;next;</code>

<code>        </code><code>p2-&gt;next = p1;</code>

<code>        </code><code>p1 = p2;</code>

<code>        </code><code>p2 = p3;</code>

<code>    </code><code>head-&gt;next = null;</code>

<code>    </code><code>head = p1;</code>

<code>    </code><code>cout&lt;&lt;</code><code>"逆置後的連結清單為:"</code><code>&lt;&lt;endl;</code>

<code>//删除節點</code>

<code>node *del(node *head, </code><code>int</code> <code>num)</code>

<code>    </code><code>node *p1, *p2;</code>

<code>    </code><code>while</code><code>(num != p1-&gt;data &amp;&amp; p1)</code>

<code>    </code><code>if</code><code>(num == p1-&gt;data)</code>

<code>        </code><code>cout&lt;&lt;</code><code>"删除節點後的連結清單為:"</code><code>&lt;&lt;endl;</code>

<code>        </code><code>if</code><code>(p1 == head)       </code><code>//若删除的為頭節點</code>

<code>            </code><code>head = p1-&gt;next;</code>

<code>            </code><code>free</code><code>(p1);</code>

<code>        </code><code>else</code>        <code>//删除的為非頭節點</code>

<code>            </code><code>p2-&gt;next = p1-&gt;next;</code>

<code>    </code><code>else</code>

<code>        </code><code>cout&lt;&lt;num&lt;&lt;</code><code>"未找到相應節點。"</code><code>&lt;&lt;endl;</code>

<code>//列印連結清單</code>

<code>void</code> <code>print(node *head)</code>

<code>    </code><code>for</code><code>(p = head; p; p=p-&gt;next)</code>

<code>        </code><code>cout&lt;&lt;p-&gt;data&lt;&lt;</code><code>" "</code><code>;</code>

<code>    </code><code>cout&lt;&lt;endl;</code>

<code>int</code> <code>main()</code>

<code>    </code><code>node *s;</code>

<code>    </code><code>s = create();</code>

<code>    </code><code>length(s);</code>

<code>    </code><code>print(s);</code>

<code>    </code><code>s = sort(s);</code>

<code>    </code><code>s = reverse(s);</code>

<code>    </code><code>s = insert(s, 3, 11);</code>

<code>    </code><code>s = del(s, 2);</code>

<code>    </code><code>return</code> <code>0;</code>

繼續閱讀