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<n;i++)</code>
<code> </code><code>for</code><code>(j=0;j<i;j++)</code>
<code> </code><code>for</code><code>(k=0;k<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 <iostream></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<<</code><code>"請輸入(以0結束): "</code><code>;</code>
<code> </code><code>while</code> <code>(1)</code>
<code> </code><code>{</code>
<code> </code><code>cin>>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->data = n;</code>
<code> </code><code>c->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->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->next;</code>
<code> </code><code>cout<<</code><code>"連結清單的長度為: "</code><code><<len<<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->data = num;</code>
<code> </code><code>p1 = head;</code>
<code> </code><code>while</code><code>(p1->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->next = p1;</code>
<code> </code><code>head = p0;</code>
<code> </code><code>}</code>
<code> </code><code>else</code> <code>//插入在中間節點</code>
<code> </code><code>p2->next = p0;</code>
<code> </code><code>flag = 1; </code><code>//表示節點已插入</code>
<code> </code><code>p2 = p1;</code>
<code> </code><code>p1 = p1->next;</code>
<code> </code><code>d++;</code>
<code> </code><code>if</code><code>(flag == 0)</code>
<code> </code><code>p1->next = p0; </code><code>//插入在尾節點</code>
<code> </code><code>p0->next = null;</code>
<code> </code><code>cout<<</code><code>"插入後的連結清單為:"</code><code><<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<n-1; i++)</code>
<code> </code><code>p = head;</code>
<code> </code><code>for</code><code>(</code><code>int</code> <code>j=0; j<n-1-i; j++)</code>
<code> </code><code>if</code><code>(p->data > p->next->data)</code>
<code> </code><code>temp = p->data;</code>
<code> </code><code>p->data = p->next->data;</code>
<code> </code><code>p->next->data = temp;</code>
<code> </code><code>p = p->next;</code>
<code> </code><code>cout<<</code><code>"排序後的連結清單為:"</code><code><<endl;</code>
<code>//連結清單逆置</code>
<code>node *reverse(node *head)</code>
<code> </code><code>node *p1, *p2, *p3;</code>
<code> </code><code>p2 = p1->next;</code>
<code> </code><code>while</code><code>(p2)</code>
<code> </code><code>p3 = p2->next;</code>
<code> </code><code>p2->next = p1;</code>
<code> </code><code>p1 = p2;</code>
<code> </code><code>p2 = p3;</code>
<code> </code><code>head->next = null;</code>
<code> </code><code>head = p1;</code>
<code> </code><code>cout<<</code><code>"逆置後的連結清單為:"</code><code><<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->data && p1)</code>
<code> </code><code>if</code><code>(num == p1->data)</code>
<code> </code><code>cout<<</code><code>"删除節點後的連結清單為:"</code><code><<endl;</code>
<code> </code><code>if</code><code>(p1 == head) </code><code>//若删除的為頭節點</code>
<code> </code><code>head = p1->next;</code>
<code> </code><code>free</code><code>(p1);</code>
<code> </code><code>else</code> <code>//删除的為非頭節點</code>
<code> </code><code>p2->next = p1->next;</code>
<code> </code><code>else</code>
<code> </code><code>cout<<num<<</code><code>"未找到相應節點。"</code><code><<endl;</code>
<code>//列印連結清單</code>
<code>void</code> <code>print(node *head)</code>
<code> </code><code>for</code><code>(p = head; p; p=p->next)</code>
<code> </code><code>cout<<p->data<<</code><code>" "</code><code>;</code>
<code> </code><code>cout<<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>