剛學了鏈表的生成,遍歷,釋放,自己將鏈表的定義給自我解釋了一下,也將老師的模板給註釋了一下,不知道自己理解的是否正確,求大神指教

自己理解的

     鏈表是爲解決輸入一些很大的數據,相當於數組的,但又不同於數組的工具,鏈表生成的內存空間是不連續的,而數組申請的空間是連續,在實際情況中鏈表是比數組應用的廣泛的,因爲在計算機的內存是像一塊蜂窩煤,根本不會給一整塊的內存空間讓你使用的,所以把單塊的內存空間連起來當成一整塊內存用,就很合理了;這就是鏈表的作用。

     鏈表是有一個個的結構體組成的,我把它稱爲一個節點,就像冰糖葫蘆上的山楂果一樣,而指針就是冰糖葫蘆的竹籤,將單個的內存拼接成一個大的內存;一個節點又可以分成指針域和數據域,指針域就是用來將單個的內存鏈接起來,而數據域就是用來儲存數據的。

     頭指針的數據域必須爲空,如果頭指針的數據域不爲空,想要調用數據,再申請一個指針指向頭指針的話,等於把頭指針給換了,而爲節點的指針域必須爲空,否則會出現指針亂指的情況。

     在鏈表的生成中部要選擇尾插法,因爲每鏈接一個節點就要遍歷一次,效率不高;應該選擇在第一個節點之後插入新生成的節點,這樣就只需要遍歷一次就完成了。

    如果選擇頭插發的話,遍歷輸出的結果會與出入的結果相反。


代碼:#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朱夏彤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章