标题:入栈程序停止运行
取消只看楼主
hellohe
Rank: 1
等 级:新手上路
帖 子:37
专家分:7
注 册:2018-3-12
结帖率:40%
已结贴  问题点数:6 回复次数:1 
入栈程序停止运行
问一下我这个入栈操作为什么会是程序出错停止运行
这是源码,太长可以忽略
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20       //最多的定点个数
#define INFINTY 0           //表示极大值
#define Error -1
#define False 0
#define True 1
#define OK 1                //出错

int visited[MAX_VERTEX_NUM];                    //标志图顶点是否被访问过
/*图的种类:DG表示有向图,DN表示有向网,UDG表示无向图,UDN表示无向网*/
typedef enum{DG,DN,UDG,UDN} GraphKind;//枚举变量
typedef char VertexData;
typedef int AdjType;
typedef struct ArcNode{
        AdjType adj;        //对于无权图,用1或0表示是否相邻;对带权图,则为权值类型
        //OtherInfo info;    //其他信息
}ArcNode;                  //弧
typedef struct {
    VertexData vertex[MAX_VERTEX_NUM];                  //  顶点向量
    ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];       //邻接矩阵
    int vexnum,arcnum;                                  //图的顶点数和弧数
    GraphKind kind;                                     //图的种类
}AdjMatrix;
//typedef AdjMatrix Graph;
typedef struct stack
{
    int S[MAX_VERTEX_NUM];
    int top;
}Stack;                                     //图
int LocateVertex(AdjMatrix *G,VertexData v)
{
    int j=Error,k;
    for(k=0;k<G->vexnum;k++)
        if(G->vertex[k]==v){
        j=k;break;}
        return j;

}                                             //Adjcency Matrix Graph  邻接 矩阵 图
void CreateDN(AdjMatrix *G)
{
    int i,j,k,weight;
    VertexData v1,v2;
    printf("请输入顶点数目和弧数目\n");
    scanf("%d %d",&G->vexnum,&G->arcnum);    //输入图的顶点数和弧数
    getchar();
    for(i=0;i<G->vexnum;i++)                  //初始化
        for(j=0;j<G->vexnum;j++)
            G->arcs[i][j].adj=INFINTY;
        for(i=0;i<G->vexnum;i++){
                printf("请输入图顶点信息(a char)\n");
        scanf("%c",&G->vertex[i]);getchar();}
        for(k=0;k<G->arcnum;k++)
        {


            printf("输入弧信息,比如顶点 顶点 权值\n");
            scanf("%c %c %d",&v1,&v2,&weight);//输入一条弧的两个顶点及权值
            fflush(stdin);                    //清空缓冲区内容,避免下一次输入字符时,读入以前遗留的
            i=LocateVertex(G,v1);
            j=LocateVertex(G,v2);
            G->arcs[i][j].adj=weight;           // 建立弧
}

}

void Output(AdjMatrix *G)                       //输出矩阵
{
    int i,j;
    for(i=0;i<G->vexnum;i++)
        for(j=0;j<G->vexnum;j++)
    {
        printf("%d\t",G->arcs[i][j].adj);
        if(j!=0&&(j+1)%G->vexnum==0)
            printf("\n");
    }
}

void DepthFirstSearch(AdjMatrix *G,int v0)               //采用邻接矩阵的DepthFirstSearch()
{

    visited[v0]=True;
    int vj;
    for(vj=0;vj<G->vexnum;vj++)
    if(!visited[vj]&&G->arcs[v0][vj].adj!=0){
                    printf("%c\t",G->vertex[vj]);
                    //visited[vj]=True;
                DepthFirstSearch(G,vj);}
    /*while(w!=-1)         //邻接点存在
    {
        if(!visited[w])
            DepthFirstSearch(G,w);      //递归调用DepthFirstSearch()
            w=NextAdjVertex(G,v0,w);    //找下一个邻接点
    }*/

}
void InitStack(Stack *s)
{
    s->top=-1;
}

