2013-04-11 66 views
1
#include<stdio.h> 
#include<conio.h> 

struct GNode{ 
    struct gnode* nextnode; 
    struct gnode* arcptr; 
    int Visited; 
} 

typedef struct GNode* Grnd; 

struct ArcNode{ 
    struct arcnode* nextarc; 
    struct acrnode* ndptr; 
} 

typedef struct ArcNode* Arc; 

Grnd getGraphNode(){ 
    Grnd NewNode=(Grnd)malloc(sizeof(struct GNode)); 

    NewNode->nextnode=NULL; 
    NewNode->arcptr=NULL; 

    return NewNode; 
} 

Arc getArcNode(){ 
    Arc NewArc=(Arc)malloc(sizeof(struct ArcNode)); 

    NewArc->nextarc=NULL; 
    NewArc->ndptr=NULL; 

    return NewArc; 
} 

void join(Grnd *GNode1,Grnd *GNode2){ 
    Arc NewArc=getArcNode(); 
    NewArc->ndptr=(*GNode2); 

    NewArc->nextarc=(*GNode1)->arcptr; 
    (*GNode1)->arcptr=NewArc; 
} 

Grnd addNode(Grnd *Graph){ 
    Grnd NewNode=getGraphNode(); 

    if((*Graph)==NULL){ 
     (*Graph)=NewNode; 
     return NewNode; 
    } 

    while((*Graph)->nextnode!=NULL) 
     Graph=Graph->nextnode; 

    (*Graph)->nextnode=NewNode; 

    return NewNode; 
} 

考慮到上面的C代碼:我很擔心,當我調用join函數來連接兩個圖形節點時,它會真正加入它們嗎?因爲只要程序超出join的範圍,NewArc就不存在。因此,當我在創建圖表後嘗試查找給定節點的所有相鄰節點時,我能夠嗎?爲什麼?指向c中結構的指針的範圍?

+0

但'NewArc'只是一個指針類型,是嗎?指向的內存由'malloc()'分配,並且在釋放之前將繼續有效。 – cdhowie 2013-04-11 16:05:15

回答

2

因爲一旦程序超出加入範圍,NewArc 不存在。

沒錯!指針本身消失,,但它指向的內存仍然有,分配給你。所以你可以繼續通過其他指針來引用它,直到你free它。


(*GNode1)->arcptr=NewNode; 

我認爲你的意思NewArc,而不是NewNode

+0

編號NewNode甚至不是join中的變量。我創建了NewArc,它是一個新的Arc節點,代表從GNode1發出並終止於GNode2的弧。我將該弧節點放在GNode1發出的弧的鄰接列表的前面。 – 10111 2013-04-11 16:15:54

+0

@ 10111那麼,我看到你編輯:-)這就是我的意思。 – cnicutar 2013-04-11 16:17:26