久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2941|回復: 0
收起左側

C++語言判斷單鏈表是否有環鏈表 程序源碼

[復制鏈接]
ID:618366 發表于 2021-9-12 11:25 | 顯示全部樓層 |閱讀模式
1.問題:如果給定一個單鏈表,如何判斷其是否為有環鏈表
2.方法:
(1)從給定鏈表的第一個節點開始遍歷,每遍歷至一個節點,都將其和所有的前驅節點進行比對,如果為同一個節點,則表明當前鏈表中有環;反之,如果遍歷至鏈表最后一個節點,仍未找到相同的節點,則證明該鏈表中無環。
NBQ(S_`2~N$F_E2A_CB`P[2.png

如上所示,當函數的返回值為 True,表示該鏈表有環;反之若函數返回值為 False,表明鏈表中無環。顯然,此實現方案的時間復雜度為O(n2)。
(2)在一個鏈表中,如果 2 個指針(假設為 H1 和 H2)都從表頭開始遍歷鏈表,其中 H1 每次移動 2 個節點的長度(H1 = H1->next->next),而 H2 每次移動 1 個節點的長度(H2 = H2->next),如果該鏈表為有環鏈表,則 H1、H2 最終必定會相等;反之,如果該鏈表中無環,則 H1、H2 永遠不會相遇。
2.png

本算法的時間復雜度為 O(n)。

  1. #include<stdio.h>
  2. #include<stdlib.h>

  3. //自定義 bool 類型
  4. typedef enum Bool
  5. {
  6.     False=0,
  7.     True=1
  8. }Bool;

  9. typedef struct link{
  10.     int data;
  11.     struct link* next;
  12. }link;

  13. link *linkIint(int n)
  14. {
  15.     link *head=(link*)malloc(sizeof(link));
  16.     head->data=1;
  17.     head->next=NULL;
  18.     link *phead=head;
  19.     int i;
  20.     for(i=2;i<=n;i++)
  21.     {
  22.         link *temp=(link*)malloc(sizeof(link));
  23.         temp->data=i;
  24.         temp->next=NULL;

  25.         head->next=temp;
  26.         head=head->next;
  27.     }
  28.         head->next=phead;
  29.     return phead;
  30. }

  31. #if 1
  32. Bool HaveRing(link *temp)
  33. {
  34.     link *H2=temp;
  35.     link *H1=temp->next;
  36.         if(H2==NULL||H2==NULL)
  37.         {
  38.                 return False;
  39.         }
  40.     while(H1)
  41.     {
  42.         if(H1==H2)
  43.         {
  44.             printf("this links have a ring\n");
  45.             return True;
  46.         }
  47.         else
  48.         {
  49.             H1=H1->next;
  50.             if (!H1)
  51.             {
  52.                 printf("this links no ring\n");
  53.                 return False;
  54.             }
  55.             else
  56.             {
  57.                 H1=H1->next;
  58.                 H2=H2->next;
  59.             }
  60.         }
  61.     }
  62.     //鏈表中無環
  63.     printf("this links no ring\n");
  64.     return False;
  65. }
  66. #else

  67. Bool HaveRing(link *H)
  68. {
  69.     link * Htemp = H;
  70.     //存儲所遍歷節點所有前驅節點的存儲地址,64位環境下地址占 8 個字節,所以這里用 long long 類型
  71.     long long addr[20] = { 0 };
  72.     int length = 0, i = 0;
  73.         if(Htemp==NULL||Htemp->next==NULL)
  74.         {
  75.                 return False;
  76.         }
  77.     //逐個遍歷鏈表中各個節點
  78.     while (Htemp) {
  79.         //依次將 Htemp 和 addr 數組中記錄的已遍歷的地址進行比對
  80.         for (i = 0; i < length; i++) {
  81.             //如果比對成功,則證明有環
  82.             if (Htemp == (link*)addr[i]) {
  83.                 return True;
  84.             }
  85.         }
  86.         //比對不成功,則記錄 Htemp 節點的存儲地址
  87.         addr[length] = (long long)Htemp;
  88.         length++;
  89.         Htemp = Htemp->next;
  90.     }
  91.     return False;
  92. }

  93. #endif

  94. void linkPrint(link *temp)
  95. {
  96.         link *phead=temp;
  97.     if(!temp)
  98.         printf("the link is empty\n");
  99.     else
  100.     {
  101.         while(temp)
  102.         {
  103.             printf("%d\t",temp->data);
  104.             temp=temp->next;
  105.             if(temp==phead)
  106.             {
  107.                                 printf("\r\n");
  108.                 break;
  109.             }
  110.         }
  111.     }
  112. }

  113. int main()
  114. {
  115.     link *head=linkIint(6);
  116.     linkPrint(head);
  117.     if(HaveRing(head)==True)
  118.         {
  119.                 printf("the link has a ring\r\n");
  120.         }
  121.         else
  122.         {
  123.                 printf("the link no rave\r\n");
  124.         }
  125.     return 0;
  126. }
復制代碼


51hei.png

3.以上源碼: 有環鏈表判定.7z (1.09 KB, 下載次數: 5)

評分

參與人數 1黑幣 +30 收起 理由
admin + 30 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久精品91 | 亚洲国产18 | 精品三级在线观看 | 久草网在线视频 | 中文字幕日韩欧美一区二区三区 | 日韩av网址在线观看 | 红桃视频一区二区三区免费 | 中文字幕国产精品 | 国产精品久久久久久久午夜 | a级大片免费观看 | 欧美久久天堂 | 亚洲一区中文字幕在线观看 | h视频在线免费 | 激情婷婷 | 一级免费毛片 | 动漫www.被爆羞羞av44 | 久久免费视频1 | 久久精品一区 | 黄色av一区 | 精品国产乱码久久久久久中文 | 欧美在线综合 | 日韩欧美一二三区 | 日韩一区二区三区在线观看 | 欧美2区| 狠狠av| 懂色av蜜桃av | 少妇无套高潮一二三区 | 亚洲国产成人精品久久 | 一区二区三区不卡视频 | 极品电影院 | 久久综合九色综合欧美狠狠 | 91精品一区 | 日韩在线免费 | 美日韩免费视频 | 国产乱码精品一品二品 | 国产在线精品一区二区三区 | 免费看淫片 | 国产精品波多野结衣 | 亚洲免费影院 | 色婷综合网 | 国产精品久久久久一区二区三区 |