第1關(guān):圖的鄰接矩陣存儲及圖初始化
本關(guān)任務(wù):根據(jù)下面的描述和要求,完成圖的鄰接矩陣數(shù)據(jù)結(jié)構(gòu)定義,及圖初始化函數(shù)。
#include <stdio.h>
#include <stdlib.h>
#define N 6
#define MAX 100
typedef struct {
int vex;
int shortweight;
}ShortWeight;
typedef struct QueueNode{
int val;
struct QueueNode* next;
}QueueNode;
typedef struct Queue{
QueueNode *head;
QueueNode *tail;
}Queue;
//鄰接矩陣數(shù)據(jù)結(jié)構(gòu)
typedef struct{
int vcount;//頂點數(shù)
int type ;//0 無向圖,1 有向圖
char vexs[N] ; // 頂點信息
int arcs[N][N]; //關(guān)系矩陣
} GraphMatrix;
//鄰接表數(shù)據(jù)結(jié)構(gòu)
struct EdgeNode { //邊表中的結(jié)點
int endvex; //相鄰頂點在頂點表中下標(biāo)
int weight; //邊的權(quán)
struct EdgeNode * nextedge; //鏈字段
};
typedef struct EdgeNode * EdgeList;
typedef struct
{
char vertex; //記錄頂點信息
int degree;//用于記錄頂點的入度,在拓?fù)渑判驎r需使用
EdgeList edgelist; //指向邊表的指針
} VexNode;
typedef struct{
VexNode *vexs[N]; //N個頂點
int type ;//0 無向圖,1 有向圖
int vcount;//頂點數(shù)
} GraphList;
/*第一關(guān) 完成圖初始化
*/
void printGraph(GraphMatrix *G)
{//本函數(shù)輸出圖的鄰接矩陣
int i,j;
for(i=0;i<G->vcount;i++)
{
// printf("%c ",G->vexs[i]);
for( j=0;j<G->vcount;j++)
printf("%d ",G->arcs[i][j]);
printf("\n");
}
}
/*第一關(guān) 完成圖初始化-鄰接矩陣
*/
GraphMatrix *initGraphMatrix( )
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接矩陣,不需要考慮輸入的數(shù)字非法情況,不輸入頂點的信息*/
GraphMatrix *G;
G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
int t,v,s;
scanf("%d %d %d",&t,&v,&s);
G->vcount=v;
G->type=t;
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
G->arcs[i][j]=0;
}
}
int head,tail;
if(t==0)
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
G->arcs[tail][head]=1;
}
if(t==1){
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
}
}
return G;
}
/*第二關(guān) 完成圖初始化-鄰接表,并完成輸出圖的鄰接表函數(shù)
*/
GraphList* initGraphList()
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接表。不需考慮輸入的數(shù)字非法情況,輸入頂點的信息*/
GraphList* G = (GraphList*)malloc(sizeof(GraphList));
int t, v, s;
scanf("%d%d%d", &t, &v, &s);
G->vcount = v;
G->type = t;
int i, j, k, l;
char vex[N];
char ch = getchar();
for (i = 0; i < v; i++) {
scanf("%c", &vex[i]);
}
for (i = 0; i < v; i++) {
G->vexs[i] = (VexNode*)malloc(sizeof(VexNode));
G->vexs[i]->vertex = vex[i];
G->vexs[i]->edgelist = (EdgeList)malloc(sizeof(struct EdgeNode));
G->vexs[i]->edgelist->nextedge = NULL;
}
for (i = 0; i < s; i++) {
int head, tail,w;
scanf("%d %d %d", &head, &tail,&w);
if (t == 0) {
for (k = 0; k < v; k++) {
if (G->vexs[k]->vertex - '0' == head) {
EdgeList node1 = (EdgeList)malloc(sizeof(struct EdgeNode));
for (j = 0; j < v; j++) {
if (vex[j] - '0' == tail) {
node1->weight = w;
node1->endvex = j;
node1->nextedge = G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge = node1;
break;
}
}
for (j = 0; j < v; j++) {
if (G->vexs[j]->vertex - '0' == tail) {
EdgeList node2 = (EdgeList)malloc(sizeof(struct EdgeNode));
for (l = 0; l < v; l++) {
if (vex[l] - '0' == head) {
node2->weight = w;
node2->endvex = l;
node2->nextedge = G->vexs[j]->edgelist->nextedge;
G->vexs[j]->edgelist->nextedge = node2;
break;
}
}
}
}
}
}
}
}
return G;
}
void printGraphLit( GraphList *G)
{
/*輸出鄰接表,輸出格式:頂點->鄰接頂點編號->...*/
int i;
for(i=0;i<G->vcount;i++){
printf("%c->",G->vexs[i]->vertex);
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d->",tp->endvex);
tp=tp->nextedge;
}
printf("%d\n",tp->endvex);
}
}
/*第三關(guān) 完成圖的廣度遍歷(周游),可根據(jù)需要添加自定義函數(shù)
*/
int visited[N]={0};
void BFS_list(GraphList *G)
{
int i,j;
printf("%c ",G->vexs[0]->vertex);
visited[0]=1;
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
for(i=N-1;i>=0;i--){
if(visited[i]==1){
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL && visited[tp->endvex]==0){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
}
}
}
/*第四關(guān) 完成圖的深度遍歷(周游),可根據(jù)需要添加自定義函數(shù)
*/
int visited2[N];
void DFS_list(GraphList *G)
{
int i,j,k;
for(i=0;i<N;i++){
visited2[i]=0;
}
printf("%c ",G->vexs[0]->vertex);
visited2[0]=1;
EdgeList tp=G->vexs[0]->edgelist->nextedge;
printf("%d ",tp->endvex);
visited2[tp->endvex]=1;
int num=4;
while(1){
for(i=0;i<G->vcount;i++){
if(G->vexs[i]->vertex-'0'==tp->endvex){
EdgeList tp2=G->vexs[i]->edgelist->nextedge;
if(visited2[tp2->endvex]==0){
tp=tp2;
printf("%d ",tp2->endvex);
visited2[tp2->endvex]=1;
break;
}
else if(visited2[tp2->endvex]==1){
for(tp2=tp2->nextedge;tp2!=NULL;tp2=tp2->nextedge){
if(visited2[tp2->endvex]==0){
tp=tp2;
printf("%d ",tp2->endvex);
visited2[tp2->endvex]=1;
break;
}
}
}
}
}
int count=0;
for(i=0;i<N;i++){
if(visited2[i]==1) count++;
}
if(count==G->vcount) break;
}
}
/*第五關(guān) 生成圖的拓?fù)渑判?,可根?jù)需要添加自定義函數(shù)
*/
void QueueInit(Queue* pq) {
pq->head = pq->tail = NULL;
}
void QueuePush(Queue* pq, int x) {
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
newnode->val = x;
newnode->next = NULL;
if (pq->tail == NULL) {
pq->head = pq->tail = newnode;
}
else {
pq->tail->next = newnode;
pq->tail = newnode;
}
}
void QueuePop(Queue* pq) {
if (pq->head->next == NULL) {
pq->head = pq->tail = NULL;
}
else {
QueueNode* next = pq->head->next;
pq->head = next;
}
}
int QueueFront(Queue* pq) {
return pq->head->val;
}
int QueueEmpty(Queue* pq) {
return pq->head == NULL;
}
void Top_list(GraphList* G)
{
Queue* Q=(Queue *)malloc(sizeof(Queue));
QueueInit(Q);
int i;
int deg[N];
for (i = 0; i < N; i++) {
deg[i] = 0;
}
for (i = 0; i < N; i++) {
deg[i] = G->vexs[i]->degree;
}
for (i = 0; i < N; i++) {
if (deg[i] == 0) {
QueuePush(Q, i);
}
}
while (!QueueEmpty(Q)) {
int j = QueueFront(Q);
printf("%d ", j);
QueuePop(Q);
EdgeList p;
p = G->vexs[j]->edgelist->nextedge;
while (p != NULL) {
deg[p->endvex]--;
if (deg[p->endvex] == 0) {
QueuePush(Q, p->endvex);
}
p = p->nextedge;
}
}
}
/*第六關(guān) prim算法生成最小生成樹
*/
int GetShortWeight(GraphList* G,ShortWeight *shortw) {
int i;
int min = MAX;
int loc;
for (i = 1; i < G->vcount; i++) {
if (min > shortw[i].shortweight && shortw[i].shortweight != 0) {
min = shortw[i].shortweight;
loc = i;
}
}
return loc;
}
void Prim_list(GraphList* G)
{
int i, j, k;
ShortWeight shortw[10];
for (i = 0; i < 10; i++) {
shortw[i].shortweight = MAX;
}
k = 0;
EdgeList tp = G->vexs[k]->edgelist->nextedge;
while (tp) {
shortw[tp->endvex].shortweight= tp->weight;
shortw[tp->endvex].vex = k;
tp = tp->nextedge;
}
shortw[k].shortweight = 0;
for (i = 0; i < G->vcount - 1; i++) {
k = GetShortWeight(G, shortw);
printf("%d %d\n", shortw[k].vex, k);
shortw[k].shortweight = 0;
EdgeList tp2 = G->vexs[k]->edgelist->nextedge;
while (tp2) {
if (tp2->weight < shortw[tp2->endvex].shortweight) {
shortw[tp2->endvex].shortweight = tp2->weight;
shortw[tp2->endvex].vex = k;
}
tp2 = tp2->nextedge;
}
}
}
/*第七關(guān) Kruskal算法生成最小生成樹
*/
void Kruskal_list(GraphList *G)
{
}
/*第八關(guān) Dijistra算法求最短路徑
*/
void Dijkstra_list(GraphList *G)
{
}
第2關(guān):圖的鄰接表存儲及圖初始化
本關(guān)任務(wù):編寫一個能輸入圖的基本信息(含圖的類型,圖的頂點,邊等),并用鄰接表存儲圖的程序。
#include <stdio.h>
#include <stdlib.h>
#define N 6
#define MAX 100
typedef struct {
int vex;
int shortweight;
}ShortWeight;
typedef struct QueueNode{
int val;
struct QueueNode* next;
}QueueNode;
typedef struct Queue{
QueueNode *head;
QueueNode *tail;
}Queue;
//鄰接矩陣數(shù)據(jù)結(jié)構(gòu)
typedef struct{
int vcount;//頂點數(shù)
int type ;//0 無向圖,1 有向圖
char vexs[N] ; // 頂點信息
int arcs[N][N]; //關(guān)系矩陣
} GraphMatrix;
//鄰接表數(shù)據(jù)結(jié)構(gòu)
struct EdgeNode { //邊表中的結(jié)點
int endvex; //相鄰頂點在頂點表中下標(biāo)
int weight; //邊的權(quán)
struct EdgeNode * nextedge; //鏈字段
};
typedef struct EdgeNode * EdgeList;
typedef struct
{
char vertex; //記錄頂點信息
int degree;//用于記錄頂點的入度,在拓?fù)渑判驎r需使用
EdgeList edgelist; //指向邊表的指針
} VexNode;
typedef struct{
VexNode *vexs[N]; //N個頂點
int type ;//0 無向圖,1 有向圖
int vcount;//頂點數(shù)
} GraphList;
/*第二關(guān) 完成圖初始化-鄰接表,并完成輸出圖的鄰接表函數(shù)
*/
GraphList *initGraphList()
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接表。不需考慮輸入的數(shù)字非法情況,輸入頂點的信息*/
GraphList *G=(GraphList*)malloc(sizeof(GraphList));
int t,v,s;
scanf("%d%d%d",&t,&v,&s);
G->vcount=v;
G->type=t;
int i,j,k,l;
char vex[N];
char ch=getchar();
for(i=0;i<v;i++){
scanf("%c",&vex[i]);
}
for(i=0;i<v;i++){
G->vexs[i]=(VexNode *)malloc(sizeof(VexNode));
G->vexs[i]->vertex=vex[i];
G->vexs[i]->edgelist=(EdgeList)malloc(sizeof(struct EdgeNode));
G->vexs[i]->edgelist->nextedge=NULL;
G->vexs[i]->degree=0;
}
for(i=0;i<s;i++){
int head,tail;
scanf("%d %d",&head,&tail);
if(t==0){
for(k=0;k<v;k++){
if(G->vexs[k]->vertex-'0'==head){
EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
for(j=0;j<v;j++){
if(vex[j]-'0'==tail){
node1->endvex=j;
node1->nextedge=G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge=node1;
break;
}
}
for(j=0;j<v;j++){
if(G->vexs[j]->vertex-'0'==tail){
EdgeList node2=(EdgeList)malloc(sizeof(struct EdgeNode));
for(l=0;l<v;l++){
if(vex[l]-'0'==head){
node2->endvex=l;
node2->nextedge=G->vexs[j]->edgelist->nextedge;
G->vexs[j]->edgelist->nextedge=node2;
break;
}
}
}
}
}
}
}
else if(t==1){
for(k=0;k<v;k++){
if(G->vexs[k]->vertex-'0'==head){
EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
for(j=0;j<v;j++){
if(vex[j]-'0'==tail){
for(l=0;l<G->vcount;l++){
if(G->vexs[l]->vertex-'0'==tail){
G->vexs[l]->degree++;
}
}
node1->endvex=j;
node1->nextedge=G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge=node1;
break;
}
}
}
}
}
}
return G;
}
void printGraphLit( GraphList *G)
{
/*輸出鄰接表,輸出格式:頂點->鄰接頂點編號->...*/
int i;
for(i=0;i<G->vcount;i++){
printf("%c->",G->vexs[i]->vertex);
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d->",tp->endvex);
tp=tp->nextedge;
}
printf("%d\n",tp->endvex);
}
}
第3關(guān):圖的廣度遍歷
本關(guān)任務(wù):完成程序能實現(xiàn)圖的廣度遍歷。
#include <stdio.h>
#include <stdlib.h>
#define N 6
#define MAX 100
typedef struct {
int vex;
int shortweight;
}ShortWeight;
typedef struct QueueNode{
int val;
struct QueueNode* next;
}QueueNode;
typedef struct Queue{
QueueNode *head;
QueueNode *tail;
}Queue;
//鄰接矩陣數(shù)據(jù)結(jié)構(gòu)
typedef struct{
int vcount;//頂點數(shù)
int type ;//0 無向圖,1 有向圖
char vexs[N] ; // 頂點信息
int arcs[N][N]; //關(guān)系矩陣
} GraphMatrix;
//鄰接表數(shù)據(jù)結(jié)構(gòu)
struct EdgeNode { //邊表中的結(jié)點
int endvex; //相鄰頂點在頂點表中下標(biāo)
int weight; //邊的權(quán)
struct EdgeNode * nextedge; //鏈字段
};
typedef struct EdgeNode * EdgeList;
typedef struct
{
char vertex; //記錄頂點信息
int degree;//用于記錄頂點的入度,在拓?fù)渑判驎r需使用
EdgeList edgelist; //指向邊表的指針
} VexNode;
typedef struct{
VexNode *vexs[N]; //N個頂點
int type ;//0 無向圖,1 有向圖
int vcount;//頂點數(shù)
} GraphList;
/*第一關(guān) 完成圖初始化-鄰接矩陣
*/
GraphMatrix *initGraphMatrix( )
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接矩陣,不需要考慮輸入的數(shù)字非法情況,不輸入頂點的信息*/
GraphMatrix *G;
G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
int t,v,s;
scanf("%d %d %d",&t,&v,&s);
G->vcount=v;
G->type=t;
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
G->arcs[i][j]=0;
}
}
int head,tail;
if(t==0)
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
G->arcs[tail][head]=1;
}
if(t==1){
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
}
}
return G;
}
/*第二關(guān) 完成圖初始化-鄰接表,并完成輸出圖的鄰接表函數(shù)
*/
GraphList *initGraphList()
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接表。不需考慮輸入的數(shù)字非法情況,輸入頂點的信息*/
GraphList *G=(GraphList*)malloc(sizeof(GraphList));
int t,v,s;
scanf("%d%d%d",&t,&v,&s);
G->vcount=v;
G->type=t;
int i,j,k,l;
char vex[N];
char ch=getchar();
for(i=0;i<v;i++){
scanf("%c",&vex[i]);
}
for(i=0;i<v;i++){
G->vexs[i]=(VexNode *)malloc(sizeof(VexNode));
G->vexs[i]->vertex=vex[i];
G->vexs[i]->edgelist=(EdgeList)malloc(sizeof(struct EdgeNode));
G->vexs[i]->edgelist->nextedge=NULL;
G->vexs[i]->degree=0;
}
for(i=0;i<s;i++){
int head,tail;
scanf("%d %d",&head,&tail);
if(t==0){
for(k=0;k<v;k++){
if(G->vexs[k]->vertex-'0'==head){
EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
for(j=0;j<v;j++){
if(vex[j]-'0'==tail){
node1->endvex=j;
node1->nextedge=G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge=node1;
break;
}
}
for(j=0;j<v;j++){
if(G->vexs[j]->vertex-'0'==tail){
EdgeList node2=(EdgeList)malloc(sizeof(struct EdgeNode));
for(l=0;l<v;l++){
if(vex[l]-'0'==head){
node2->endvex=l;
node2->nextedge=G->vexs[j]->edgelist->nextedge;
G->vexs[j]->edgelist->nextedge=node2;
break;
}
}
}
}
}
}
}
else if(t==1){
for(k=0;k<v;k++){
if(G->vexs[k]->vertex-'0'==head){
EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
for(j=0;j<v;j++){
if(vex[j]-'0'==tail){
for(l=0;l<G->vcount;l++){
if(G->vexs[l]->vertex-'0'==tail){
G->vexs[l]->degree++;
}
}
node1->endvex=j;
node1->nextedge=G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge=node1;
break;
}
}
}
}
}
}
return G;
}
void printGraphLit( GraphList *G)
{
/*輸出鄰接表,輸出格式:頂點->鄰接頂點編號->...*/
int i;
for(i=0;i<G->vcount;i++){
printf("%c->",G->vexs[i]->vertex);
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d->",tp->endvex);
tp=tp->nextedge;
}
printf("%d\n",tp->endvex);
}
}
/*第三關(guān) 完成圖的廣度遍歷(周游),可根據(jù)需要添加自定義函數(shù)
*/
int visited[N]={0};
void BFS_list(GraphList *G)
{
int i,j;
printf("%c ",G->vexs[0]->vertex);
visited[0]=1;
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
for(i=N-1;i>=0;i--){
if(visited[i]==1){
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL && visited[tp->endvex]==0){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
}
}
}
第4關(guān):圖的深度遍歷
本關(guān)任務(wù):完成程序能實現(xiàn)圖的深度遍歷。
#include <stdio.h>
#include <stdlib.h>
#define N 6
#define MAX 100
typedef struct {
int vex;
int shortweight;
}ShortWeight;
typedef struct QueueNode{
int val;
struct QueueNode* next;
}QueueNode;
typedef struct Queue{
QueueNode *head;
QueueNode *tail;
}Queue;
//鄰接矩陣數(shù)據(jù)結(jié)構(gòu)
typedef struct{
int vcount;//頂點數(shù)
int type ;//0 無向圖,1 有向圖
char vexs[N] ; // 頂點信息
int arcs[N][N]; //關(guān)系矩陣
} GraphMatrix;
//鄰接表數(shù)據(jù)結(jié)構(gòu)
struct EdgeNode { //邊表中的結(jié)點
int endvex; //相鄰頂點在頂點表中下標(biāo)
int weight; //邊的權(quán)
struct EdgeNode * nextedge; //鏈字段
};
typedef struct EdgeNode * EdgeList;
typedef struct
{
char vertex; //記錄頂點信息
int degree;//用于記錄頂點的入度,在拓?fù)渑判驎r需使用
EdgeList edgelist; //指向邊表的指針
} VexNode;
typedef struct{
VexNode *vexs[N]; //N個頂點
int type ;//0 無向圖,1 有向圖
int vcount;//頂點數(shù)
} GraphList;
/*第一關(guān) 完成圖初始化-鄰接矩陣
*/
GraphMatrix *initGraphMatrix( )
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接矩陣,不需要考慮輸入的數(shù)字非法情況,不輸入頂點的信息*/
GraphMatrix *G;
G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
int t,v,s;
scanf("%d %d %d",&t,&v,&s);
G->vcount=v;
G->type=t;
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
G->arcs[i][j]=0;
}
}
int head,tail;
if(t==0)
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
G->arcs[tail][head]=1;
}
if(t==1){
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
}
}
return G;
}
/*第二關(guān) 完成圖初始化-鄰接表,并完成輸出圖的鄰接表函數(shù)
*/
GraphList *initGraphList()
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接表。不需考慮輸入的數(shù)字非法情況,輸入頂點的信息*/
GraphList *G=(GraphList*)malloc(sizeof(GraphList));
int t,v,s;
scanf("%d%d%d",&t,&v,&s);
G->vcount=v;
G->type=t;
int i,j,k,l;
char vex[N];
char ch=getchar();
for(i=0;i<v;i++){
scanf("%c",&vex[i]);
}
for(i=0;i<v;i++){
G->vexs[i]=(VexNode *)malloc(sizeof(VexNode));
G->vexs[i]->vertex=vex[i];
G->vexs[i]->edgelist=(EdgeList)malloc(sizeof(struct EdgeNode));
G->vexs[i]->edgelist->nextedge=NULL;
G->vexs[i]->degree=0;
}
for(i=0;i<s;i++){
int head,tail;
scanf("%d %d",&head,&tail);
if(t==0){
for(k=0;k<v;k++){
if(G->vexs[k]->vertex-'0'==head){
EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
for(j=0;j<v;j++){
if(vex[j]-'0'==tail){
node1->endvex=j;
node1->nextedge=G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge=node1;
break;
}
}
for(j=0;j<v;j++){
if(G->vexs[j]->vertex-'0'==tail){
EdgeList node2=(EdgeList)malloc(sizeof(struct EdgeNode));
for(l=0;l<v;l++){
if(vex[l]-'0'==head){
node2->endvex=l;
node2->nextedge=G->vexs[j]->edgelist->nextedge;
G->vexs[j]->edgelist->nextedge=node2;
break;
}
}
}
}
}
}
}
else if(t==1){
for(k=0;k<v;k++){
if(G->vexs[k]->vertex-'0'==head){
EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
for(j=0;j<v;j++){
if(vex[j]-'0'==tail){
for(l=0;l<G->vcount;l++){
if(G->vexs[l]->vertex-'0'==tail){
G->vexs[l]->degree++;
}
}
node1->endvex=j;
node1->nextedge=G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge=node1;
break;
}
}
}
}
}
}
return G;
}
void printGraphLit( GraphList *G)
{
/*輸出鄰接表,輸出格式:頂點->鄰接頂點編號->...*/
int i;
for(i=0;i<G->vcount;i++){
printf("%c->",G->vexs[i]->vertex);
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d->",tp->endvex);
tp=tp->nextedge;
}
printf("%d\n",tp->endvex);
}
}
/*第三關(guān) 完成圖的廣度遍歷(周游),可根據(jù)需要添加自定義函數(shù)
*/
int visited[N]={0};
void BFS_list(GraphList *G)
{
int i,j;
printf("%c ",G->vexs[0]->vertex);
visited[0]=1;
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
for(i=N-1;i>=0;i--){
if(visited[i]==1){
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL && visited[tp->endvex]==0){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
}
}
}
/*第四關(guān) 完成圖的深度遍歷(周游),可根據(jù)需要添加自定義函數(shù)
*/
int visited2[N];
void DFS_list(GraphList *G)
{
int i,j,k;
for(i=0;i<N;i++){
visited2[i]=0;
}
printf("%c ",G->vexs[0]->vertex);
visited2[0]=1;
EdgeList tp=G->vexs[0]->edgelist->nextedge;
printf("%d ",tp->endvex);
visited2[tp->endvex]=1;
int num=4;
while(1){
for(i=0;i<G->vcount;i++){
if(G->vexs[i]->vertex-'0'==tp->endvex){
EdgeList tp2=G->vexs[i]->edgelist->nextedge;
if(visited2[tp2->endvex]==0){
tp=tp2;
printf("%d ",tp2->endvex);
visited2[tp2->endvex]=1;
break;
}
else if(visited2[tp2->endvex]==1){
for(tp2=tp2->nextedge;tp2!=NULL;tp2=tp2->nextedge){
if(visited2[tp2->endvex]==0){
tp=tp2;
printf("%d ",tp2->endvex);
visited2[tp2->endvex]=1;
break;
}
}
}
}
}
int count=0;
for(i=0;i<N;i++){
if(visited2[i]==1) count++;
}
if(count==G->vcount) break;
}
}
第5關(guān):拓?fù)渑判?/h4>
本關(guān)任務(wù):編寫一個能輸出有向無環(huán)圖的拓?fù)渑判虻暮瘮?shù)。文章來源:http://www.zghlxwxcb.cn/news/detail-760341.html
#include <stdio.h>
#include <stdlib.h>
#define N 6
#define MAX 100
typedef struct {
int vex;
int shortweight;
}ShortWeight;
typedef struct QueueNode{
int val;
struct QueueNode* next;
}QueueNode;
typedef struct Queue{
QueueNode *head;
QueueNode *tail;
}Queue;
//鄰接矩陣數(shù)據(jù)結(jié)構(gòu)
typedef struct{
int vcount;//頂點數(shù)
int type ;//0 無向圖,1 有向圖
char vexs[N] ; // 頂點信息
int arcs[N][N]; //關(guān)系矩陣
} GraphMatrix;
//鄰接表數(shù)據(jù)結(jié)構(gòu)
struct EdgeNode { //邊表中的結(jié)點
int endvex; //相鄰頂點在頂點表中下標(biāo)
int weight; //邊的權(quán)
struct EdgeNode * nextedge; //鏈字段
};
typedef struct EdgeNode * EdgeList;
typedef struct
{
char vertex; //記錄頂點信息
int degree;//用于記錄頂點的入度,在拓?fù)渑判驎r需使用
EdgeList edgelist; //指向邊表的指針
} VexNode;
typedef struct{
VexNode *vexs[N]; //N個頂點
int type ;//0 無向圖,1 有向圖
int vcount;//頂點數(shù)
} GraphList;
/*第一關(guān) 完成圖初始化-鄰接矩陣
*/
GraphMatrix *initGraphMatrix( )
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接矩陣,不需要考慮輸入的數(shù)字非法情況,不輸入頂點的信息*/
GraphMatrix *G;
G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
int t,v,s;
scanf("%d %d %d",&t,&v,&s);
G->vcount=v;
G->type=t;
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
G->arcs[i][j]=0;
}
}
int head,tail;
if(t==0)
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
G->arcs[tail][head]=1;
}
if(t==1){
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
}
}
return G;
}
/*第二關(guān) 完成圖初始化-鄰接表,并完成輸出圖的鄰接表函數(shù)
*/
GraphList *initGraphList()
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接表。不需考慮輸入的數(shù)字非法情況,輸入頂點的信息*/
GraphList *G=(GraphList*)malloc(sizeof(GraphList));
int t,v,s;
scanf("%d%d%d",&t,&v,&s);
G->vcount=v;
G->type=t;
int i,j,k,l;
char vex[N];
char ch=getchar();
for(i=0;i<v;i++){
scanf("%c",&vex[i]);
}
for(i=0;i<v;i++){
G->vexs[i]=(VexNode *)malloc(sizeof(VexNode));
G->vexs[i]->vertex=vex[i];
G->vexs[i]->edgelist=(EdgeList)malloc(sizeof(struct EdgeNode));
G->vexs[i]->edgelist->nextedge=NULL;
G->vexs[i]->degree=0;
}
for(i=0;i<s;i++){
int head,tail;
scanf("%d %d",&head,&tail);
if(t==0){
for(k=0;k<v;k++){
if(G->vexs[k]->vertex-'0'==head){
EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
for(j=0;j<v;j++){
if(vex[j]-'0'==tail){
node1->endvex=j;
node1->nextedge=G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge=node1;
break;
}
}
for(j=0;j<v;j++){
if(G->vexs[j]->vertex-'0'==tail){
EdgeList node2=(EdgeList)malloc(sizeof(struct EdgeNode));
for(l=0;l<v;l++){
if(vex[l]-'0'==head){
node2->endvex=l;
node2->nextedge=G->vexs[j]->edgelist->nextedge;
G->vexs[j]->edgelist->nextedge=node2;
break;
}
}
}
}
}
}
}
else if(t==1){
for(k=0;k<v;k++){
if(G->vexs[k]->vertex-'0'==head){
EdgeList node1=(EdgeList)malloc(sizeof(struct EdgeNode));
for(j=0;j<v;j++){
if(vex[j]-'0'==tail){
for(l=0;l<G->vcount;l++){
if(G->vexs[l]->vertex-'0'==tail){
G->vexs[l]->degree++;
}
}
node1->endvex=j;
node1->nextedge=G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge=node1;
break;
}
}
}
}
}
}
return G;
}
void printGraphLit( GraphList *G)
{
/*輸出鄰接表,輸出格式:頂點->鄰接頂點編號->...*/
int i;
for(i=0;i<G->vcount;i++){
printf("%c->",G->vexs[i]->vertex);
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d->",tp->endvex);
tp=tp->nextedge;
}
printf("%d\n",tp->endvex);
}
}
/*第三關(guān) 完成圖的廣度遍歷(周游),可根據(jù)需要添加自定義函數(shù)
*/
int visited[N]={0};
void BFS_list(GraphList *G)
{
int i,j;
printf("%c ",G->vexs[0]->vertex);
visited[0]=1;
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
for(i=N-1;i>=0;i--){
if(visited[i]==1){
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL && visited[tp->endvex]==0){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
}
}
}
/*第四關(guān) 完成圖的深度遍歷(周游),可根據(jù)需要添加自定義函數(shù)
*/
int visited2[N];
void DFS_list(GraphList *G)
{
int i,j,k;
for(i=0;i<N;i++){
visited2[i]=0;
}
printf("%c ",G->vexs[0]->vertex);
visited2[0]=1;
EdgeList tp=G->vexs[0]->edgelist->nextedge;
printf("%d ",tp->endvex);
visited2[tp->endvex]=1;
int num=4;
while(1){
for(i=0;i<G->vcount;i++){
if(G->vexs[i]->vertex-'0'==tp->endvex){
EdgeList tp2=G->vexs[i]->edgelist->nextedge;
if(visited2[tp2->endvex]==0){
tp=tp2;
printf("%d ",tp2->endvex);
visited2[tp2->endvex]=1;
break;
}
else if(visited2[tp2->endvex]==1){
for(tp2=tp2->nextedge;tp2!=NULL;tp2=tp2->nextedge){
if(visited2[tp2->endvex]==0){
tp=tp2;
printf("%d ",tp2->endvex);
visited2[tp2->endvex]=1;
break;
}
}
}
}
}
int count=0;
for(i=0;i<N;i++){
if(visited2[i]==1) count++;
}
if(count==G->vcount) break;
}
}
/*第五關(guān) 生成圖的拓?fù)渑判颍筛鶕?jù)需要添加自定義函數(shù)
*/
void QueueInit(Queue* pq) {
pq->head = pq->tail = NULL;
}
void QueuePush(Queue* pq, int x) {
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
newnode->val = x;
newnode->next = NULL;
if (pq->tail == NULL) {
pq->head = pq->tail = newnode;
}
else {
pq->tail->next = newnode;
pq->tail = newnode;
}
}
void QueuePop(Queue* pq) {
if (pq->head->next == NULL) {
pq->head = pq->tail = NULL;
}
else {
QueueNode* next = pq->head->next;
pq->head = next;
}
}
int QueueFront(Queue* pq) {
return pq->head->val;
}
int QueueEmpty(Queue* pq) {
return pq->head == NULL;
}
void Top_list(GraphList* G)
{
Queue* Q=(Queue *)malloc(sizeof(Queue));
QueueInit(Q);
int i;
int deg[N];
for (i = 0; i < N; i++) {
deg[i] = 0;
}
for (i = 0; i < N; i++) {
deg[i] = G->vexs[i]->degree;
}
for (i = 0; i < N; i++) {
if (deg[i] == 0) {
QueuePush(Q, i);
}
}
while (!QueueEmpty(Q)) {
int j = QueueFront(Q);
printf("%d ", j);
QueuePop(Q);
EdgeList p;
p = G->vexs[j]->edgelist->nextedge;
while (p != NULL) {
deg[p->endvex]--;
if (deg[p->endvex] == 0) {
QueuePush(Q, p->endvex);
}
p = p->nextedge;
}
}
}
第6關(guān):prim算法生成最小生成樹
本關(guān)任務(wù):實現(xiàn)prim算法生成最小生成樹。文章來源地址http://www.zghlxwxcb.cn/news/detail-760341.html
#include <stdio.h>
#include <stdlib.h>
#define N 6
#define MAX 100
typedef struct {
int vex;
int shortweight;
}ShortWeight;
typedef struct QueueNode{
int val;
struct QueueNode* next;
}QueueNode;
typedef struct Queue{
QueueNode *head;
QueueNode *tail;
}Queue;
//鄰接矩陣數(shù)據(jù)結(jié)構(gòu)
typedef struct{
int vcount;//頂點數(shù)
int type ;//0 無向圖,1 有向圖
char vexs[N] ; // 頂點信息
int arcs[N][N]; //關(guān)系矩陣
} GraphMatrix;
//鄰接表數(shù)據(jù)結(jié)構(gòu)
struct EdgeNode { //邊表中的結(jié)點
int endvex; //相鄰頂點在頂點表中下標(biāo)
int weight; //邊的權(quán)
struct EdgeNode * nextedge; //鏈字段
};
typedef struct EdgeNode * EdgeList;
typedef struct
{
char vertex; //記錄頂點信息
int degree;//用于記錄頂點的入度,在拓?fù)渑判驎r需使用
EdgeList edgelist; //指向邊表的指針
} VexNode;
typedef struct{
VexNode *vexs[N]; //N個頂點
int type ;//0 無向圖,1 有向圖
int vcount;//頂點數(shù)
} GraphList;
/*第一關(guān) 完成圖初始化-鄰接矩陣
*/
GraphMatrix *initGraphMatrix( )
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接矩陣,不需要考慮輸入的數(shù)字非法情況,不輸入頂點的信息*/
GraphMatrix *G;
G=(GraphMatrix *)malloc(sizeof(GraphMatrix));
int t,v,s;
scanf("%d %d %d",&t,&v,&s);
G->vcount=v;
G->type=t;
int i,j;
for(i=0;i<N;i++){
for(j=0;j<N;j++){
G->arcs[i][j]=0;
}
}
int head,tail;
if(t==0)
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
G->arcs[tail][head]=1;
}
if(t==1){
for(i=0;i<N;i++){
scanf("%d %d",&head,&tail);
G->arcs[head][tail]=1;
}
}
return G;
}
GraphList* initGraphList()
{
/*第一行輸入圖的類型、圖的頂點數(shù)和邊數(shù),第二行輸入各條邊的兩頂點的編號,按頂點編號從小到大的順序輸入。
輸出鄰接表。不需考慮輸入的數(shù)字非法情況,輸入頂點的信息*/
GraphList* G = (GraphList*)malloc(sizeof(GraphList));
int t, v, s;
scanf("%d%d%d", &t, &v, &s);
G->vcount = v;
G->type = t;
int i, j, k, l;
char vex[N];
char ch = getchar();
for (i = 0; i < v; i++) {
scanf("%c", &vex[i]);
}
for (i = 0; i < v; i++) {
G->vexs[i] = (VexNode*)malloc(sizeof(VexNode));
G->vexs[i]->vertex = vex[i];
G->vexs[i]->edgelist = (EdgeList)malloc(sizeof(struct EdgeNode));
G->vexs[i]->edgelist->nextedge = NULL;
}
for (i = 0; i < s; i++) {
int head, tail,w;
scanf("%d %d %d", &head, &tail,&w);
if (t == 0) {
for (k = 0; k < v; k++) {
if (G->vexs[k]->vertex - '0' == head) {
EdgeList node1 = (EdgeList)malloc(sizeof(struct EdgeNode));
for (j = 0; j < v; j++) {
if (vex[j] - '0' == tail) {
node1->weight = w;
node1->endvex = j;
node1->nextedge = G->vexs[k]->edgelist->nextedge;
G->vexs[k]->edgelist->nextedge = node1;
break;
}
}
for (j = 0; j < v; j++) {
if (G->vexs[j]->vertex - '0' == tail) {
EdgeList node2 = (EdgeList)malloc(sizeof(struct EdgeNode));
for (l = 0; l < v; l++) {
if (vex[l] - '0' == head) {
node2->weight = w;
node2->endvex = l;
node2->nextedge = G->vexs[j]->edgelist->nextedge;
G->vexs[j]->edgelist->nextedge = node2;
break;
}
}
}
}
}
}
}
}
return G;
}
/*第三關(guān) 完成圖的廣度遍歷(周游),可根據(jù)需要添加自定義函數(shù)
*/
int visited[N]={0};
void BFS_list(GraphList *G)
{
int i,j;
printf("%c ",G->vexs[0]->vertex);
visited[0]=1;
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
for(i=N-1;i>=0;i--){
if(visited[i]==1){
EdgeList tp=G->vexs[i]->edgelist->nextedge;
while(tp->nextedge!=NULL && visited[tp->endvex]==0){
printf("%d ",tp->endvex);
visited[tp->endvex]=1;
tp=tp->nextedge;
}
}
}
}
/*第四關(guān) 完成圖的深度遍歷(周游),可根據(jù)需要添加自定義函數(shù)
*/
int visited2[N];
void DFS_list(GraphList *G)
{
int i,j,k;
for(i=0;i<N;i++){
visited2[i]=0;
}
printf("%c ",G->vexs[0]->vertex);
visited2[0]=1;
EdgeList tp=G->vexs[0]->edgelist->nextedge;
printf("%d ",tp->endvex);
visited2[tp->endvex]=1;
int num=4;
while(1){
for(i=0;i<G->vcount;i++){
if(G->vexs[i]->vertex-'0'==tp->endvex){
EdgeList tp2=G->vexs[i]->edgelist->nextedge;
if(visited2[tp2->endvex]==0){
tp=tp2;
printf("%d ",tp2->endvex);
visited2[tp2->endvex]=1;
break;
}
else if(visited2[tp2->endvex]==1){
for(tp2=tp2->nextedge;tp2!=NULL;tp2=tp2->nextedge){
if(visited2[tp2->endvex]==0){
tp=tp2;
printf("%d ",tp2->endvex);
visited2[tp2->endvex]=1;
break;
}
}
}
}
}
int count=0;
for(i=0;i<N;i++){
if(visited2[i]==1) count++;
}
if(count==G->vcount) break;
}
}
/*第五關(guān) 生成圖的拓?fù)渑判?,可根?jù)需要添加自定義函數(shù)
*/
void QueueInit(Queue* pq) {
pq->head = pq->tail = NULL;
}
void QueuePush(Queue* pq, int x) {
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
newnode->val = x;
newnode->next = NULL;
if (pq->tail == NULL) {
pq->head = pq->tail = newnode;
}
else {
pq->tail->next = newnode;
pq->tail = newnode;
}
}
void QueuePop(Queue* pq) {
if (pq->head->next == NULL) {
pq->head = pq->tail = NULL;
}
else {
QueueNode* next = pq->head->next;
pq->head = next;
}
}
int QueueFront(Queue* pq) {
return pq->head->val;
}
int QueueEmpty(Queue* pq) {
return pq->head == NULL;
}
void Top_list(GraphList* G)
{
Queue* Q=(Queue *)malloc(sizeof(Queue));
QueueInit(Q);
int i;
int deg[N];
for (i = 0; i < N; i++) {
deg[i] = 0;
}
for (i = 0; i < N; i++) {
deg[i] = G->vexs[i]->degree;
}
for (i = 0; i < N; i++) {
if (deg[i] == 0) {
QueuePush(Q, i);
}
}
while (!QueueEmpty(Q)) {
int j = QueueFront(Q);
printf("%d ", j);
QueuePop(Q);
EdgeList p;
p = G->vexs[j]->edgelist->nextedge;
while (p != NULL) {
deg[p->endvex]--;
if (deg[p->endvex] == 0) {
QueuePush(Q, p->endvex);
}
p = p->nextedge;
}
}
}
/*第六關(guān) prim算法生成最小生成樹
*/
int GetShortWeight(GraphList* G,ShortWeight *shortw) {
int i;
int min = MAX;
int loc;
for (i = 1; i < G->vcount; i++) {
if (min > shortw[i].shortweight && shortw[i].shortweight != 0) {
min = shortw[i].shortweight;
loc = i;
}
}
return loc;
}
void Prim_list(GraphList* G)
{
int i, j, k;
ShortWeight shortw[10];
for (i = 0; i < 10; i++) {
shortw[i].shortweight = MAX;
}
k = 0;
EdgeList tp = G->vexs[k]->edgelist->nextedge;
while (tp) {
shortw[tp->endvex].shortweight= tp->weight;
shortw[tp->endvex].vex = k;
tp = tp->nextedge;
}
shortw[k].shortweight = 0;
for (i = 0; i < G->vcount - 1; i++) {
k = GetShortWeight(G, shortw);
printf("%d %d\n", shortw[k].vex, k);
shortw[k].shortweight = 0;
EdgeList tp2 = G->vexs[k]->edgelist->nextedge;
while (tp2) {
if (tp2->weight < shortw[tp2->endvex].shortweight) {
shortw[tp2->endvex].shortweight = tp2->weight;
shortw[tp2->endvex].vex = k;
}
tp2 = tp2->nextedge;
}
}
}
到了這里,關(guān)于頭歌數(shù)據(jù)結(jié)構(gòu)——圖——課上課后練的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!