图的邻接表的创建与遍历

原创 2006年05月26日 14:18:00

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);
}

 

 

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

图之 宽度优先遍历 BFS 邻接表创建的图

BFS 邻接表创建#include #include using namespace std;#define MaxSize 100 typedef int VertexType; typedef i...

找出图中的所有连通子图(创建图的邻接表,深度优先遍历查找子图)

/* 利用深度优先遍历,找出图中的所有连通图(子图) * 图用邻接表表示 *graph[], 利用边的信息来创建adjacency lists */ #include #include #def...

图的邻接表的创建与遍历

图的邻接表的创建、深度优先遍历和广度优先遍历 1.邻接表的定义 #define NUM 8 typedef int vex; typedef struct __ArcNode { int...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)