c语言写数据结构图,数据结构C语言实现—-图

邻接表储存结构

/*邻接表的边*/

typedef struct ArcNode

{

int adjvex;

struct ArcNode *next;

}ArcNode;

/*邻接表的结点*/

typedef struct VNode

{

char date;

ArcNode *firstarc;

}VNode;

创建一个邻接表储存结构的图

//创建一个邻接表类型的图

void CreatArcGraph(int count , VNode G[])

{

ArcNode *p , *q;

char c; //储存结点内数据

int number; //储存要连接的结点

printf("请输入各个结点的数据:n");

for (size_t i = 0; i < count; i++) //初始化数组,输入各结点数据

{

fflush(stdin);

printf("请输入第%d个结点内存入的字符:" , i);

c = getchar();

G[i].date = c;

G[i].firstarc = NULL;

}

图的遍历(1)—–深度优先搜索

//深度优先搜索一个连通图

void DFS(VNode G[] , int v)

{

int w;

printf("%c" , G[v].date); //访问当前结点

printfed[v] = 1;

w = FirstAdj(G , v);

while (w!=-1)

{

if (printfed[w]==0)

DFS(G,w);

w = NextAdj(G , v);

}

}

//对图G = (V,E)进行深度优化搜索的主算法

void Travel_DFS(VNode G[] , int n)

{

for (size_t i = 0; i < n; i++)

{

printfed[i] = 0;

}

for (size_t i = 0; i < n; i++)

{

if (printfed[i]==0)

{

DFS(G,i);

}

}

}

深度优先搜索实例

#include

#include

/*邻接表的边*/

typedef struct ArcNode

{

int adjvex;

struct ArcNode *next;

}ArcNode;

/*邻接表的结点*/

typedef struct VNode

{

char date;

ArcNode *firstarc;

}VNode;

//创建一个邻接表类型的图

void CreatArcGraph(int count , VNode G[])

{

ArcNode *p , *q;

char c; //储存结点内数据

int number; //储存要连接的结点

printf("请输入各个结点的数据:n");

for (size_t i = 0; i < count; i++) //初始化数组,输入各结点数据

{

fflush(stdin);

printf("请输入第%d个结点内存入的字符:" , i);

c = getchar();

G[i].date = c;

G[i].firstarc = NULL;

//putchar(‘n‘);

}

for (size_t i = 0; i < count; i++) //创建边

{

printf("请输入第%d个结点要连接的结点(各个结点以空格隔开):",i);

scanf("%d" , &number);

while (number!=-1)

{

p = (ArcNode*)malloc(sizeof(ArcNode));

p->next = NULL;

p->adjvex = number;

if (G[i].firstarc == NULL)

{

G[i].firstarc = p;

}else

{

q->next = p;

}

q = p;

scanf("%d" , &number);

}

}

}

int printfed[3];

//寻找第一个邻接点

int FirstAdj(VNode G[] , int v)

{

return G[v].firstarc->adjvex;

}

//寻找下一个邻接点

int NextAdj(VNode G[] , int v)

{

ArcNode *p;

p = G[v].firstarc->next;

while (p->next!=NULL )

{

p = p->next;

if (printfed[p->adjvex]==0)

{

return p->adjvex;

}

}

return -1;

}

//深度优先搜索一个连通图

void DFS(VNode G[] , int v)

{

int w;

printf("%c" , G[v].date); //访问当前结点

printfed[v] = 1;

w = FirstAdj(G , v);

while (w!=-1)

{

if (printfed[w]==0)

DFS(G,w);

w = NextAdj(G , v);

}

}

//对图G = (V,E)进行深度优化搜索的主算法

void Travel_DFS(VNode G[] , int n)

{

for (size_t i = 0; i < n; i++)

{

printfed[i] = 0;

}

for (size_t i = 0; i < n; i++)

{

if (printfed[i]==0)

{

DFS(G,i);

}

}

}

#define MAXG 100

int main()

{

int count;

VNode G[MAXG];

printf("请输入要创建的图的结点数:");

scanf("%d",&count);

CreatArcGraph(count , G);

Travel_DFS(G,count);

return 0;

}

运行结果

20200728173212968252.png

图的遍历(2)——-广度优先搜索

//广度优先搜索一个连通图

void BFS(VNode G[] , int v)

{

initQueue(&q);

//首先访问当前结点

printf("%c" , G[v].date);

visited[v] = 1; //访问标记

EnQueue(&q , v); //入队列

//

int w;

while (q.front==q.rear)

{

DeQueue(&q , &v);

w = Firstadj(G , v);

while (w!=-1)

{

if (visited[w]==0)

{

printf("%c",G[w].date);

EnQueue(&q , w);

visited[w] = 1;

}

w = Nextadj(G,v);

}

}

}

//广度优先搜索的主算法

void Travel_BFS(VNode G[] , int v)

{

for (size_t i = 0; i < v; i++)

{

visited[i] = 0;

}

for (size_t i = 0; i < v; i++)

{

BFS(G , i);

}

}

广度优先搜索实例

如图:

20200728173213235841.png

#include

#include

//

//储存类型定义

//图边

typedef struct ArcNode

{

int adjvex;

struct ArcNode *next;

}ArcNode;

//图结点

typedef struct VNode

{

char date;

ArcNode *firstarc;

}VNode;

//队列结点

typedef struct QNode

{

int date;

struct QNode *next;

}QNode , *QueuePtr;

//队列指针

typedef struct

{

QueuePtr front;

QueuePtr rear;

}LinkQueue;

//队列操作

//创建队列

void initQueue(LinkQueue *q)

{

q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));

