关闭

图的邻接表的创建与遍历

1651人阅读 评论(1) 收藏 举报

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

 

 

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

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:61784次
    • 积分:1129
    • 等级:
    • 排名:千里之外
    • 原创:45篇
    • 转载:12篇
    • 译文:0篇
    • 评论:17条
    最新评论