int FirstAdjVertex(AdjMatrix *G,int v0)
{
    int i;
    for(i=0;i<G->arcnum;i++)
    {
        if(!visited[i]&&G->arcs[v0][i].adj!=0)
        {
            return i;break;
        }
    }
    return False;
}
int NextAdjVertex(AdjMatrix *G,int v,int w)         //求v相对于w的下一个邻接点
{
    int i;
    for(i=0;i<G->vexnum;i++)
    {
        if(!visited[i]&&G->arcs[v][i].adj!=0)
            return i;
            break;
    }
    return False;
}
int Empty(Stack *s)
{
    if(s->top==-1)
        return True;
        return False;
}
int Push(Stack *s,int v)
{
    if(s->top==MAX_VERTEX_NUM-1)
        return False;
        s->top++;
        s->S[s->top]=v;

    return True;

}
void Pop(Stack *s)
{
    s->top--;
}
void gettop(Stack *s,int *v)
{
    if(s->top==-1)
        return False;
        *v=s->S[s->top];
}
/*void DepthFirstSearch_stack(AdjMatrix *G,int v0)
{
    Stack *s=(Stack *)malloc(sizeof(Stack));
    int v,w;
    InitStack(s);
    Push(s,v0);
    while(!Empty(s))            //判断该点还有其他弧
    {
        if(v0==0)  Pop(s,&v);
        else if(!NextAdjVertex(G,v,w))
        Pop(s,&v);              //依次出栈,从下至上依次出栈,输出
        if(!visited[v])
        {

            visited[v]=True;
            w=FirstAdjVertex(G,v);
            while(w!=0)
            {
                if(!visited[w]) Push(G,w);
                    printf("%c",G->vertex[s->S[w]]);
                    w=NextAdjVertex(G,v,w);
            }
        }
    }
}*/
void DepthFirstSearch_stack(AdjMatrix *G,int v0)
{
    Stack *s=(Stack *)malloc(sizeof(Stack));
    int v,w;
    InitStack(s);
    Push(s,v0);
    while(!Empty(s))            //判断该点还有其他弧
    {

        if(v0!=0&&!NextAdjVertex(G,v,w))             //依次出栈,从下至上依次出栈,输出
        Pop(s);
        gettop(s,&v);
        if(!visited[v])
        {

            visited[v]=True;
            w=FirstAdjVertex(G,v);
            while(w!=0)
            {
                if(!visited[w]) Push(G,w);
                    printf("%c",G->vertex[s->S[w]]);
                    w=NextAdjVertex(G,v,w);
            }
        }
    }
}
/*1.以第几个节点出发
    2.1出栈*/

void TraverseGraph(AdjMatrix *G)                        //遍历图
{
    int vi;                                             //相当于矩阵的行下标
    for(vi=0;vi<G->vexnum;vi++)
        visited[vi]=False;
        for(vi=0;vi<G->vexnum;vi++)
            if(!visited[vi])                            //如果该节点没被访问过,输出
            { printf("%c\t",G->vertex[vi]);
            DepthFirstSearch(G,vi);
            }                    //采用深度遍历
}
void TraverseGraph_Stack(AdjMatrix *G)                        //遍历图
{
    int vi;                                             //相当于矩阵的行下标
    for(vi=0;vi<G->vexnum;vi++)
        visited[vi]=False;
        for(vi=0;vi<G->vexnum;vi++)
            if(!visited[vi])                            //如果该节点没被访问过,输出
            { printf("%c\t",G->vertex[vi]);
            DepthFirstSearch_stack(G,vi);
            }                    //采用深度遍历
}


int main()
{
    AdjMatrix *G;                                       //定义邻接矩阵
    G=(AdjMatrix *)malloc(sizeof(AdjMatrix));
    int menu,flag;
   while(flag){
       printf("************menu***************\n");
        printf("********************************\n");
        printf("1.输入图的信息\n");
        printf("2.输出邻接矩阵\t3.输出深度遍历的序列(递归)\n");
        printf("4.输出深度遍历序列(非递归)\t5.清空前面\n");
        printf("请输入操作选项:");
         scanf("%d",&menu);
    switch(menu)
    {

     case 1: CreateDN(G);break;
     case 2: Output(G);break;
     case 3: TraverseGraph(G);printf("\n");break;
     case 4:TraverseGraph_Stack(G);printf("\n");break;
     case 5:system("cls");break;            //清空屏幕


    }

   }
    return 0;
}

搜索更多相关主题的帖子: int vi stack for printf 
2018-06-06 00:22
hellohe
Rank: 1
等 级:新手上路
帖 子:37
专家分:7
注 册:2018-3-12
得分:0 
回复 3楼 sw1040014058
什么问题呢
2018-06-06 19:23



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-487648-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.495453 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved