居然成功了,我的天~~
#include<stdio.h>
#include<stdlib.h>
#include<stdlib.h>
#define OFF 0//未被访问
#define ON 1//已经被访问
#define MAXSIZE 100//队列最大长度
#pragma warning (disable:4996)
typedef struct {
int base[MAXSIZE];//存放结点的下标
int front;//头指针,若队列不空,指向队列头元素
int rear;//尾指针,若队列不空,指向队列尾元素的下一个
}SqQueue;
struct ArcNode//边表
{
int adjvex;//存放边的终点的下标
ArcNode* next;
};
struct VertexNode//顶点表
{
int boom;//是否已经访问过的标志
int tag;//下标
char vertex;//顶点的数据
ArcNode* firstEdge;//指向边表的第一个结点
};
VertexNode* createVertexNode(char* v, int n)//创建顶点表
{
int i;
VertexNode* ss = new VertexNode[n];
for (i = 0; i < n; i++)
{
ss[i].boom = OFF;
ss[i].tag = i;
ss[i].vertex = *(v + i);
ss[i].firstEdge = NULL;
}
return ss;
}
ArcNode* createArcNode(int tag)//创建边表
{
ArcNode* tt = new ArcNode;
tt->adjvex = tag;
tt->next = NULL;
return tt;
}
void insert(VertexNode* ss, int tag, int i)//在顶点表第i+1行后插入边表,采用尾插法,注释的地方是头插法
{
VertexNode* p;
ArcNode* tt,*pMove;
tt = createArcNode(tag);
p = ss + i;
pMove = p->firstEdge;
if (!pMove) p->firstEdge =tt;
else
{
while (pMove->next)pMove = pMove->next;
pMove->next = tt;
}
//tt->next = p->firstEdge;
//p->firstEdge = tt;
}
int sky(VertexNode* ss, char c, int n)//根据顶点c确定其下标i
{
int i = 0;
for (; i < n; i++)
if ((ss + i)->vertex == c)break;
return i;
}
void chudu(VertexNode* ss, char c)//求出顶点c的出度
{
int count = 0;
VertexNode* p = ss;
ArcNode* q;
while (p->vertex != c)p++;
q = p->firstEdge;
while (q)
{
q = q->next;
++count;
}
printf("结点%c的出度是:%d\n", c, count);
}
void rudu(VertexNode* ss,char c, int n)//求出顶点c的入度
{
int x = sky(ss, c, n);
int count = 0, i;
ArcNode* q;
for (i = 0; i < n; i++)
{
q = (ss + i)->firstEdge;
while (q)
{
if (q->adjvex == x)++count;
q = q->next;
}
}
printf("结点%c的出度是:%d\n",c, count);
}
void DFS(VertexNode* &ss,int y)//深度优先遍历(递归——栈)
{
VertexNode* p = ss + y;
ArcNode* q;
if (p->firstEdge)
{
if (p->boom == OFF)
{
printf("%c", p->vertex);
p->boom = ON;
q = p->firstEdge;
while (q)
{
DFS(ss, q->adjvex);
q = q->next;
}
}
}
if (p->boom == OFF)
{
printf("%c", p->vertex);
p->boom = ON;
}
return;
}
void BFS(VertexNode* ss, int y)//广度优先遍历(队列)
{
SqQueue Q;
Q.front = Q.rear = 0;//初始化队列为空
VertexNode* p = ss + y;
Q.base[Q.rear] = p->tag;//将起点的结点下标插入队尾
Q.rear = (Q.rear + 1) % MAXSIZE;
ArcNode* q;
while (Q.front != Q.rear)
{
if (p->boom == OFF)
{
printf("%c", p->vertex);
p->boom = ON;
q = p->firstEdge;
}
while (q)
{
Q.base[Q.rear] = q->adjvex;
Q.rear = (Q.rear + 1) % MAXSIZE;
q = q->next;
}
Q.front = (Q.front + 1) % MAXSIZE;
p = ss + Q.base[Q.front];
}
return;
}
int main()
{
int i, m, n, tag,x;
char* v, sign, b, c,a1,a2;
printf("请输入边的个数:");
scanf_s("%d", &m);
printf("请输入顶点的个数:");
scanf_s("%d", &n);
v = new char[n];
for (i = 0; i < n; i++)
{
setbuf(stdin, NULL);
printf("请输入第%d个顶点:", i + 1);
scanf_s("%c", v + i, sizeof(v));
}
VertexNode* ss = createVertexNode(v, n);
for (i = 0; i < n; i++)
{
while (1)
{
setbuf(stdin, NULL);
printf("是否在顶点表第%d行后添加边表(Y/N)?", i + 1);
sign = getchar();
setbuf(stdin, NULL);
if (sign == 'N' || sign == 'n')break;
printf("请输入结点在顶点表中的下标:");
scanf_s("%d", &tag);
insert(ss, tag, i);
m--;
if (m <= 0)break;
}
if (m <= 0)break;
}
printf("请输入要求出度的结点:");
setbuf(stdin, NULL);
scanf_s("%c", &c, sizeof(c));
chudu(ss, c);
printf("请输入要求入度的结点:");
setbuf(stdin, NULL);
scanf_s("%c", &b, sizeof(b));
rudu(ss, b, n);
printf("请输入深度遍历的起点:");
setbuf(stdin, NULL);
scanf_s("%c", &a1, sizeof(a1));
x = sky(ss, a1,n);
printf("深度遍历结果:");
DFS(ss, x);
printf("\n");
for (i = 0; i < n; i++)(ss + i)->boom = OFF;//初始化
printf("请输入广度遍历的起点:");
setbuf(stdin, NULL);
scanf_s("%c", &a2, sizeof(a2));
x= sky(ss, a2, n);
printf("广度遍历结果:");
BFS(ss, x);
printf("\n");
return 0;
}