图的邻接表的创建与遍历

0 -> 1-> 3-> 4->NULL

1 ->0 ->3 ->2->NULL

2 ->1 ->3 ->4->NULL

3 ->0 ->1 ->2->4->NULL

4 ->0-> 3-> 2->NULL

 

代码如下

#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#define MAXSIZE 128
typedef struct Node{
 int data;
 struct Node *next;
 int mark;
}Node,*NodePtr;
void Create(Node *&Head){
      Node *pn=new Node;
      for(int i=0;i<=4;i++){
    pn=Head+i;
    pn->mark=0;//为遍历打下基础,及标志为0,意思为还没有访问过
    pn->data=i;
    do{
         cout<<"请输入"<<i<<"的相邻结点:(-1表示结束)";
      Node *p=new Node;
            cin>>p->data;
            p->next=NULL;
            pn->next=p;
      pn=pn->next;
      if(p->data==-1){
       pn=NULL;
       break;
      }
   }
    while(1);
   }
}
int JIS(Node *Head){
 int sum=0;
 for(int i=0;i<=4;i++){
       sum+=Head[i].mark;
    }
 return sum;
}
void BNF(Node *Head){               //广度遍历    队列    
    int Queue[MAXSIZE];
 int front=0;
 int rear=0;
 cout<<"广度遍历:"<<endl;
   Node *pn=new Node;
      for(int i=0;i<=4;i++){
    pn=Head+i;
    pn=pn->next;
    cout<<i<<"  ";
    Head[i].mark=1;
 Queue[rear]=i;
 rear=(rear+1)%MAXSIZE;
    do{     
     if(pn->data!=-1&&Head[pn->data].mark==0){
                cout<<pn->data<<"   ";
                Head[pn->data].mark=1;
    Queue[rear]=pn->data;
    rear=(rear+1)%MAXSIZE;
     }
     else if(pn->data==-1){    
           pn=Head[Queue[front]].next;
     front=(front+1)%MAXSIZE;
     }
     pn=pn->next;
   }
    while(pn&&JIS(Head)<5);
  if(JIS(Head)==5)
   break;
   }
   cout<<endl;
   for(i=0;i<=4;i++)      //把mark值还原
    Head[i].mark=0;
}
void DNF(Node *Head){            //深度遍历   栈
 int stack[128];
 int top=0;
 int base=0;
       cout<<"深度遍历:"<<endl;
   Node *pn=new Node;
      for(int i=0;i<=4;i++){
    pn=Head+i;
    pn=pn->next;
    cout<<i<<"  ";
    Head[i].mark=1;
    stack[top]=i;
    top=(top+1)%MAXSIZE;
    do{
     if(pn->data!=-1){
      while(Head[pn->data].mark==1&&pn->next!=NULL){
       stack[top]=pn->data;
       top=(top+1)%MAXSIZE;
       pn=pn->next;
      }
      cout<<pn->data<<"   ";
      stack[top]=pn->data;
      top=(top+1)%MAXSIZE;
      Head[pn->data].mark=1;
      pn=Head[stack[top-1]].next;
      top--;
     }
     else if(pn->data==-1){
      pn=Head[stack[top]].next;
      top--;
     }
    }
    while(pn&&JIS(Head)<5);
    if(JIS(Head)==5)
     break;
   }
   for(i=0;i<=4;i++)      //把mark值还原
    Head[i].mark=0;
}
void main(){
 Node *Head=(Node *)malloc(5*sizeof(Node));
 Create(Head);
 BNF(Head);
 DNF(Head);
}

 

 

用的都是笨办法,呵呵,努力中!!!

 据说用递归比较好,可是我能理解部分递归,而部分没法理解,哎。。。。。

