6 2單鏈表

2021-06-23 03:07:37 字數 3177 閱讀 7553

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 node  

;  int main()  

struct node *s=head->next; //將s指向鍊錶的第乙個結點

while(s->next!=null)   //判斷是否是鍊錶最後乙個元素就是要判斷該元素的next指標是否為空

printf("%d\n",s->data); //輸出最後乙個結點的資料並輸出換行

return 0;  

}

10.例題:uva-11988 這個**會tle,但是思路對,這是建表的乙個好的練習

#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,完成依次...