鍊錶基礎(關鍵是有指標呀,噁心死我了)

2021-10-04 23:20:45 字數 3743 閱讀 7255

//單鏈表的儲存結構(還有沒頭結點的)(但由於用的不多所以這裡不說) (鍊錶適合畫圖理解)

struct lnode//對於某些神奇的編譯器應當加上struct(保證編譯正確) head是首節點不是頭結點

lnode;

typedef lnode* linklist;

//寫函式題目的時候注意返回值和遍歷的時候注意首節點還是頭結點(是否有資料)(如果是少了乙個資料或多了個位址考慮一下這個)

//單鏈表的構造(頭插法)(逆序法)

#include

#include

void

create

(linklist &l,

int n)

//為使l能夠在函式中改變

}//單鏈表的構造(尾插法)

#include

#include

void

create

(linklist &l,

int n)

p1->next=

null

;//為什麼不能是p2,因為空鍊錶不行

}//單鏈表的查詢遍歷

bool

chazhao

(linklist l,

int i,

int&e)

//這裡的i表示第幾個元素

//單鏈表的插入

bool

charu

(linklist &l,

int i,

int example)

//單鏈表的刪除

bool

shanchu

(linklist &l,

int i)

/*

6-1 奇數值結點鍊錶 (20分)

本題要求實現兩個函式,分別將讀入的資料儲存為單鏈表、將鍊錶中奇數值的結點重新組成乙個新的鍊錶。鍊錶結點定義如下:

struct listnode ;

函式介面定義:

struct listnode *readlist();

struct listnode *getodd( struct listnode **l );

函式readlist從標準輸入讀入一系列正整數,按照讀入順序建立單鏈表。當讀到?1時表示輸入結束,函式應返回指向單鏈表頭結點的指標。

函式getodd將單鏈表l中奇數值的結點分離出來,重新組成乙個新的鍊錶。返回指向新煉表頭結點的指標,同時將l中儲存的位址改為刪除了奇數值結點後的鍊錶的頭結點位址(所以要傳入l的指標)。

裁判測試程式樣例:

#include #include struct listnode ;

struct listnode *readlist();

struct listnode *getodd( struct listnode **l );

void printlist( struct listnode *l )

printf("\n");

}int main()

/* 你的**將被嵌在這裡 */

輸入樣例:12

2345

67-1

輸出樣例:13

5722

46 作者: c課程組

單位: 浙江大學

時間限制:

400 ms

記憶體限制:

64 mb*/

#include

#include

struct listnode

;struct listnode *

readlist()

;struct listnode *

getodd

(struct listnode *

*l )

;void

printlist

(struct listnode *l )

printf

("\n");

}int

main()

/* 你的**將被嵌在這裡 */

struct listnode *

readlist()

} p1-

>next=

null

;//只能是p1(空鍊錶)

return lt-

>next;

}struct listnode *

getodd

(struct listnode *

*l )

//指標的指標,要得指標首先加*(我都暈了其實,,,,)

p=p-

>next;

} p1-

>next=

null

;//只能是p1(空鍊錶)

p=*l;while

(p->next)

p=*l;if

(p->data%2==

1)*l=p-

>next;

return l2-

>next;

}

/*

6-4 兩個有序鍊錶序列的合併 (15分)

本題要求實現乙個函式,將兩個鍊錶表示的遞增整數序列合併為乙個非遞減的整數序列。

函式介面定義:

list merge( list l1, list l2 );

其中list結構定義如下:

typedef struct node *ptrtonode;

struct node

;typedef ptrtonode list;

/* 定義單鏈表型別 */

l1和l2是給定的帶頭結點的單鏈表,其結點儲存的資料是遞增有序的;函式merge要將l1和l2合併為乙個非遞減的整數序列。應直接使用原序列中的結點,返回歸併後的帶頭結點的煉表頭指標。

裁判測試程式樣例:

#include

#include

typedef

int elementtype;

typedef

struct node *ptrtonode;

struct node

;typedef ptrtonode list;

list read()

;/* 細節在此不表 */

void

print

( list l )

;/* 細節在此不表;空煉表將輸出null */

list merge

( list l1, list l2 )

;int

main()

/* 你的**將被嵌在這裡 */

輸入樣例:31

3552

46810

輸出樣例:12

3456

810null

null

作者: ds課程組

單位: 浙江大學

時間限制:

400 ms

記憶體限制:

64 mb*/

list merge

( list l1, list l2 )

else}if

(pl1==

null

) p1-

>next=pl2;

if(pl2==

null

) p1-

>next=pl1;

l1->next=

null

; l2-

>next=

null

;return l;

}

雙指標(快慢指標)判斷鍊錶是否有環

單鏈表的特點是每個節點知道下乙個節點 如果用乙個指標來判斷是否有環,當沒有環時,指標一直會指到鍊錶的為即指到null,但是當有環時,指標將陷入死迴圈,因為環形鍊錶中沒有null指標作為尾部節點 while head null head head.next return false 找到一種經典解法 ...

快慢指標判斷鍊錶是否有環

關於鍊錶是否有環,其實是一系列問題,主要包括以下幾個 使用快慢指標fast和slow,fast每次走兩步,slow每次走一步,如果有環,肯定會相遇,如果沒有,則指標fast遇到null退出。追及相遇問題。在環上相遇後,記錄第一次相遇點為pos,之後指標slow繼續每次走1步,fast每次走2步。在下...

使用快慢指標判斷鍊錶是否有環

今天做到leetcode 141 linked list cycle,判斷鍊錶是否存在環,因為看到題目中的val都是整數,所以我是將每個node用1.1作為值去mark了,如果head.next的val是1.1,就說明我指向的下個結點已經走過了,這就是乙個環,如果走到最後head走到none了還沒返...