鱼C论坛

 找回密码
 立即注册
查看: 3173|回复: 0

[学习笔记] 数据结构自用

[复制链接]
发表于 2021-6-29 16:25:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdlib.h>
#include<stdio.h>
#define MAX 20

typedef struct
{
        int vexs[MAX];
        int arcs[MAX][MAX];
        int len,ArcNum,VexNum;
}NetGraph;

void buigra(NetGraph *G)
{
        int i,j,k,s;
        printf("请输入结点数和边数:");
        scanf("%d %d",&G->VexNum,&G->ArcNum);
        printf("请输入结点:\n");
        for(i=0;i<G->VexNum;i++)
        {
                scanf("%d",&G->vexs[i]);
        }
        printf("请输入边两端和权值:\n");
        for(i=0;i<G->VexNum;i++)
        {
                for(j=0;j<G->VexNum;j++)
                {
                        G->arcs[i][j] = 0;
                }
        }
        for(k=0;k<G->ArcNum;k++)
        {
                scanf("%d %d %d",&i,&j,&s);
                G->arcs[i-1][j-1] = s;
                G->arcs[j-1][i-1] = s;
        }
}

void disng(NetGraph G)
{
        int i,j;
        printf("%*s",2," ");
        for(i=0;i<G.VexNum;i++)
        {
                printf("%d ",G.vexs[i]);
        }
        printf("\n");
        for(i=0;i<G.VexNum;i++)
        {
                printf("%d ",G.vexs[i]);
                for(j=0;j<G.VexNum;j++)
                {
                        printf("%d ",G.arcs[i][j]);
                }
                printf("\n");
        }
}

void sholen(NetGraph G)
{
        int i, j, k=0, si, sj;
        for(i=0;i<G.VexNum;i++)
                for(j=0;j<G.VexNum;j++)
                {
                        if(G.arcs[i][j]!=0 && k==0)
                        {
                                k = G.arcs[i][j];
                                si = G.vexs[i];
                                sj = G.vexs[j];
                        }
                        else if(G.arcs[i][j]!=0 && G.arcs[i][j]<k)
                        {
                                k = G.arcs[i][j];
                                si = G.vexs[i];
                                sj = G.vexs[j];
                        }
                }
                printf("最短的边是%d---%d",si,sj);
}

void insertarc(NetGraph *G)
{
        int i, j, s;
        printf("请输入插入的边两端和权值:\n");
        scanf("%d %d %d",&i,&j,&s);
        G->arcs[i-1][j-1] = s;
        G->arcs[j-1][i-1] = s;
        printf("Finished!");
}

void delarc(NetGraph *G)
{
        int i, j;
        printf("请输入要删除的边:\n");
        scanf("%d %d",&i,&j);
        G->arcs[i-1][j-1] = 0;
        G->arcs[j-1][i-1] = 0;
        printf("Finished!");
}

void getdu(NetGraph G)
{
        int i,j,n;
        for(i=0;i<G.VexNum;i++)
        {
                n = 0;
                for(j=0;j<G.VexNum;j++)
                {
                        if(G.arcs[i][j]!=0)
                                n++;
                }
                printf("第%d个结点的度是%d\n",i+1,n);
        }
}

void arrive(NetGraph G,int v,int key,int *flag,int visited[])
{
        int i;
        if(G.vexs[v]==key)
        {
                printf("Yes!");
                *flag = 1;
                return;
        }
        visited[v] = 1;
        for(i=0;i<G.VexNum;i++)
        {
                if(G.arcs[v][i]!=0 && visited[i]==0)
                        arrive(G,i,key,flag,visited);
        }
}

int menu()
{
        int n;
        while(1)
        {
                system("cls");
                printf("1.创建\t\t2.输出\t\t3.最短边\n");
                printf("4.插入边\t5.删除边\t6.求度\n");
                printf("7.可达性\t8.退出\n");
                printf("请选择功能:");
                scanf("%d",&n);
                return n;
        }
}

void main()
{
        NetGraph G;
        int n;
        while(1)
        {
                n = menu();
                switch(n)
                {
                case 1:{
                        buigra(&G);
                        system("pause");
                        getchar();
                        break;
                           }
                case 2:{
                        disng(G);
                        system("pause");
                        getchar();
                        break;
                           }
                case 3:{
                        sholen(G);
                        system("pause");
                        getchar();
                        break;
                           }
                case 4:{
                        insertarc(&G);
                        system("pause");
                        getchar();
                        break;
                           }
                case 5:{
                        delarc(&G);
                        system("pause");
                        getchar();
                        break;
                           }
                case 6:{
                        getdu(G);
                        system("pause");
                        getchar();
                        break;
                           }
                case 7:{
                        int key,v,flag=0,visited[MAX]={0};
                        printf("请输入两个点:");
                        scanf("%d %d",&v,&key);
                        arrive(G,v,key,&flag,visited);
                        if(flag == 0) printf("NO!");
                        system("pause");
                        getchar();
                        break;
                           }
                case 8:{
                        exit(0);
                           }
                }
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-7-4 22:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表