#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100
using namespace std;
typedef struct ArcNode
{//边结点
int data;
struct ArcNode *nextarc; //链域:指向下一条边的指针
}ArcNode;
typedef struct VNode
{//顶点信息
int data;
ArcNode *firstarc; //链域:指向第一条依附该顶点的边的指针
}VNode,AdjList[MAXSIZE]; //AdjList表示邻接表类型
typedef struct
{//邻接表
AdjList vertices;
int vexnum,arcnum; //图的当前顶点数和边数
}ALGraph;
typedef struct
{//顺序栈
int *ba
int *top; //栈顶指针
int stacksize; //栈可用的最大容量
}SqStack;
void InitStack(SqStack &S)
{//顺序栈的初始化
S.ba
S.top=S.ba
S.stacksize=MAXSIZE;
}
void Push(SqStack &S,int e)
{//入栈操作
if(S.top-S.ba
return;
*S.top=e; //元素e压入栈顶
S.top++; //栈顶指针加1
}
void Pop(SqStack &S,int &e)
{//出栈操作
if(S.ba
return;
S.top--; //栈顶指针减1
e=*S.top; //将栈顶元素赋给e
}
bool StackEmpty(SqStack S)
{//判空操作
if(S.ba
return true;
return false;
}
bool visited[MAXSIZE]; //访问标志数组,初始为false
int CreateUDG(ALGraph &G,int vexnum,int arcnum)
{//采用邻接表表示法,创建无向图G
G.vexnum=vexnum; //输入总顶点数
G.arcnum=arcnum; //输入总边数
if(G.vexnum>MAXSIZE) return ERROR; //超出最大顶点数则结束函数
int i,h,k;
for(i=1;i<=G.vexnum;i++) //构造表头结点表
{
G.vertices[i].data=i;
visited[i]=false;
G.vertices[i].firstarc=NULL;
}
ArcNode *p1,*p2;
for(i=0;i<G.arcnum;i++) //输入各边,头插法构造邻接表
{
cin>>h>>k;
p1=new ArcNode;
p1->data=k;
p1->nextarc=G.vertices[h].firstarc;
G.vertices[h].firstarc=p1;
p2=new ArcNode;
p2->data=h;
p2->nextarc=G.vertices[k].firstarc;
G.vertices[k].firstarc=p2;
}
return OK;
}
void DFS(ALGraph G,int v,SqStack S)
{//从第v个顶点出发非递归实现深度优先遍历图G
/**************begin************/
/**************end************/
}
int main()
{
int n,m;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
ALGraph G;
SqStack S;
CreateUDG(G,n,m); //创建无向图G
int d; //从d开始遍历
cin>>d;
DFS(G,d,S); //基于邻接表的深度优先遍历
}
return 0;
}