測試樣例

請輸入圖頂點個數(shù)!
6
請輸入連通的兩個點,以輸入0 0結(jié)束!
1 2
1 3
2 4
5 6
6 3
4 3
0 0
你輸入的圖為:
0 1 1 0 0 0
1 0 0 1 0 0
1 0 0 1 0 1
0 1 1 0 0 0
0 0 0 0 0 1
0 0 1 0 1 0
請輸入你的操作類型:
        退出 0
        圖的邊數(shù) 1
        任何兩個頂點是否相連 2
        求一個頂點的度是多少 3
1
圖的邊數(shù)為: 6
請輸入你的操作類型:
        退出 0
        圖的邊數(shù) 1
        任何兩個頂點是否相連 2
        求一個頂點的度是多少 3
2
請輸入兩個頂點的位置!
1 3
頂點1與頂點3相連!
請輸入你的操作類型:
        退出 0
        圖的邊數(shù) 1
        任何兩個頂點是否相連 2
        求一個頂點的度是多少 3
2
請輸入兩個頂點的位置!
1 6
頂點1與頂點6不相連!
請輸入你的操作類型:
        退出 0
        圖的邊數(shù) 1
        任何兩個頂點是否相連 2
        求一個頂點的度是多少 3
3
請輸入頂點:
3
頂點3的度為:3
請輸入你的操作類型:
        退出 0
        圖的邊數(shù) 1
        任何兩個頂點是否相連 2
        求一個頂點的度是多少 3
0
Press any key to continue

代碼如下
#include<stdio.h>
#include
<stdlib.h>
typedef 
struct ArcNode
{
    
int adjves;
    
//int weight;
    struct ArcNode * nextarc;
}
ArcNode;
typedef 
struct
{
    
int data;
    ArcNode firstarc;
}
AdjList;
typedef 
struct
{
    AdjList 
*vertices;
    
int vexnum, arcnum;
}
ALGraph;
ALGraph alg;
int str[100][100= {0};
/////////////////////////////////////
void initail();//初始化鄰接表 
void insert(int i, int j);//向鄰接表插入一條邊 
void printAlg();//打印鄰接表 
void DfsTraverseALG(int i);//深優(yōu)遍歷 
void DfsALG(int i, int *visit);///深優(yōu)遍歷主體 
void printMgraph();//打印矩陣 
int Arcs(int i);//求某個頂點的度 
bool isArc(intint);//某兩個點是否相連 
int getArcnumOfGraph();//獲得圖的邊數(shù) 
int main()
{
    
int i, j, k;
    scanf(
"%d"&(alg.vexnum));
    initail();
    
while (1)
    
{
        printf(
"->");
        scanf(
"%d%d"&i, &j);//按題意輸入的點序號都大于0 
        if (i == 0 && j == 0)
        
{
            
break;
        }

        insert( i,  j);
    }

    printAlg();
    printf(
"DfsTraverseALG:\n");
    DfsTraverseALG(
1);
    printf(
"請輸入你的操作類型:\n");
    printf(
"退出 0\n");
    printf(
"圖的邊數(shù) 1\n");
    printf(
"任何兩個頂點是否相連 2\n");
    printf(
"求一個頂點的度是多少 3\n");
    
while (1)
    
{
        scanf(
"%d"&k);
        
if (k == 0)
        
{
            
break;
        }

        
else if (k == 1)
        
{
            printf(
"圖的邊數(shù)為:%d\n", getArcnumOfGraph());
        }

        
else if (k == 2)
        
{
            printf(
"請輸入兩個頂點的位置!\n");
            scanf(
"%d%d"&i, &j);
            
if (isArc(i - 1, j))
            
{
                printf(
"頂點%d與頂點%d相連!\n", i, j);
            }

            
else
            
{
                printf(
"頂點%d與頂點%d不相連!\n", i, j);
            }

        }

        
else if (k == 3)
        
{
            printf(
"請輸入頂點:\n");
            scanf(
"%d"&i);
            printf(
"頂點%d的度為:%d\n",i, Arcs(i - 1));
        }

        
else
        
{
            printf(
"輸入錯誤,請重新輸入\n");
        }

    }

    system(
"pause");
    
return 0;    
}

void initail()
{
    
int n = alg.vexnum;
    alg.arcnum 
= 0;
    
int i;
    alg.vertices 
= (AdjList*)malloc(n * sizeof(AdjList));
    
for (i = 0; i < n; i++)
    
{
        alg.vertices[i].firstarc.nextarc 
= NULL;
        alg.vertices[i].data 
= i + 1;
    }

}

void insert(int i, int j)
{
    i
--;
    j
--;
    ArcNode 
*p;
    p 
= (ArcNode*)malloc(sizeof(ArcNode));
    p
->adjves = j + 1;
    p
->nextarc = alg.vertices[i].firstarc.nextarc;//復(fù)制鄰接表頂點的鄰接點 
    alg.vertices[i].firstarc.nextarc = p;
    p 
= (ArcNode*)malloc(sizeof(ArcNode));
    p
->adjves = i + 1;
    p
->nextarc = alg.vertices[j].firstarc.nextarc;//復(fù)制鄰接表頂點的鄰接點 
    alg.vertices[j].firstarc.nextarc = p;
    alg.arcnum
++;//邊數(shù)加一    
}


void printAlg()
{
    
int i;
    ArcNode 
*p;
    
for (i = 0; i < alg.vexnum; i++)
    
{
        printf(
"%d:\t", i + 1);
        p 
= alg.vertices[i].firstarc.nextarc;
        
while (p != NULL)
        
{
            printf(
"%d\t", p->adjves);
            p 
= p->nextarc;
        }

        printf(
"\n");
    }

}


/////////////////////////////////////////////////
void DfsTraverseALG(int i)
{
    
int j, n = alg.vexnum;
    
int *visit = (int*)malloc(alg.vexnum * sizeof(int));
    i
--;
    
for (j = 0; j < alg.vexnum; j++)
    
{
        visit[j] 
= 0;
    }

    
for (j = 0; j < alg.vexnum; j++)
    
{
        
if (visit[j] == 0)
        
{
            DfsALG(i, visit);
        }

    }

    printf(
"\n");
    printMgraph();
//////////////////
    free(visit);
}

void DfsALG(int i, int *visit)
{
    ArcNode 
*p;
    
int j;
    visit[i] 
= 1;
    printf(
"%d\t", alg.vertices[i].data);
    p 
= alg.vertices[i].firstarc.nextarc;
    
while (p != NULL)
    
{
        j 
= p->adjves - 1;
        str[i][j] 
= 1;
        
if (visit[j] == 0)
        
{
            DfsALG(j, visit);
        }

        p 
= p->nextarc;
    }

}

void printMgraph()
{
    
int i, j;
    printf(
"Mgraph:\n");
    
for (i = 0; i < alg.vexnum; i++)
    
{
        
for (j = 0; j < alg.vexnum; j++)
        
{
            printf(
"%d ", str[i][j]);
        }

        printf(
"\n");
    }

}

//////////////////////////////////////////////            

int Arcs(int i)
{
    
int j = 0;
    ArcNode 
*= alg.vertices[i].firstarc.nextarc;
    
while (p != NULL)
    
{
        j
++;
        p 
= p->nextarc;
    }

    
return j;
}

bool isArc(int i, int j)
{
    ArcNode 
*= alg.vertices[i].firstarc.nextarc;
    
while (p != NULL)
    
{
        
if (p->adjves == j)
        
{
            
return true;
        }

        p 
= p->nextarc;
    }

    
return false;
}

int getArcnumOfGraph()
{
    
return alg.arcnum;
}