#include #include #include #include #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define NULL 0 #define MAX 20 typedef int Status; typedef struct Node {int elem; struct Node *next; }Node,*QNode; typedef struct {QNode front; QNode rear; }Queue; typedef struct ArcNode /*头节点*/ {int adjvex; /*该边所指向的顶点的位置*/ struct ArcNode *nextarc; /*指向下一条边*/ }ArcNode; typedef struct VNode /*表节点*/ {int data; /*顶点信息*/ ArcNode *firstarc; /*指向第一条依附该节点的边的指针*/ }VNode,AdjList[MAX]; typedef struct {AdjList vertices; /*表节点*/ int vexnum; /*节点的个数*/ int arcnum; /*边的条数*/ }Graph; Status InitQueue(Queue *Q) {Q->front=Q->rear=(QNode)malloc(sizeof(Node)); if(!Q->front) exit(OVERFLOW); Q->front->next=NULL; return OK; } Status EnQueue(Queue *Q,int e) {QNode p=(QNode)malloc(sizeof(Node)); if(!p) exit(OVERFLOW); p->elem=e; p->next=NULL; Q->rear->next=p; Q->rear=p; return OK; } Status DeQueue(Queue *Q,int *e) {QNode p; p=Q->front->next; Q->front->next=p->next; if(Q->rear==p) Q->rear=Q->front; *e=p->elem; free(p); return OK; } Status QueueEmpty(Queue Q) {if(Q.rear==Q.front) return TRUE; else return FALSE; } int LocateVex(Graph *G,int v) /*返回节点v在中的位置*/ {int i; for(i=0;ivexnum;++i) if(G->vertices[i].data==v) break; else continue; if(ivexnum) return i; else return -1; } Status CreateGraph(Graph *G)/*以邻接表形式创建无向连通G*/ {int m,n,i,j,k,v1,v2,flag=0; ArcNode *p1,*q1,*p,*q; printf("Please input the number of VNode: "); scanf("%d",&m); printf("Please input the number of ArcNode: "); scanf("%d",&n); G->vexnum=m; /*顶点数目*/ G->arcnum=n; /*边的数目*/ for(i=0;ivexnum;++i) {G->vertices[i].data=i+1; /*顶点信息*/ G->vertices[i].firstarc=NULL; } printf("Output the message of VNode:\n"); for(i=0;ivexnum;++i) printf("v%d\n",G->vertices[i].data); for(k=0;karcnum;++k) {printf("Please input the %d edge beginpoint and endpoint: ",k+1); scanf("%d%d",&v1;,&v2;); i=LocateVex(G,v1); j=LocateVex(G,v2); if(i>=0&&j>=0) {++flag; p=(ArcNode *)malloc(sizeof(ArcNode)); p->adjvex=j; p->nextarc=NULL; if(!G->vertices[i].firstarc) G->vertices[i].firstarc=p; else{for(p1=G->vertices[i].firstarc;p1->nextarc;p1=p1->nextarc); p1->nextarc=p; } q=(ArcNode *)malloc(sizeof(ArcNode)); q->adjvex=i; q->nextarc=NULL; if(!G->vertices[j].firstarc) G->vertices[j].firstarc=q; else{for(q1=G->vertices[j].firstarc;q1->nextarc;q1=q1->nextarc); q1->nextarc=q; } } else{printf("Not hava this edge!\n"); k=flag; } } printf("The Adjacency List is:\n"); /*输出邻接表*/ for(i=0;ivexnum;++i) {printf("\t%d v%d->",i,G->vertices[i].data); p=G->vertices[i].firstarc; while(p->nextarc) {printf("%d->",p->adjvex); p=p->nextarc; } printf("%d\n",p->adjvex); } return OK; } int FirstAdjVex(Graph G,int v)/*返回v的第一个邻接顶点*/ {if(G.vertices[v].firstarc) return G.vertices[v].firstarc->adjvex; else return -1; }/*FirstAdjVex*/ int NextAdjVex(Graph G,int v,int w)/*返回v中相对于w的下一个邻接顶点*/ {int flag=0; ArcNode *p; p=G.vertices[v].firstarc; while(p) { if(p->adjvex==w) { flag=1; break; } p=p->nextarc; } if(flag && p->nextarc) return p->nextarc->adjvex; else return -1; }/*NextAdjVex*/ int Visited[MAX]; void DFS(Graph G,int v)/*深度优先遍历*/ {int w; Visited[v]=TRUE; printf("v%d ",G.vertices[v].data); for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) if(!Visited[w]) DFS(G,w); } void DFSTraverse(Graph G) {int v; for(v=0;v<G.vexnum;++v) Visited[v]=FALSE; for(v=0;v<G.vexnum;++v) if(!Visited[v]) DFS(G,v); } void BFSTraverse(Graph G)/*广度优先遍历*/ {int v,v1,w; Queue q; for(v=0;v<G.vexnum;++v) Visited[v]=FALSE; InitQueue(&q); for(v=0;v=0;w=NextAdjVex(G,v1,w)) if(!Visited[w]){Visited[w]=TRUE; printf("v%d ",G.vertices[w].data); EnQueue(&q,w); }/*if*/ } } } main() {Graph G; char ch; system("cls"); CreateGraph(&G); while(1) {printf("which one choice you want DFS(1) BFS(2) orQuit(0)?\n"); scanf("%d",&ch;); switch(ch) {case 1:printf("Depth First Search:\n"); DFSTraverse(G); break; case 2:printf("\nBreadth First Search:\n"); BFSTraverse(G); break; case 0:exit(0); } } getch(); }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值