1.特徵:
①鍊錶中的元素個數可以根據需要增加和減少,不像陣列,在宣告之後就固定不變;
②元素的位置可以變化,即可以從某個位置刪除,然後再插入到乙個新的地方;
3.基本操作:
(1)建立鍊錶是指,從無到有地建立起乙個鍊錶,即往空煉表中依次插入若干結點,並保持結點之間的前驅和後繼關係。
(2)檢索操作是指,按給定的結點索引號或檢索條件,查詢某個結點。如果找到指定的結點,則稱為檢索成功;否則,稱為檢索失敗。
(3)插入操作是指,在結點ki-1與ki之間插入乙個新的結點k』,使線性表的長度增1,且ki-1與ki的邏輯關係發生如下變化:插入前,ki-1是ki的前驅,ki是ki-1的後繼;插入後,新插入的結點k』成為ki-1的後繼、ki的前驅。
(4)刪除操作是指,刪除結點ki,使線性表的長度減1,且ki-1、ki和ki+1之間的邏輯關係發生如下變化:刪除前,ki是ki+1的前驅、ki-1的後繼;刪除後,ki-1成為ki+1的前驅,ki+1成為ki-1的後繼.
(5)列印輸出
4.鍊錶結構體定義:struct node
6.結點指標定義:node *p;
7.結點儲存空間申請、釋放:p = new node;/delete p;
8.種類:鍊錶又分為單鏈表、雙向鍊錶和迴圈鍊錶
9.建立:
1 ) 定義鍊錶的資料結構。
2 ) 建立乙個空表。
3 ) 利用new( )函式向系統申請分配乙個節點。
4 ) 將新節點的指標成員賦值為空(保證最後乙個元素指標指向null)。若是空表,將新節點連線到表頭;若是非空表,將新節點接到表尾。
5 ) 判斷一下是否有後續節點要接入鍊錶,若有轉到3 ),否則結束。
典型的鍊錶建立、遍歷模板:#include#includestruct node10.例題:uva-11988 這個**會tle,但是思路對,這是建表的乙個好的練習; int main()
struct node *s=head->next; //將s指向鍊錶的第乙個結點
while(s->next!=null) //判斷是否是鍊錶最後乙個元素就是要判斷該元素的next指標是否為空
printf("%d\n",s->data); //輸出最後乙個結點的資料並輸出換行
return 0;
}
#include#include#include#include#include#include#includeusing namespace std;
struct node
;int main()
else if(t[i] == ']')
last = temp;
}else
}node *u = tou->next;
while(1)
printf("\n");
}return 0;
}
以下是劉汝佳的思路:
#include#include#include#include#includeusing namespace std;
int last,cur,next[100005];
char s[100005];
int main()
}for(int i=next[0];i!=0;i=next[i])
printf("%c",s[i]);
printf("\n");
}return 0;
}
11.stl鍊錶:
①定義:listname;
②標頭檔案:#include
③push_back()、push_front():往鍊錶後面/前面填元素
④empty():判斷鍊錶是否為空
⑤begin()、end():返回鍊錶的第
一、最後乙個元素
⑥鍊錶遍歷:
#include #include #include int main (void)
注:這個list容器,就象你所想的,它不支援在iterator加乙個數來指向隔乙個的物件。 就是說,我們不能用milkshakes.begin()+2來指向list中的第三個物件,因為stl的list是以雙鏈的list來實現的, 它不支援隨機訪問。
⑦for_each()遍歷:
#include #include #include #include printit (string& stringtoprint)
int main (void)
⑧count():
#include #include int main (void)
⑨count_if():
⑩find():
#include #include #include int main (void)
⑾remove():用remove()演算法返回乙個指向新的list的結尾的iterator。從開始到這個新的結尾(不含新結尾元素)的範圍 包含了remove後剩下所有元素。你可以用list成員函式erase函式來刪除從新結尾到老結尾的部分。一共有兩種remove
#include #include #include printit(string& astring)
int main (void)
#include //
#include #include printit (const string& stringtoprint)
int main (void)
⑿insert() :
#include int main (void)
; list1.insert(list1.end(), &intarray[0], &intarray[2]);
}
⒀ 6 2 單鏈表元素定位 12分
本題要求在鍊錶中查詢第乙個資料域取值為x的節點,返回節點的位序。l是乙個帶頭結點的單鏈表,函式listlocate l linklist l,elemtype x 要求在鍊錶中查詢第乙個資料域取值為x的節點,返回其位序 從1開始 查詢不到則返回0。例如,原單鏈表各個元素節點的元素依次為1,2,3,4...
6 2 求單鏈表結點的階乘和
本題要求實現乙個函式,求單鏈表l結點的階乘和。這裡預設所有結點的值非負,且題目保證結果在int範圍內。函式介面定義 int factorialsum list l 其中單鏈表list的定義如下 typedef struct node ptrtonode struct node typedef ptr...
單鏈表(合併單鏈表)
單鏈表遍歷 單鏈表遍歷是從單鏈表頭指標head開始訪問,沿著next指標所指示的方向依次訪問每乙個結點,且每個結點只能訪問依次,直到最後乙個結點為止。遍歷時注意,不要改變head指標的指向。因此一般設定另外的乙個指標變數如p,p從head開始依次訪問乙個結點,直到鍊錶結束,此時p null,完成依次...