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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

带环相交

發布時間:2024/4/11 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 带环相交 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main (void)
{
int i;
for(i=0; i<2; i++){
fork ();
printf ("-");
}

return 0;

}

如果你對 fork ()的機制比較熟悉的話,這個題并不難,輸出應該是 6 個“-”,但是,實際上這個程序會很 tricky 地輸出 8 個“-”。

  要講清這個題,我們首先需要知道 fork ()系統調用的特性,

  • fork ()系統調用是 Unix 下以自身進程創建子進程的系統調用,一次調用,兩次返回,如果返回是0,則是子進程,如果返回值>0,則是父進程(返回值是子進程的 pid),這是眾為周知的。
  • 還有一個很重要的東西是,在 fork ()的調用處,整個父進程空間會原模原樣地復制到子進程中,包括指令,變量值,程序調用棧,環境變量,緩沖區,等等。

  所以,上面的那個程序為什么會輸入 8 個“-”,這是因為 printf (“-”);語句有 buffer,所以,對于上述程序,printf (“-”);把“-”放到了緩存中,并沒有真正的輸出(參看《C語言的迷題》中的第一題),在 fork 的時候,緩存被復制到了子進程空間,所以,就多了兩個,就成了 8 個,而不是 6 個。

#include<iostream> #include<assert.h> using namespace std;struct ListNode { int data; ListNode* pNext; }; int length(ListNode* l) { if(l==NULL) return 0; int count=0; while(l) { l=l->pNext; count++; } return count;} ListNode* Isexistloop(ListNode* pHead) { assert(pHead); ListNode* fast=pHead; ListNode* slow=pHead; while(fast&&fast->pNext) { fast=fast->pNext->pNext; slow=slow->pNext; if(slow=fast) return ?slow; } return NULL; } ListNode* Notloop(ListNode* p1,ListNode* p2) { if(p1==NULL&&p2==NULL) return NULL; ListNode* node1=p1; int c1=length(p1); cout<<c1<<endl; ListNode* node2=p2; int c2=length(p2); cout<<c2<<endl; int min=c1-c2; if(min>0) { while(min) { node1=node2->pNext; min--; } } else { int tem=0; tem-=min; while(tem) { node2=node2->pNext; tem--; } } while(node1!=node2&&node1!=NULL&&node2!=NULL) { node1=node1->pNext; node2=node2->pNext; } if(node1==NULL||node2==NULL) return NULL; else return node1; }ListNode* ?IsListCroseWithCycle(ListNode* p1,ListNode* p2) { assert(p1); assert(p2); ListNode* ?NL; ListNode* lm1=Isexistloop(p1); ListNode* lm2=Isexistloop(p2); if(lm1==NULL&&lm2==NULL) { NL= Notloop(p1,p2); } else if((lm1==NULL&&lm2)||(lm1&&lm2==NULL)) return NULL; else//p1 p2都帶環 { while(lm1!=lm1->pNext) { if(lm1==lm2) return lm1; lm1=lm1->pNext; } if(lm1==lm2) return lm1; else return NULL; } }void ?Insertlist(ListNode **pHead,int value) { ListNode* node=new ListNode(); node->data=value; node->pNext=NULL; if(*pHead==NULL) *pHead=node; else { ListNode* p=*pHead; while(p->pNext!=NULL) { p=p->pNext; } p->pNext=node; } } void print(ListNode* pHead) { ListNode* ?p=pHead; while(p) { cout<<p->data<<" "; p=p->pNext; } cout<<endl; }

總結

以上是生活随笔為你收集整理的带环相交的全部內容,希望文章能夠幫你解決所遇到的問題。

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