自己理解的:
鏈表是爲解決輸入一些很大的數據,相當於數組的,但又不同於數組的工具,鏈表生成的內存空間是不連續的,而數組申請的空間是連續,在實際情況中鏈表是比數組應用的廣泛的,因爲在計算機的內存是像一塊蜂窩煤,根本不會給一整塊的內存空間讓你使用的,所以把單塊的內存空間連起來當成一整塊內存用,就很合理了;這就是鏈表的作用。
鏈表是有一個個的結構體組成的,我把它稱爲一個節點,就像冰糖葫蘆上的山楂果一樣,而指針就是冰糖葫蘆的竹籤,將單個的內存拼接成一個大的內存;一個節點又可以分成指針域和數據域,指針域就是用來將單個的內存鏈接起來,而數據域就是用來儲存數據的。
頭指針的數據域必須爲空,如果頭指針的數據域不爲空,想要調用數據,再申請一個指針指向頭指針的話,等於把頭指針給換了,而爲節點的指針域必須爲空,否則會出現指針亂指的情況。
在鏈表的生成中部要選擇尾插法,因爲每鏈接一個節點就要遍歷一次,效率不高;應該選擇在第一個節點之後插入新生成的節點,這樣就只需要遍歷一次就完成了。
如果選擇頭插發的話,遍歷輸出的結果會與出入的結果相反。
代碼:#include<iostream>
#include<cstdlib>
using namespace std;
struct student
{
int num; //數據域
struct student *next;//指針域
};
int main()
{
struct student *p, *q, *head=NULL;
int i;
for(i=0;i<3;i++)
{
p=(struct student*)malloc(sizeof(struct student));//申請內存空間,空間大小和結構體的字節大小一樣
p->num=i;//輸入數據域的數據
if(head==NULL)//判斷該頭結點是否指向第一個節點
head=p;//將頭指針指向第一個申請的第一個節點
q=p//用指針q記住p的地址,如果不記住p的地址的話,再次申請的P會把上次申請的地址給覆蓋了,就無法完成節點的鏈接;
else
q->next=p;//將指針域指向下一個申請的地址,完成節點的鏈接
q=p;//同上
}
q->next=NULL;//將爲節點的指針域指向空,這樣就可以是的尾節點可以判斷出來了
//單向鏈表的遍歷和輸出
p=head;//用P指針記住頭結點的位置,不能改變頭結點的位置,否則會找不到該鏈表
while(p !=NULL)//判斷該節點是否是尾結點
{
cout<<p->num<<endl;//輸出每個節點的數據域
p=p->next;//遍歷
}
//將申請的空間給釋放掉
while(head!=NULL)//判斷是否釋放到僞結點
{
p=head;//將頭結點的地址給指針p,否則釋放空間從頭節點開始的話,只能釋放了頭結點,而找不到以後的節點
head=head->next;//遍歷
free(p);//釋放
}
return 0;
}
BY朱夏彤