if(!q->front) exit(0);

q->front->next = NULL;

}

//入队列

void EnQueue(LinkQueue *q , int v )

{

QueuePtr p;

p = (QueuePtr)malloc(sizeof(QNode));

if(!q->front) exit(0);

p->date = v;

p->next = NULL;

q->rear->next = p;

q->rear = p;

}

//出队列

void DeQueue(LinkQueue *q , int *v)

{

if (q->front==q->rear)

{

exit(0);

}

QueuePtr p;

p = q->front->next;

*v = p->date;

q->front->next = p->next;

if (q->rear==p)

{

q->front = q->rear =NULL;

}

free(p);

}

/

//图操作

//创建一个图(邻接表)

void CreatArcNode(VNode G[] , int count)

{

//为结点数组输入数据

char c;

printf("请输入要在各个结点存入的字符...");

for (size_t i = 0; i < count; i++)

{

fflush(stdin);

printf("请输入在第%d个结点存入的数据:",i);

c = getchar();

G[i].date = c;

G[i].firstarc = NULL;

}

//创建几条单链表连接在数组后面(创建边)

int number;

ArcNode *p , *q;

for (size_t i = 0; i < count; i++)

{

printf("请输入结点%d要指向的结点:",i);

scanf("%d",&number);

while (number!=-1)

{

p = (ArcNode*)malloc(sizeof(ArcNode));

p->adjvex = number;

p->next = NULL;

if (G[i].firstarc==NULL)

{

G[i].firstarc = p;

}else

{

q->next = p;

}

q = p;

scanf("%d",&number);

}

}

}

/***********************************全局变量****************************************/

int visited[100];

LinkQueue q;

/

//广度优先搜索操作

//寻找第一个邻接点

int Firstadj(VNode G[] , int v)

{

return G[v].firstarc->adjvex;

}

//寻找下一个邻接点

int Nextadj(VNode G[] , int v)

{

ArcNode *p;

p = G[v].firstarc->next;

while (!p->next)

{

p = p->next;

if (visited[p->adjvex]==0)

{

return p->adjvex;

}

}

return -1;

}

//广度优先搜索一个连通图

void BFS(VNode G[] , int v)

{

initQueue(&q);

//首先访问当前结点

printf("%c" , G[v].date);

visited[v] = 1; //访问标记

EnQueue(&q , v); //入队列

//

int w;

while (q.front==q.rear)

{

DeQueue(&q , &v);

w = Firstadj(G , v);

while (w!=-1)

{

if (visited[w]==0)

{

printf("%c",G[w].date);

EnQueue(&q , w);

visited[w] = 1;

}

w = Nextadj(G,v);

}

}

}

//广度优先搜索的主算法

void Travel_BFS(VNode G[] , int v)

{

for (size_t i = 0; i < v; i++)

{

visited[i] = 0;

}

for (size_t i = 0; i < v; i++)

{

BFS(G , i);

}

}

int main()

{

//创建一个图

int count;

printf("请输入创建的图有几个结点:");

scanf("%d" , &count);

VNode G[count];

CreatArcNode(G,count);

//打印邻接表

for (size_t i = 0; i < count; i++)

{

ArcNode *p;

p = G[i].firstarc;

printf("第%d个结点:%c",i,G[i].date);

do

{

if(p!=NULL)

{

printf("----",p->adjvex,G[p->adjvex].date);

p = p->next;

}

}while(p!=NULL);

putchar(‘n‘);

}

//广度优先搜索

Travel_BFS(G , count);

getchar();

return 0;

}

运行结果:

20200728173213336430.png

原文链接:https://www.cnblogs.com/jerryleesir/p/13391243.html

本文来自网络,不代表手讯网立场。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值