数据结构课上笔记5
介紹了鏈表和基本操作
用一組物理位置任意的存儲(chǔ)單元來存放線性表的數(shù)據(jù)元素。 這組存儲(chǔ)單元既可以是連續(xù)的,也可以是不連續(xù)的,甚至是零散分布在內(nèi)存中的任意位置上的。因此,鏈表中元素的邏輯次序和 物理次序不一定相同。
?
定義:
typedef struct Lnode{ //聲明結(jié)點(diǎn)的類型和指向結(jié)點(diǎn)的指針類型 ElemType data; //數(shù)據(jù)元素的類型 struct Lnode *next; //指示結(jié)點(diǎn)地址的指針 }Lnode, *LinkList; struct Student { char num[8]; //數(shù)據(jù)域char name[8]; //數(shù)據(jù)域int score; //數(shù)據(jù)域struct Student *next; // next 既是 struct Student // 類型中的一個(gè)成員,又指 // 向 struct Student 類型的數(shù)據(jù)。 }Stu_1, Stu_2, Stu_3, *LL;頭結(jié)點(diǎn):在單鏈表的第一個(gè)結(jié)點(diǎn)之前人為地附設(shè)的一個(gè)結(jié)點(diǎn)。
帶頭結(jié)點(diǎn)操作會(huì)方便很多。
帶和不帶的我都寫過了
下面列出我見過的一些好題
1、
線性表的每個(gè)結(jié)點(diǎn)只能是一個(gè)簡(jiǎn)單類型,而鏈表的每個(gè)結(jié)點(diǎn)可以是一個(gè)復(fù)雜類型。
- 正確
- 錯(cuò)誤
?
錯(cuò),線性表是邏輯結(jié)構(gòu)概念,可以順序存儲(chǔ)或鏈?zhǔn)絻?chǔ),與元素?cái)?shù)據(jù)類型無關(guān)。鏈表就是線性表的一種 ?前后矛盾
?
2、
若某線性表中最常用的操作是在最后一個(gè)元素之后插入一個(gè)元素和刪除第一個(gè)元素,則采用( ???)存儲(chǔ)方式最節(jié)省運(yùn)算時(shí)間。
- 單鏈表
- 僅有頭指針的單循環(huán)鏈表
- 雙鏈表
- 僅有尾指針的單循環(huán)鏈表
對(duì)于A,B,C要想在尾端插入結(jié)點(diǎn),需要遍歷整個(gè)鏈表。
對(duì)于D,要插入結(jié)點(diǎn),只要改變一下指針即可,要?jiǎng)h除頭結(jié)點(diǎn),只要?jiǎng)h除指針.next的元素即可。
?
3、注意:線性表是具有n個(gè)數(shù)據(jù)元素的有限序列,而不是數(shù)據(jù)項(xiàng)
?
4、
以下關(guān)于單向鏈表說法正確的是
- 如果兩個(gè)單向鏈表相交,那他們的尾結(jié)點(diǎn)一定相同
- 快慢指針是判斷一個(gè)單向鏈表有沒有環(huán)的一種方法
- 有環(huán)的單向鏈表跟無環(huán)的單向鏈表不可能相交
- 如果兩個(gè)單向鏈表相交,那這兩個(gè)鏈表都一定不存在環(huán)
自己多畫畫想想就明白了,關(guān)于快慢指針我以后會(huì)寫總結(jié)。
?
5、
鏈接線性表是順序存取的線性表?。?(?)
- 正確
- 錯(cuò)誤
鏈接線性表可以理解為鏈表
線性表分為順序表和鏈表
順序表是順序存儲(chǔ)結(jié)構(gòu)、隨機(jī)存取結(jié)構(gòu)
鏈表是隨機(jī)存儲(chǔ)結(jié)構(gòu)、順序存取結(jié)構(gòu)
?
6、
typedef struct node_s{int item;struct node_s* next; }node_t; node_t* reverse_list(node_t* head) {node_t* n=head;head=NULL;while(n){_________ }return head;}空白處填入以下哪項(xiàng)能實(shí)現(xiàn)該函數(shù)的功能?
- node_t* m=head; head=n; head->next=m; n=n->next;
- node_t* m=n; n=n->next; m->next=head; head=m;
- node_t* m=n->next; n->next=head; n=m; head=n;
- head=n->next; head->next=n; n=n->next;
?
代碼的功能是要實(shí)現(xiàn)鏈表的反轉(zhuǎn)。為了方便闡述,每個(gè)結(jié)點(diǎn)用①②③④⑤⑥等來標(biāo)示。
在執(zhí)行while(n)循環(huán)之前,有兩句代碼:
| node_t* n=head; head=NULL; |
這兩行代碼的中:第一句的作用是用一個(gè)臨時(shí)變量n來保存結(jié)點(diǎn)①,第二句是把head修改為NULL。
然后就開始遍歷了,我們看到while循環(huán)里的那四句代碼:
node_t* m=n; n=n->next; m->next=head; head=m;先看前兩句,用m來保存n,然后讓n指向n的下一個(gè)結(jié)點(diǎn),之所以復(fù)制 n 給 m ,是因?yàn)?n 的作用其實(shí)是? 控制while循環(huán)次數(shù)? 的作用,每循環(huán)一次它就要被修改為指向下一個(gè)結(jié)點(diǎn)。
再看后兩句,變量head在這里像是一個(gè)臨時(shí)變量,后兩句讓 m 指向了 head,然后 head 等于 m。
?
7、
若某表最常用的操作是在最后一個(gè)結(jié)點(diǎn)之后插入一個(gè)節(jié)點(diǎn)或刪除最后一二個(gè)結(jié)點(diǎn),則采用()省運(yùn)算時(shí)間。
- 單鏈表
- 雙鏈表
- 單循環(huán)鏈表
- 帶頭結(jié)點(diǎn)的雙循環(huán)鏈表
D
帶頭結(jié)點(diǎn)的雙向循環(huán)鏈表,頭結(jié)點(diǎn)的前驅(qū)即可找到最后一個(gè)結(jié)點(diǎn),可以快速插入,再向前可以找到最后一二個(gè)結(jié)點(diǎn)快速刪除
單鏈表找到鏈表尾部需要掃描整個(gè)鏈表
雙鏈表找到鏈表尾部也需要掃描整個(gè)鏈表
單循環(huán)鏈表只有單向指針,找到鏈表尾部也需要掃描整個(gè)鏈表
?
8、
單鏈表的存儲(chǔ)密度( ?)
- 大于1
- 等于1
- 小于1
- 不能確定
全麥白
存儲(chǔ)密度 = 數(shù)據(jù)項(xiàng)所占空間 / 結(jié)點(diǎn)所占空間
?
9、完成在雙循環(huán)鏈表結(jié)點(diǎn)p之后插入s的操作是
- s->prior=p; s->next=p->next; p->next->prior=s ; p->next=s;
?
10、用不帶頭結(jié)點(diǎn)的單鏈表存儲(chǔ)隊(duì)列,其隊(duì)頭指針指向隊(duì)頭結(jié)點(diǎn),隊(duì)尾指針指向隊(duì)尾結(jié)點(diǎn),則在進(jìn)行出隊(duì)操作時(shí)()
- 僅修改隊(duì)頭指針
- 僅修改隊(duì)尾指針
- 隊(duì)頭、隊(duì)尾指針都可能要修改
- 隊(duì)頭、隊(duì)尾指針都要修改
?
當(dāng)只有一個(gè)元素,出隊(duì)列時(shí),要將隊(duì)頭和隊(duì)尾,指向-1.所以說隊(duì)頭和隊(duì)尾都需要修改
?
?
鏈表刷了幾百道吧,好題還有很多,以后接著更新
總結(jié)
- 上一篇: 最大搜索子树
- 下一篇: java常用类介绍及源码阅读(Array