数据结构第三次实验

来源:互联网 发布:飞控算法工程师培训 编辑:程序博客网 时间:2024/06/07 20:08

这里写图片描述

不多说了,直接上代码

1000+行垃圾代码(.cpp文件)

#include <stdio.h>#include <stdlib.h>#include <string.h>#define max 100#define VertexData char#define VertexType char#define EdgeData intusing namespace std;//邻接矩阵typedef struct{    int edge[max][max];    int n;//顶点数    int e;//边数}st;st G,G0,G1;//邻接表typedef struct node{    int adivex;    EdgeData cost;    struct node *next;}EdgeNode;typedef struct{    VertexData vertex[max];    EdgeNode *firstedge;}VertexNode;typedef struct{    VertexNode vexlist[max];    int n,e;}AdjGraph;AdjGraph A,A0,A1;//邻接多重表typedef struct EBox{    char mark;//N和Y    int ivex,jvex;    struct EBox *ilink,*jlink;    int weight;}EBox;typedef struct VexBox{    VertexType data[max];    EBox *firstedge;}VexBox;typedef struct{    VexBox adjmulist[max];    int vexnum,edgenum;}AMLGragh;AMLGragh S,S0,S1;//栈typedef struct {    int top;    int data[max];}stack;//队列typedef struct{    int top;    int bottom;    int data[max];}QUEUE;bool visited[max];int dfn[max];void CreateMGraph();//邻接矩阵void CreateGraph();//邻接表void CreateAMLGragh();//邻接多重表void MGraphtoGraph();//邻接矩阵转邻接表void GraphtoMGraph();//邻接表转邻接矩阵void MGraphtoAMLGraph();//邻接矩阵转邻接多重表void AMLGraphtoMGraphto();//邻接多重表转邻接矩阵void GraphtoAMLGraph();//邻接表转邻接多重表void AMLGraphtoGraph();//邻接多重表转邻接表void DFSMGraph();//递归深度优先搜索邻接矩阵void DFS1(int i,int count);//递归遍历邻接矩阵void DFSGraph();//递归深度优先搜索邻接表void DFS2(int i,int count);//递归遍历邻接表void DFSNMGraph();//非递归深度优先搜索邻接矩阵void DFS3(int v0);//非递归遍历邻接矩阵int FirstAdivertex(int v0);int AnotherFirstAdivertex(int v0);int NextAdjVertex(int v0,int w);int AnotherNextAdjVertex(int v0,int w);void initstack(stack **s);void push(stack *s,int v);int empty(stack *s);int pop(stack *s,int *v);void visit(int v0);void Anothervisit(int v0);void DFSNGraph();//非递归深度优先搜索邻接表void DFSAMLGraph();//递归深度优先搜索多重邻接表void DFS5(int i);//递归遍历多重邻接表void DFSNAMLGraph();//非递归深度优先搜索多重邻接表void DFS6(int v);//非递归遍历多重邻接表int AnotherFirstAdivertex1(int v);int AnotherNextAdjVertex1(int v,int w);void BFSMGraph();//广度优先搜索邻接矩阵void BFS1(int k);//广度遍历邻接矩阵void MAKENULL(QUEUE *Q);//置空队列void ENQUEUE(int k,QUEUE &Q);//压入队列bool Empty(QUEUE Q);//判断队列是否为空int DEQUEUE(QUEUE *Q);//扔出队列中的最低端元素void BFSGraph();//广度优先搜索邻接表void BFS2(int k);//广度遍历邻接表void BFSAMLGraph();//广度优先搜索邻接多重表void BFS3(int k);//广度遍历邻接多重表int main(){    CreateMGraph();    CreateGraph();    CreateAMLGragh();    MGraphtoGraph();    GraphtoMGraph();    MGraphtoAMLGraph();    AMLGraphtoMGraphto();    GraphtoAMLGraph();    AMLGraphtoGraph();    DFSMGraph();    DFSGraph();    DFSNMGraph();    DFSNGraph();    DFSAMLGraph();    DFSNAMLGraph();    BFSMGraph();    BFSGraph();    BFSAMLGraph();    return 0;}void CreateMGraph(){    FILE *fp;    fp = fopen("D:\\linjiejuzhen.txt","r");    if(!fp)    {        printf("error!\n");        exit(0);    }    fscanf(fp,"%d",&G.n);    fscanf(fp,"%d",&G.e);    printf("矩阵的长度为%d,邻接矩阵的边数为%d\n",G.n,G.e);    for(int i=1;i<G.n;i++)    {        G.edge[i][i] = 0;        for(int j=0;j<i;j++)        {            fscanf(fp,"%d",&G.edge[i][j]);            G.edge[j][i] = G.edge[i][j];        }    }    fclose(fp);    for(int i=0;i<G.n;i++)    {        for(int j=0;j<G.n;j++)        {            if(G.edge[i][j]<10)                printf(" %d ",G.edge[i][j]);            if(G.edge[i][j]>=10)                printf("%d ",G.edge[i][j]);        }        printf("\n");    }}void CreateGraph(){    int tail,head,weight;    FILE *fp;    fp = fopen("D:\\linjiebiao.txt","r");    if(!fp)    {        printf("error!\n");        exit(0);    }    fscanf(fp,"%d",&A.n);    fscanf(fp,"%d",&A.e);    printf("矩阵的长度为%d,邻接表的边数有%d\n",A.n,A.e);    for(int i=0;i<A.n;i++)    {        fscanf(fp,"%s",A.vexlist[i].vertex);        A.vexlist[i].firstedge = NULL;    }    for(int i=0;i<A.e;i++)    {        fscanf(fp,"%d",&tail);        fscanf(fp,"%d",&head);        fscanf(fp,"%d",&weight);        EdgeNode *p = new EdgeNode;        p->adivex = head;        p->cost = weight;        p->next = A.vexlist[tail].firstedge;        A.vexlist[tail].firstedge = p;        p = new EdgeNode;        p->adivex = tail;        p->cost = weight;        p->next = A.vexlist[head].firstedge;        A.vexlist[head].firstedge = p;    }    fclose(fp);    for(int i=0;i<A.n;i++)    {        EdgeNode *q = new EdgeNode;        q = A.vexlist[i].firstedge;        printf("[%s]",A.vexlist[i].vertex);        while(q!=NULL)        {            if(q->cost!=0)                printf("-->%d",q->adivex);            q = q->next;        }        printf("\n");    }}void CreateAMLGragh(){    int i,j,k,z;    FILE *fp = fopen("D:\\linjieduochongbiao.txt","r");    if(!fp)    {        printf("error!\n");        exit(0);    }    fscanf(fp,"%d",&S.vexnum);    fscanf(fp,"%d",&S.edgenum);    printf("矩阵的长度为%d,边的数量为%d\n",S.vexnum,S.edgenum);    for(i=0;i<S.vexnum;i++){        fscanf(fp,"%s",&S.adjmulist[i].data);        S.adjmulist[i].firstedge = NULL;    }    for(k=0;k<S.edgenum;k++)    {        fscanf(fp,"%d",&i);        fscanf(fp,"%d",&j);        fscanf(fp,"%d",&z);        EBox *p = new EBox;        p->ivex = i;        p->jvex = j;        p->weight = z;        p->mark = 'N';        p->ilink = S.adjmulist[i].firstedge;        p->jlink = S.adjmulist[j].firstedge;        S.adjmulist[i].firstedge = S.adjmulist[j].firstedge = p;    }    fclose(fp);    EBox *p = new EBox;    for(i=0;i<S.vexnum;i++)    {        p = S.adjmulist[i].firstedge;        printf("[%s.link]",S.adjmulist[i].data);        while(p!=NULL)        {            if(i==p->ivex)            {                if(p->weight!=0)                    printf("    %d----%d",i,p->jvex);                p=p->ilink;            }            else if(i==p->jvex)            {                if(p->weight!=0)                    printf("    %d----%d",i,p->ivex);                p=p->jlink;            }        }        printf("\n");    }}void MGraphtoGraph(){    printf("邻接矩阵转换为邻接表\n");    char c = 'v';    for(int i=0;i<G.n;i++)//初始化邻接表    {        sprintf(A0.vexlist[i].vertex,"%c%d",c,i);        A0.vexlist[i].firstedge = NULL;    }    for(int i=0;i<G.n;i++)//邻接矩阵转换邻接表    {        for(int j=0;j<G.n;j++)        {            EdgeNode *p = new EdgeNode;            p->adivex = i;            p->cost = G.edge[i][j];            p->next = A0.vexlist[i].firstedge;            A0.vexlist[i].firstedge = p;            p = new EdgeNode;            p->adivex = j;            p->cost = G.edge[i][j];            p->next = A0.vexlist[j].firstedge;            A0.vexlist[j].firstedge = p;        }    }    for(int i=0;i<A.n;i++)    {        EdgeNode *q = new EdgeNode;        q = A.vexlist[i].firstedge;        printf("[%s]",A.vexlist[i].vertex);        while(q!=NULL)        {            if(q->cost!=0)                printf("-->%d",q->adivex);            q = q->next;        }        printf("\n");    }}void GraphtoMGraph(){    //初始化G0    G0.e = A.e;    G0.n = A.n;    int a;    printf("邻接表转换为邻接矩阵\n");    for(int i=0;i<G0.n;i++)        for(int j=0;j<G0.n;j++)        G0.edge[i][j] = 0;    EdgeNode *p = new EdgeNode;    for(int i=0;i<A.n;i++)    {        p = A.vexlist[i].firstedge;        while(p!=NULL){            a = p->adivex;            G0.edge[i][a] = p->cost;            p = p->next;        }    }    for(int i=0;i<G0.n;i++)    {        for(int j=0;j<G0.n;j++)        {            if(G0.edge[i][j]<10)                printf(" %d ",G0.edge[i][j]);            if(G0.edge[i][j]>=10)                printf("%d ",G0.edge[i][j]);        }        printf("\n");    }}void MGraphtoAMLGraph(){    printf("邻接矩阵转邻接多重表\n");    char c = 'v';    S0.edgenum = G.e;    S0.vexnum = G.n;    for(int i=0;i<G.n;i++)    {        sprintf(S0.adjmulist[i].data,"%c%d",c,i);        S0.adjmulist[i].firstedge = NULL;    }    for(int i=1;i<G.n;i++)    {        for(int j=0;j<i;j++)        {            EBox *p = new EBox;            p->ivex = i;            p->jvex = j;            p->weight = G.edge[i][j];            p->mark = 'N';            p->ilink = S0.adjmulist[i].firstedge;            p->jlink = S0.adjmulist[j].firstedge;            S0.adjmulist[i].firstedge = S0.adjmulist[j].firstedge = p;        }    }    EBox *p = new EBox;    for(int i=0;i<S0.vexnum;i++)    {        p = S0.adjmulist[i].firstedge;        printf("[%s.link]",S0.adjmulist[i].data);        while(p!=NULL)        {            if(i==p->ivex)            {                if(p->weight!=0)                    printf("    %d----%d",i,p->jvex);                p=p->ilink;            }            else if(i==p->jvex)            {                if(p->weight!=0)                    printf("    %d----%d",i,p->ivex);                p=p->jlink;            }        }        printf("\n");    }}void AMLGraphtoMGraphto(){    printf("邻接多重表转邻接矩阵\n");    G1.e = S.edgenum;    G1.n = S.vexnum;    for(int i=0;i<G1.n;i++)        for(int j=0;j<G1.n;j++)        G1.edge[i][j] = 0;    for(int i=0;i<S.vexnum;i++)    {        EBox *p = new EBox;        p = S.adjmulist[i].firstedge;        while(p!=NULL)        {            if(i==p->ivex)            {                int j = p->jvex;                G1.edge[i][j] = p->weight;                G1.edge[j][i] = p->weight;                p=p->ilink;            }            else if(i==p->jvex)            {                int j = p->ivex;                G1.edge[i][j] = p->weight;                G1.edge[j][i] = p->weight;                p=p->jlink;            }        }    }    for(int i=0;i<G1.n;i++)    {        for(int j=0;j<G1.n;j++)        {            if(G1.edge[i][j]<=9)                printf(" %d ",G1.edge[i][j]);            else if(G1.edge[i][j]>9)                printf("%d ",G1.edge[i][j]);        }        printf("\n");    }}void GraphtoAMLGraph(){    char c = 'v';    int j;    printf("邻接表转邻接多重表\n");    S1.edgenum = A.e;    S1.vexnum = A.n;    for(int i=0;i<S1.vexnum;i++)    {        sprintf(S1.adjmulist[i].data,"%c%d",c,i);        S1.adjmulist[i].firstedge = NULL;    }    for(int i=0;i<A.n;i++)    {        EdgeNode *q = new EdgeNode;        q = A.vexlist[i].firstedge;        while(q!=NULL)        {            j = q->adivex;            if(j>i)            {                EBox *p = new EBox;                p->ivex = i;                p->jvex = j;                p->weight = q->cost;                p->mark = 'N';                p->ilink = S1.adjmulist[i].firstedge;                p->jlink = S1.adjmulist[j].firstedge;                S1.adjmulist[i].firstedge = S1.adjmulist[j].firstedge = p;            }            q = q->next;        }    }    for(int i=0;i<S1.vexnum;i++)    {        EBox *p = new EBox;        p = S1.adjmulist[i].firstedge;        printf("[%s.link]",S1.adjmulist[i].data);        while(p!=NULL)        {            if(i==p->ivex)            {                if(p->weight!=0)                    printf("    %d----%d",i,p->jvex);                p=p->ilink;            }            else if(i==p->jvex)            {                if(p->weight!=0)                    printf("    %d----%d",i,p->ivex);                p=p->jlink;            }        }        printf("\n");    }}void AMLGraphtoGraph(){    printf("邻接多重表转邻接表\n");    char c = 'v';    A1.e = S.edgenum;    A1.n = S.vexnum;    for(int i=0;i<A1.n;i++)    {        sprintf(A1.vexlist[i].vertex,"%c%d",c,i);        A1.vexlist[i].firstedge = NULL;    }    EBox *p = new EBox;    for(int i=0;i<S.vexnum;i++)    {        p = S.adjmulist[i].firstedge;        while(p!=NULL)        {            if(i==p->ivex){                int j = p->jvex;                if(j>i){                    EdgeNode *q = new EdgeNode;                    q->adivex = j;                    q->cost = p->weight;                    q->next = A1.vexlist[i].firstedge;                    A1.vexlist[i].firstedge = q;                    q = new EdgeNode;                    q->adivex = i;                    q->cost = p->weight;                    q->next = A1.vexlist[j].firstedge;                    A1.vexlist[j].firstedge = q;                }                p = p->ilink;            }            else if(i==p->jvex){                int j = p->ivex;                if(j>i){                    EdgeNode *q = new EdgeNode;                    q->adivex = j;                    q->cost = p->weight;                    q->next = A1.vexlist[i].firstedge;                    A1.vexlist[i].firstedge = q;                    q = new EdgeNode;                    q->adivex = i;                    q->cost = p->weight;                    q->next = A1.vexlist[j].firstedge;                    A1.vexlist[j].firstedge = q;                }                p = p->jlink;            }        }    }    for(int i=0;i<A1.n;i++)    {        EdgeNode *p = new EdgeNode;        p = A1.vexlist[i].firstedge;        printf("[%s]",A1.vexlist[i].vertex);        while(p!=NULL)        {            if(p->cost!=0)                printf("-->%d",p->adivex);            p = p->next;        }        printf("\n");    }}void DFSMGraph(){    printf("递归遍历邻接矩阵\n");    int count = 1;    for(int i=0;i<G.n;i++)        visited[i] = false;    for(int i=0;i<G.n;i++)            if(!visited[i])                DFS1(i,count);printf("\n");}void DFS1(int i,int count){    int j;    printf("v%d  ",i);    visited[i] = true;    dfn[i] = count;    count++;    for(j=0;j<G.n;j++)        if((G.edge[i][j]>0)&&!visited[i])            DFS1(j,count);}void DFSGraph(){    printf("递归遍历邻接表\n");    int count = 1;    for(int i=0;i<A.n;i++)        visited[i] = false;    for(int i=0;i<A.n;i++)        if(!visited[i])        DFS2(i,count);}void DFS2(int i,int count){    EdgeNode *p = new EdgeNode;    printf("%s  ",A.vexlist[i].vertex);    visited[i] = true;    dfn[i] = count++;    p = A.vexlist[i].firstedge;    while(p){        if(!visited[p->adivex])            DFS2(p->adivex,count);        p = p->next;    }}void DFS3(int v0){    int v,w;    stack *s;    initstack(&s);    push(s,v0);    while(empty(s))    {        pop(s,&v);        if(!visited[v])        {            visit(v);            visited[v] = true;        }        w = FirstAdivertex(v);        while(w!=-1)        {            if(!visited[w])                push(s,w);            w = NextAdjVertex(v,w);        }    }}void DFS4(int v0){    int v,w;    stack *s;    initstack(&s);    push(s,v0);    while(empty(s))    {        pop(s,&v);        if(!visited[v])        {            Anothervisit(v);            visited[v] = true;        }        w = AnotherFirstAdivertex(v);        while(w!=-1)        {            if(!visited[w])                push(s,w);            w = AnotherNextAdjVertex(v,w);        }    }}void DFSNMGraph(){    for(int i=0;i<G.n;i++)        visited[i] = false;    printf("\n非递归遍历邻接矩阵\n");    int v;    for(v=0;v<G.n;v++)        if(!visited[v])            DFS3(v);    printf("\n");}void DFSNGraph(){    for(int i=0;i<A.n;i++)        visited[i] = false;    printf("非递归遍历邻接表\n");    int v;    for(v=0;v<A.n;v++){        if(!visited[v])            DFS4(v);    }    printf("\n");}int FirstAdivertex(int v0){    int j;    for(j=0;j<G.n;j++)        if(G.edge[v0][j]!=0)        return j;    return -1;}int AnotherFirstAdivertex(int v0){    int j=0;    EdgeNode *p = new EdgeNode;    p = A.vexlist[v0].firstedge;    while(p!=NULL){        if(p->cost!=0)        return j;        j++;        p = p->next;    }    return -1;}int NextAdjVertex(int v0,int w){    int j;    for(j=w+1;j<G.n;j++)        if(G.edge[v0][w]!=0)            return j;    return -1;}int AnotherNextAdjVertex(int v0,int w){    EdgeNode *p = new EdgeNode;    p = A.vexlist[v0].firstedge;    while(p!=NULL)    {        if(p->adivex==w&&p->next!=NULL)            return p->next->adivex;        p = p->next;    }    return -1;}void initstack(stack **s){    *s = (stack *)malloc(sizeof(stack));    memset(*s,0,sizeof(**s));    (*s)->top = -1;}void push(stack *s,int v){    s->top++;    s->data[s->top] = v;}int empty(stack *s){    if(s->top==-1)        return 0;    else        return 1;}int pop(stack *s,int *v){    if(!empty(s))        return 0;    else{        *v = s->data[s->top];        s->top--;        return 1;    }}void visit(int v0){    printf("v%d  ",v0);}void Anothervisit(int v0){    printf("%s  ",A.vexlist[v0].vertex);}void DFSAMLGraph(){    printf("递归遍历多重邻接表\n");    int i;    for(i=0;i<S.vexnum;i++)        visited[i] = false;    for(i=0;i<S.vexnum;i++)        if(!visited[i])            DFS5(i);}void DFS5(int i){    int j;    EBox *p = new EBox;    printf("%s  ",S.adjmulist[i].data);    visited[i] = true;    p = S.adjmulist[i].firstedge;    while(p){        j = p->ivex == i ? p->jvex : p->ivex;        if(!visited[j])            DFS5(j);        p = p->ivex == i ? p->ilink : p->jlink;    }}void DFSNAMLGraph(){    printf("\n非递归遍历多重邻接表\n");    for(int i=0;i<S.vexnum;i++)        visited[i] = false;    int v;    for(v=0;v<S.vexnum;v++){        if(!visited[v])            DFS6(v);    }    printf("\n");}void DFS6(int v0){    int v,w;    stack *s;    initstack(&s);    push(s,v0);    while(empty(s))    {        pop(s,&v);        if(!visited[v])        {            printf("%s  ",S.adjmulist[v].data);            visited[v] = true;        }        w = AnotherFirstAdivertex1(v);        while(w!=-1)        {            if(!visited[w])                push(s,w);            w = AnotherNextAdjVertex1(v,w);        }    }}int AnotherNextAdjVertex1(int v0,int w){    int v=v0;    EBox *p = new EBox;    p = S.adjmulist[v0].firstedge;    while(p->ilink!=NULL&&p->jlink!=NULL)    {        if(p->ivex==v){            if(w==p->jvex)            {                p = p->ilink;                if(p->ivex==v)                    return p->jvex;                else                    return p->ivex;            }else{                p = p->ilink;            }        }        else{            if(w==p->ivex)            {                p = p->jlink;                if(p->jvex==v)                    return p->ivex;                else                    return p->jvex;            }else                p = p->jlink;        }    }    return -1;}int AnotherFirstAdivertex1(int v0){    int j,k;    EBox *p = new EBox;    p = S.adjmulist[v0].firstedge;    j = p->jvex;    while(p!=NULL)    {        k = p->ivex;        if(p->weight!=0)            return j;        //j = p->ivex == k ? p->jvex : p->ivex;        p = p->ivex == k ? p->ilink : p->jlink;    }    return -1;}void BFSMGraph(){    printf("广度遍历邻接矩阵\n");    for(int i=0;i<G.n;i++)        visited[i] = false;    for(int i=0;i<G.n;i++)        if(!visited[i])            BFS1(i);}void BFS1(int k){    int i,j;    QUEUE Q;    MAKENULL(&Q);    printf("v%d  ",k);    visited[k] = true;    ENQUEUE(k,Q);    while(!Empty(Q))    {        i = DEQUEUE(&Q);        for(j=0;j<G.n;j++)        {            if(G.edge[i][j]!=0&&!visited[j])            {                printf("v%d  ",j);                visited[j] = true;                ENQUEUE(j,Q);            }        }    }}void MAKENULL(QUEUE *Q){    Q->bottom = Q->top = 0;}void ENQUEUE(int k,QUEUE &Q){    Q.data[Q.top] = k;    Q.top++;}bool Empty(QUEUE Q){    return Q.bottom==Q.top;}int DEQUEUE(QUEUE *Q){    int i = Q->data[Q->bottom];    Q->bottom++;    return i;}void BFSGraph(){    printf("\n广度优先搜索邻接表\n");    for(int i=0;i<A.n;i++)        visited[i] = false;    for(int i=0;i<A.n;i++)        if(!visited[i])            BFS2(i);}void BFS2(int k){    int i;    EdgeNode *p = new EdgeNode;    QUEUE Q;    MAKENULL(&Q);    ENQUEUE(k,Q);    printf("%s  ",A.vexlist[k].vertex);    visited[k] = true;    while(!Empty(Q))    {        i = DEQUEUE(&Q);        p = A.vexlist[i].firstedge;        while(p){            if(!visited[p->adivex]){                printf("%s  ",A.vexlist[p->adivex].vertex);                visited[p->adivex] = true;                ENQUEUE(p->adivex,Q);            }            p = p->next;        }    }}void BFSAMLGraph(){    printf("\n广度优先搜索邻接多重表\n");    for(int i=0;i<S.vexnum;i++)        visited[i] = false;    for(int i=0;i<S.vexnum;i++)        if(!visited[i])            BFS3(i);}void BFS3(int k){    int i,w;    EBox *p = new EBox;    QUEUE Q;    MAKENULL(&Q);    visited[k] = true;    ENQUEUE(k,Q);    printf("%s  ",S.adjmulist[k].data);    while(!Empty(Q)){        i = DEQUEUE(&Q);        if(!visited[i]){            printf("%s  ",S.adjmulist[i].data);            visited[i] = true;        }        w = AnotherFirstAdivertex1(i);        while(w!=-1)        {            if(!visited[w])                ENQUEUE(w,Q);            w = AnotherNextAdjVertex1(i,w);        }    }}

读入的文件为:
这里写图片描述
这里写图片描述
这里写图片描述

原创粉丝点击