有空的哥哥姐姐们帮忙改下程序,感激涕零
给定一个有向图,代表一个由特定偏序关系的导出的哈斯图,指定一个结点子集,求解该子集对应的极大元,极小元,最大元,最小元,上界,下界,上确界,
下确界八种特殊元素。
高手们 给个代码 感激涕零
我编的算法可能有错 功能不能全部实现 希望大家帮忙下 1 没有指定结点子集 2 8种功能也不能全部实现
谢谢
附上我的代码
#include <stdio.h>
#include <malloc.h>
#define max 20 //最大顶点个数
int visited[max];
int flag=0,l1=0,l2=0;
char real[2*max];
int RE=0;
char Max;
//图的邻接矩阵存储结构
typedef struct{
char *vexs; //顶点向量
int arcs[max][max]; //邻接矩阵
int vexnum,arcnum; //图的当前顶点数和弧数
}Graph;
//图G中查找元素c的位置
int Locate(Graph G,char c){
for(int i=0;i<G.vexnum;i++)
if(G.vexs[i]==c) return i;
return -1;
}
//创建有向图
void CreateUDN(Graph &G){
int i,j,s1,s2;
char a,b,temp;
printf("输入顶点数和弧数:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
temp=getchar(); //接收回车
G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目
printf("输入%d个顶点.\n",G.vexnum);
for(i=0;i<G.vexnum;i++){ //初始化顶点
printf("输入顶点%d:",i);
scanf("%c",&G.vexs[i]);
temp=getchar(); //接收回车
}
for(i=0;i<G.vexnum;i++) //初始化邻接矩阵
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=0;
printf("输入%d条弧.\n",G.arcnum);
for(i=0;i<G.arcnum;i++){ //初始化弧
printf("输入弧%d:",i);
scanf("%c %c",&a,&b); //输入一条边依附的顶点
temp=getchar(); //接收回车
s1=Locate(G,a);
s2=Locate(G,b);
G.arcs[s1][s2]=1;
}
}
//图G中顶点k的第一个邻接顶点
int FirstVex(Graph G,int k)
{
if(k>=0 && k<G.vexnum)
{
for(int i=0;i<G.vexnum;i++)
if(G.arcs[k][i]!=0) return i;
}
return -1;
}
//图G中顶点i的第j个邻接顶点的下一个邻接顶点
int NextVex(Graph G,int i,int j){
int k;
if(i>=0 && i<G.vexnum && j>=0 && j<G.vexnum)
{ //i,j合理 [Page]
for( k=j+1;k<G.vexnum;k++)
if(G.arcs[i][k]!=0) return k;
}
return -1;
}
//深度优先遍历
void DFS(Graph G,int k)
{
int i;
if(k==-1)
{ //第一次执行DFS时,k为-1
for(i=0;i<G.vexnum;i++)
if(visited[i]==0) DFS(G,i); //对尚未访问的顶点调用DFS
}
else
{
visited[k]=1;
printf("%c ",G.vexs[k]);real[RE++]=G.vexs[k]; //访问第k个顶点
for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i))
if(visited[i]==0) DFS(G,i); //对k的尚未访问的邻接顶点i递归调用DFS
else printf("*");
real[RE++]='*';
}
}
void print(Graph G)
{
int i,j,k;
int len1=0,len_=0,len3=0;
while(real[RE-1]=='*') RE--;
printf("**%d**\n",RE);
int flag2=0;
int sum=0;
printf("\n遍历后的串:");
for(int kk=0;kk<RE;kk++)
printf("%c",real[kk]);
printf("\n");
printf("极小值是::");
for( i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
{
if(G.arcs[j][i]==1) {flag2=1;break;};
}
if(flag2==0) {sum++;printf("%c ",G.vexs[i]);}
flag2=0;
}
flag2=0;
printf("极大值是::");
for( i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
{
if(G.arcs[i][j]==1) {flag2=1;break;};
}
if(flag2==0) {printf("%c ",G.vexs[i]);}
flag2=0;
}
printf("\n");
for(i=0;i<RE;i++)
{
for(j=i;real[j]!='*'&&j<RE;j++,i++)
{
len1++;len_=0;
}
len_++; //continue;
if(len3<=len1)
if(0<=(len1-len_))
{ len3+=len1-len_+1;Max=real[j-1];len1=0; }
}
if(sum>1) printf("没有最小元 ");
else printf("最小元是%c ",G.vexs[0]);
if((len3)==(len1+len_)) printf("没有最da元");
else printf("最大元是%c \n",Max);
}
//主函数
void main()
{
int i,j;
Graph G;
CreateUDN(G);
for(i=0;i<G.vexnum;i++)
visited[i]=0;
DFS(G,-1);
print(G);
printf("\n程序结束.\n");
}