日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux C 学习 单向链表

發布時間:2023/12/9 linux 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux C 学习 单向链表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近從Linux C數據結構和算法學起,下面是一個單向鏈表的寫法,代碼如下:

[cpp]?view plaincopy
  • #include?<stdio.h>??
  • #include?<malloc.h>??
  • ??
  • ??
  • int?n=0;??
  • typedef?struct?code??
  • {??
  • ?int?data;??
  • ?struct?code?*next;??
  • }List;??
  • ??
  • ??
  • List?*creatlink()??
  • {??
  • ?List?*head;??
  • ?List?*p1;??
  • ?List?*p2;??
  • ?head=NULL;??
  • ?p1=(List?*)malloc(sizeof(List));??
  • ?p2=(List?*)malloc(sizeof(List));??
  • ?printf("Please?print?the?data?you?want:(end?is?0)\n");??
  • ?scanf("%d",&p1->data);??
  • ?while(p1->data!=0)??
  • ?{??
  • ???n++;??
  • ???if(n==1)??
  • ????{??
  • ?????head=p1;??
  • ????}??
  • ????else??
  • ?????{??
  • ???????p2->next=p1;??
  • ?????}??
  • ???????p2=p1;??
  • ???????p1=(List?*)malloc(sizeof(List));??
  • ???????scanf("%d",&p1->data);??
  • ????????//?printf("\n%d\n",p1->data);??
  • ???}??
  • ???free(p1);??
  • ???p2->next=NULL;??
  • ???return(head);???
  • }??
  • ??
  • ??
  • void?Print(List?*head)??
  • {??
  • ?List?*p;??
  • ?p=head;??
  • ?if(head!=NULL)??
  • ???do??
  • ??{??
  • ???printf("[%d]->",p->data);??
  • ???p=p->next;??
  • ??}??
  • ??while(p!=NULL);??
  • ??printf("\nover!\n");??
  • ???
  • }??
  • ??
  • ??
  • int?main()??
  • {??
  • ?List?*head;??
  • ?head=creatlink();??
  • ?Print(head);??
  • ?return(0);??
  • }??



  • 結果如下:


    單向鏈表建立容易犯錯誤的是這一塊:

    ??if(n==1)
    ? ? {
    ? ? ?head=p1;
    ? ? }
    ? ? else
    ? ? ?{
    ? ? ? ?p2->next=p1;
    ? ? ?}
    ? ? ? ?p2=p1;
    ? ? ? ?p1=(List *)malloc(sizeof(List));
    ? ? ? ?scanf("%d",&p1->data);
    ? ? ? ? // printf("\n%d\n",p1->data);
    ? ?}

    先判定頭指針,然后再重新為p1申請一片內存,來存放下一個鏈表里的內容


    malloc()最容易出現的問題是內存泄露,所以一定要記得free();


    下面有個例子:

    兄弟問:" free(p);p=NUll;",為啥free(p)之后,還要置p=NULL呢?有必要么?


    free(p)只是將p指向的空間釋放掉了,但是p并不等于NULL;

    code:

    int main()
    {
    ??? int *p;
    ??? p = (int *)malloc(sizeof(int) * 10);
    ??? printf("before free:? p=%p\n",p);
    ??? free(p);
    ??? printf("after free: p = %p\n",p);
    ??? printf("%d\n",p[0]);
    ??? p=NULL;
    ??? printf("%d\n",p[0]);
    }


    result:
    before free:? p=0x8fa7008
    after free: p = 0x8fa7008
    0
    段錯誤

    也就是p雖然有值,但其指向的空間已經被釋放掉了。如果在后續的code中再用到p,就會出現錯誤,而這種錯誤是不太明顯的。如果顯式的置為null的話,就可以使錯誤馬上顯現出來。從而避免了調試程序中種種詭異的麻煩。

    結論:
    ?????????? 如果在程序中free(p)之后,p不會再用,則令p=NULL無所謂。
    ?????????? 如果在程序中free(p)之后,p還會用到,則令p=NULL,還原p為純凈的變量,便于以后差錯。

    總結

    以上是生活随笔為你收集整理的Linux C 学习 单向链表的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。