<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單向鏈表基本操作的遞歸實現(xiàn)

          單向鏈表基本操作的遞歸實現(xiàn)

          作者: 時間:2016-12-01 來源:網絡 收藏

          /*最大值*/
          int max_list(List *head)
          {
          int max = 0;
          int temp;
          if(NULL == head)
          {
          printf("Error: NULL pointer...");
          }

          本文引用地址:http://www.ex-cimer.com/article/201612/324524.htm

          if(NULL != head && head->next == NULL)
          {
          return head->val;
          }

          else
          {
          temp = max_list(head->next);

          max = (head->val > temp ? head->val : temp);

          return max;
          }
          }

          /*最小值*/
          int min_list(List *head)
          {
          int min = 0;
          int temp;

          if(NULL == head)
          {
          printf("Error: NULL pointer...");
          }

          if(NULL != head && head->next == NULL)
          {
          returnhead->val;
          }

          else
          {
          temp = min_list(head->next);

          min = (head->val < temp ? head->val : temp);

          return min;
          }
          }

          /*創(chuàng)建鏈表*/
          List* create_list(int val)
          {
          List *head = (List *)malloc(sizeof(List)/sizeof(char));

          if(NULL == head)
          {
          return NULL;
          }

          head->val = val;

          head->next= NULL;

          return head;
          }

          /*插入節(jié)點*/
          List* insert_listnode(List *head, int val)
          {
          List *temp;
          if(NULL == head)
          {
          return NULL;
          }

          temp = (List *)malloc(sizeof(List)/sizeof(char));
          temp->val = val;
          temp->next = head;
          head = temp;

          returnhead;
          }

          /*刪除鏈表*/
          void delete_list(List *head)
          {
          List *temp = NULL;
          if(head != NULL)
          {
          temp = head;
          head = head->next;
          free(temp);
          temp = NULL;

          delete_list(head);
          }
          }

          int main()
          {
          int n = 0;
          int i = 0;
          List *head= create_list(10);

          for(i = 0; i < 10; ++ i)
          {
          n = 1 + (int)(10.0*rand()/(RAND_MAX + 1.0));

          head = insert_listnode(head, n);
          }

          fdprint_listnode(head);

          printf("");

          bkprint_listnode(head);

          printf("%d", count_listnode(head));

          printf("");
          #if 10
          head = delete_node(head, 10);
          fdprint_listnode(head);
          printf("");

          bkprint_listnode(head);
          printf("");
          #endif

          #if 10
          head = delete_allnode(head, 10);
          fdprint_listnode(head);

          printf("");

          bkprint_listnode(head);
          #endif

          printf("max = %d",max_list(head));
          printf("max = %d",min_list(head));
          delete_list(head);

          head = NULL;

          if(head== NULL)
          {
          printf("ERROR:null pointer!...");
          }
          return 0;
          }

          遞歸中需要注意的思想我任務就是為了解決當前的問題,我完成最簡單的一部操作,其他的由別人去完成,比如漢諾塔中的第一個和尚讓第二個和尚把前63個金盤放在B處,而他自己只需要完成從A到C的搬運,實質上他自己完成的只有一部最簡答的,但是搬運這種動作有存在非常大的相似性。

          因此為了解決當前的問題f(n),就需要解決問題f(n-1),而f(n-1)的解決就需要解決f(n-2),這樣逐層的分解,分解成很多相似的小事件,當最小的事件解決完成以后,就能解決高層次的事件,這種逐層分解,逐層合并的方式就構成了遞歸的思想,最主要的要找到遞歸的出口和遞歸的方式,搞清楚了這兩個,實現(xiàn)一個遞歸問題相對來說就比較簡單啦。

          但是遞歸也存在問題,特別是深層次的遞歸可能導致??臻g的溢出,因為堆??臻g的大小并不是無限大的,特別當遞歸中數據量特別大的情況下,遞歸很有可能導致棧空間的溢出,因此遞歸并不是萬能的,但是遞歸確實是一種思考問題的方式,一種反向思考的形式,從結果到具體的小過程。當然具體的問題就要具體分析啦。

          用一句簡單的話記住遞歸就是:我完成最簡單的那一步,其他的復雜的相似問題都找別人去做吧。


          上一頁 1 2 下一頁

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();