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);
}
用的都是笨办法,呵呵,努力中!!!
据说用递归比较好,可是我能理解部分递归,而部分没法理解,哎。。。。。