邻接表实例

////////////////////////////////////////////////
//				                       //
//        邻接表实例           //
//                    //
/////////////////////////////////////////////// 

#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()//初始化邻接表 
{
    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;//复制邻接表顶点的邻接点 
    alg.vertices[i].firstarc.nextarc = p;
    p = (ArcNode*)malloc(sizeof(ArcNode));
    p->adjves = i + 1;
    p->nextarc = alg.vertices[j].firstarc.nextarc;//复制邻接表顶点的邻接点 
    alg.vertices[j].firstarc.nextarc = p;
    alg.arcnum++;//边数加一    
}

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 *p = alg.vertices[i].firstarc.nextarc;
    while (p != NULL)
    {
        j++;
        p = p->nextarc;
    }
    return j;
}

bool isArc(int i, int j)//某两个点是否相连
{
    ArcNode *p = alg.vertices[i].firstarc.nextarc;
    while (p != NULL)
    {
        if (p->adjves == j)
        {
            return true;
        }
        p = p->nextarc;
    }
    return false;
}

int getArcnumOfGraph()//获得图的边数
{
    return alg.arcnum;
} 

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("图的边数 1\n");
    printf("任何两个顶点是否相连 2\n");
    printf("求一个顶点的度是多少 3\n");
    while (1)
    {
        scanf("%d", &k);
        if (k == 0)
        {
            break;
        }
        else if (k == 1)
        {
            printf("图的边数为:%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;
}
posted @ 2011-07-29 20:58  Soul_ice  阅读(188)  评论(0编辑  收藏  举报