带环相交
#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; }
總結
- 上一篇: shell写的彩色进度条
- 下一篇: 复杂链表的赋值