带环相交
#include <sys/types.h>
#include <unistd.h>
int main (void)
{
int i;
for(i=0; i<2; i++){
fork ();
printf ("-");
}
return 0;
}
如果你對(duì) fork ()的機(jī)制比較熟悉的話,這個(gè)題并不難,輸出應(yīng)該是 6 個(gè)“-”,但是,實(shí)際上這個(gè)程序會(huì)很 tricky 地輸出 8 個(gè)“-”。
要講清這個(gè)題,我們首先需要知道 fork ()系統(tǒng)調(diào)用的特性,
- fork ()系統(tǒng)調(diào)用是 Unix 下以自身進(jìn)程創(chuàng)建子進(jìn)程的系統(tǒng)調(diào)用,一次調(diào)用,兩次返回,如果返回是0,則是子進(jìn)程,如果返回值>0,則是父進(jìn)程(返回值是子進(jìn)程的 pid),這是眾為周知的。
- 還有一個(gè)很重要的東西是,在 fork ()的調(diào)用處,整個(gè)父進(jìn)程空間會(huì)原模原樣地復(fù)制到子進(jìn)程中,包括指令,變量值,程序調(diào)用棧,環(huán)境變量,緩沖區(qū),等等。
所以,上面的那個(gè)程序?yàn)槭裁磿?huì)輸入 8 個(gè)“-”,這是因?yàn)?printf (“-”);語(yǔ)句有 buffer,所以,對(duì)于上述程序,printf (“-”);把“-”放到了緩存中,并沒有真正的輸出(參看《C語(yǔ)言的迷題》中的第一題),在 fork 的時(shí)候,緩存被復(fù)制到了子進(jìn)程空間,所以,就多了兩個(gè),就成了 8 個(gè),而不是 6 個(gè)。
#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都帶環(huán) { 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; }
總結(jié)
- 上一篇: shell写的彩色进度条
- 下一篇: 复杂链表的赋值