前言
最近在复习数据结构,为了更好的学习,想着在CSDN上分享自己的学习内容,以便更好地掌握知识。
一.图的代码
#include<stdio.h>
#include<stdlib.h>
#define Mvnum 100
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
typedef int VerTexType;
typedef int Status;
typedef int ArcType;
typedef struct ArcNode{
int adjvex;
struct ArcNode* nextarc;
int info;
}ArcNode;
typedef struct VNode{
VerTexType data;
ArcNode *firstarc;
}VNode,AdjList[Mvnum];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
int Locate(int v,AdjList l,int vexnum){
int i;
for(i=0;i<vexnum;i++){
if(v==l[i].data){
return i;
}
}
return false;
}
Status CreateUDG(ALGraph *g){
printf("请输入总顶点数和总边数:\n");
scanf("%d %d",&(*g).vexnum,&(*g).arcnum);
int i;
for(i=0;i<(*g).vexnum;i++){
printf("请输入第%d个顶点的序号:\n",i+1);
scanf("%d",&(*g).vertices[i].data);
(*g).vertices[i].firstarc=NULL;
}
for(i=0;i<(*g).arcnum;i++){
int v1,v2;
printf("请输入第%d条边的两个顶点:\n",i+1);
scanf("%d %d",&v1,&v2);
int i=Locate(v1,(*g).vertices,(*g).vexnum);
int j=Locate(v2,(*g).vertices,(*g).vexnum);
ArcNode *p1;
p1=(ArcNode*)malloc(sizeof(ArcNode));
p1->adjvex=j;
p1->nextarc=(*g).vertices[i].firstarc;
(*g).vertices[i].firstarc=p1;
ArcNode *p2;
p2=(ArcNode*)malloc(sizeof(ArcNode));
p2->adjvex=i;
p2->nextarc=(*g).vertices[j].firstarc;
(*g).vertices[j].firstarc=p2;
}
return ok;
}
void Show(ALGraph g){
int i;
printf("图的表节点:\n");
for(i=0;i<g.arcnum;i++){
printf("%d ",g.vertices[i].data);
}
printf("\n图的边节点:\n");
for(i=0;i<g.vexnum;i++){
ArcNode *p=g.vertices[i].firstarc;
while(p){
printf("%d ",p->adjvex);
p=p->nextarc;
}
printf("\n");
}
}
int main()
{
ALGraph g;
CreateUDG(&g);
Show(g);
return 0;
}
图采用邻接表的存储结构
二.队列代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
typedef int ElemType;
typedef int Status;
typedef struct{
ElemType *base;
int front;
int rear;
}SqQueue;
Status Init_SqQueue(SqQueue *q,int len){
q->base=(ElemType*)malloc(sizeof(ElemType)*len);
if(!q->base){
exit(overflow);
}
q->front=q->rear=0;
return ok;
}
int Length_SqQueue(SqQueue s){
return (s.rear-s.front+MAXSIZE)%MAXSIZE;
}
Status IsEmpty_SqQueue(SqQueue s){
if(s.front==s.rear){
return ok;
}
return error;
}
Status IsFull_SqQueue(SqQueue s){
if((s.rear+1)%MAXSIZE==s.front){
return ok;
}
return error;
}
Status Destroy(SqQueue *q){
if(IsEmpty_SqQueue(*q)){
return error;
}
free(q->base);
q->front=0;
q->rear=0;
return ok;
}
Status EnSqQueue(SqQueue *s,ElemType e){
if(IsFull_SqQueue(*s)){
return error;
}
s->base[s->rear]=e;
s->rear=(s->rear+1)%MAXSIZE;
return ok;
}
int DeQueue_SqQueue(SqQueue *s){
if(IsEmpty_SqQueue(*s)){
return error;
}
int x=s->base[s->front];
s->front=(s->front+1)%MAXSIZE;
return x;
}
int GetTop_SqQueue(SqQueue s){
if(IsEmpty_SqQueue(s)){
return error;
}
return s.base[s.front];
}
Status Clear_SqQueue(SqQueue *s){
s->front=s->rear=0;
return ok;
}
int main()
{
return 0;
}
队列采用循环队列
三.完整代码
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
#define true 1
#define false 0
#define ok 1
#define error 0
#define infeasible -1
#define overflow -2
#define Mvnum 100
typedef int ElemType;
typedef int Status;
typedef int VerTexType;
typedef int Status;
typedef int ArcType;
typedef struct ArcNode{
int adjvex;
struct ArcNode* nextarc;
int info;
}ArcNode;
typedef struct VNode{
VerTexType data;
ArcNode *firstarc;
}VNode,AdjList[Mvnum];
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
typedef struct{
ElemType *base;
int front;
int rear;
}SqQueue;
int Locate(int v,AdjList l,int vexnum){
int i;
for(i=0;i<vexnum;i++){
if(v==l[i].data){
return i;
}
}
return false;
}
Status CreateUDG(ALGraph *g){
printf("请输入总顶点数和总边数:\n");
scanf("%d %d",&(*g).vexnum,&(*g).arcnum);
int i;
for(i=0;i<(*g).vexnum;i++){
printf("请输入第%d个顶点的序号:\n",i+1);
scanf("%d",&(*g).vertices[i].data);
(*g).vertices[i].firstarc=NULL;
}
for(i=0;i<(*g).arcnum;i++){
int v1,v2;
printf("请输入第%d条边的两个顶点:\n",i+1);
scanf("%d %d",&v1,&v2);
int i=Locate(v1,(*g).vertices,(*g).vexnum);
int j=Locate(v2,(*g).vertices,(*g).vexnum);
ArcNode *p1;
p1=(ArcNode*)malloc(sizeof(ArcNode));
p1->adjvex=j;
p1->nextarc=(*g).vertices[i].firstarc;
(*g).vertices[i].firstarc=p1;
ArcNode *p2;
p2=(ArcNode*)malloc(sizeof(ArcNode));
p2->adjvex=i;
p2->nextarc=(*g).vertices[j].firstarc;
(*g).vertices[j].firstarc=p2;
}
return ok;
}
Status Init_SqQueue(SqQueue *q,int len){
q->base=(ElemType*)malloc(sizeof(ElemType)*len);
if(!q->base){
exit(overflow);
}
q->front=q->rear=0;
return ok;
}
int Length_SqQueue(SqQueue s){
return (s.rear-s.front+MAXSIZE)%MAXSIZE;
}
Status IsEmpty_SqQueue(SqQueue s){
if(s.front==s.rear){
return ok;
}
return error;
}
Status IsFull_SqQueue(SqQueue s){
if((s.rear+1)%MAXSIZE==s.front){
return ok;
}
return error;
}
Status Destroy(SqQueue *q){
if(IsEmpty_SqQueue(*q)){
return error;
}
free(q->base);
q->front=0;
q->rear=0;
return ok;
}
Status EnSqQueue(SqQueue *s,ElemType e){
if(IsFull_SqQueue(*s)){
return error;
}
s->base[s->rear]=e;
s->rear=(s->rear+1)%MAXSIZE;
return ok;
}
int DeQueue_SqQueue(SqQueue *s){
if(IsEmpty_SqQueue(*s)){
return error;
}
int x=s->base[s->front];
s->front=(s->front+1)%MAXSIZE;
return x;
}
int GetTop_SqQueue(SqQueue s){
if(IsEmpty_SqQueue(s)){
return error;
}
return s.base[s.front];
}
Status Clear_SqQueue(SqQueue *s){
s->front=s->rear=0;
return ok;
}
int FirstAdjVex(ALGraph g,int u){
return g.vertices[u-1].firstarc->adjvex+1;
}
int NextAdjVex(ALGraph g,int u,int w){
ArcNode *p;
p=g.vertices[u-1].firstarc;
while(p&&(p->adjvex+1)!=w){
p=p->nextarc;
}
p=p->nextarc;
if(p==NULL){
return -1;
}
return p->adjvex+1;
}
void BFS(ALGraph g,int v){
int visted[g.vexnum+1];
int i;
for(i=1;i<=g.vexnum;i++){
visted[i]=0;
}
visted[v]=1;
SqQueue q;
Init_SqQueue(&q,g.vexnum);
EnSqQueue(&q,v);
while(!IsEmpty_SqQueue(q)){
int u;
u=DeQueue_SqQueue(&q);
printf("%d ",u);
int w;
for(w=FirstAdjVex(g,u);w>=0;w=NextAdjVex(g,u,w)){
if(!visted[w]){
visted[w]=1;
EnSqQueue(&q,w);
}
}
}
}
void Show(ALGraph g){
int i;
for(i=0;i<g.vexnum;i++){
printf("\n");
ArcNode *p=g.vertices[i].firstarc;
while(p){
printf("%d ",p->adjvex);
p=p->nextarc;
}
}
}
int main()
{
ALGraph g;
CreateUDG(&g);
Show(g);
printf("\n");
BFS(g,1);
return 0;
}