數據結構基本操作

順序表:

#include <stdio.h>
#include <stdlib.h>

// 函數結果狀態碼
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status; // Status是函數返回值類型,其值是函數結果狀態碼

#define MAXSIZE 1024 // 順序表可能達到的最大長度

typedef int ElemType; // 元素數據類型

typedef struct {
	ElemType *elem; // 指向數據元素的基地址
	int length; // 當前長度
}SqList; // 順序表

/* 順序表基本操作,序號i從1開始 */
// 銷燬
void destroyList(SqList &L){
	free(L.elem);
	L.elem = NULL;
} 

// 根據用戶輸入,創建n個元素的表 
Status createList(SqList &L,int n)
{
	L.elem = new ElemType[MAXSIZE];
	if(!L.elem) exit(OVERFLOW);
	for(int i = 1; i <= n; i++)
		scanf("%d",&L.elem[i]);
	L.length = n;
	return OK;
}

// 遍歷,打印表中元素 
void traverseList(SqList L)
{
	for(int i = 1; i <= L.length; i++)
		printf("%d ",L.elem[i]);
}

// 取值,將序號i的元素存入e 
Status getElem(SqList L, int i, ElemType &e)
{
	if(i < 1 || i > L.length) return ERROR;
	e = L.elem[i];
	return OK;
}

// 查找,返回元素e的序號 
int locateElem(SqList L, ElemType e)
{
	for(int i = 1; i <= L.length; i++)
		if(L.elem[i] == e) return i;
	return 0; 
}

// 插入 
Status listInsert(SqList &L, int i, ElemType e)
{
	if((i < 1) || (i > L.length + 1)) return ERROR;
	if(L.length == MAXSIZE) return ERROR;
	for(int j = L.length; j >= i; j--)
		L.elem[j+1] = L.elem[j];
	L.elem[i] = e;
	++L.length;
	return OK;
}

// 刪除 
Status listDelete(SqList &L, int i)
{
	if((i < 1) || (i > L.length)) return ERROR;
	for(int j = i; j <= L.length - 1; j++)
		L.elem[j] = L.elem[j+1];
	--L.length;
	return OK;
}

int main(){
	SqList list;
	int e, n, m;
	scanf("%d",&n);
	createList(list,n);
	scanf("%d",&m);
	if(getElem(list,m,e) == OK){ //把 e 賦值爲鏈表裏的第 m 個數 
		printf("The value of e is %d\n",e);
	}else{
		printf("There is no m number in the list.\n");
	}
	scanf("%d", &e);
	if(locateElem(list,e)){
		printf("The index of %d is %d\n",e,locateElem(list,e));
	}else{
		printf("There is no number %d in the list.\n",e);
	}
	scanf("%d %d",&m,&e); // 插入元素 e 到第 m 個位置 
	if(listInsert(list,m,e) == OK){
		traverseList(list); 
	}else{
		printf("Insert Error\n");
	}
	scanf("%d",&m); // 刪除第 m 個元素 
	if(listDelete(list,m) == OK){
		traverseList(list); 
	}else{
		printf("Delete Error\n");
	}
	destroyList(list);
}

鏈表:

#include <stdio.h>
#include <stdlib.h>

// 函數結果狀態碼
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int Status; // Status是函數返回值類型,其值是函數結果狀態碼

typedef int ElemType; // 元素數據類型 

typedef struct LNode
{
	ElemType data; // 數據域
	struct LNode *next; // 指針域
}LNode,*LinkList;

/* 基本操作,序號i從1開始 */
// 遍歷,打印表中元素 
Status createList(LinkList &L,int n)
{
	L = new LNode;
	L->next = NULL;
	LNode *r = L;
	for(int i = 0; i < n; i++)
	{
		LNode *p = new LNode;
		scanf("%d",&p->data);
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

Status getElem(LinkList L, int i, ElemType &e)
{
	LNode *p = L->next;
	int j = 1;
	while(p && j < i)
	{
		p = p->next;
		++j;
	}
	if(!p || j > i) return ERROR;
	e = p->data;
	return OK;
}

int locateElem(LinkList L, ElemType e)
{
	LNode *p = L->next;
	int i = 1;
	while(p && p->data != e)
	{
		i++;
		p = p->next;
	}
	if(!p) return 0;
	return i;
}

Status listInsert(LinkList &L, int i, ElemType e)
{
	LNode *p = L;
	int j = 0;
	while(p && (j < i - 1))
	{
		p = p->next;
		++j;
	}
	if(!p || j > i - 1) return ERROR;
	LNode *s = new LNode;
	s->data = e;
	s->next = p->next;
	p->next = s;
	return OK;
}

Status listDelete(LinkList &L, int i)
{
	LNode *p = L;
	int j = 0;
	while((p->next)&&(j < i - 1))
	{
		p = p->next;
		++j;
	}
	if(!(p->next) || (j > i - 1)) return ERROR;
	LNode *q = p->next;
	p->next = q->next;
	delete q;
	return OK;
}

void traverseList(LinkList L){
	LNode *p = L->next;
	while(p){
		printf("%d ",p->data);
		p = p->next;
	}
	printf("\n");
}

int main(){
	LinkList list;
	int cmd, result, e, n, i;
	scanf("%d", &n); 
	createList(list, n);
	while (~scanf("%d", &cmd) && cmd!=-1) { // 選擇操作 
		switch (cmd) {
		case 0:			// 取值
			scanf("%d", &i);
			result = getElem(list, i, e);
			if (result) printf("%d\n", e);
			else printf("Failed\n");
			break;
		case 1:			// 查找
			scanf("%d", &e);
			result = locateElem(list, e);
			if (result) printf("%d\n", result);
			else printf("Failed\n");
			break;
		case 2:				// 顯示 
			traverseList(list);
			break;
		case 3:				// 插入 
			scanf("%d%d", &i, &e);
			result = listInsert(list, i, e); 
			if (result) printf("Succeed\n");
			else printf("Failed\n");
			break;
		case 4:				// 刪除 
			scanf("%d", &i);
			result = listDelete(list, i); 
			if (result) printf("Succeed\n");
			else printf("Failed\n");
			break;
		default:
			printf("Unknown Command.\n");
			break;
		}
	}
	return 0;
}

順序棧:

#include<stdio.h>
#include<stdlib.h> 

// 函數結果狀態碼 
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2

#define  MAXSIZE  10	//初始最大容量
typedef int SElemType;
typedef struct{
	SElemType   *base;	//棧底
	SElemType   *top;	//棧頂
}SqStack;

Status init(SqStack &s);	// 初始化一個空棧 
Status push(SqStack &s, SElemType e); 	// 元素e入棧 
Status pop(SqStack &s);				// 出棧 
Status getTop(SqStack s, SElemType &e);	// 將棧頂元素賦值給e 
void clear(SqStack &s);					// 清空棧 
void printSqStack(SqStack s);	//按輸入的順序打印棧中的元素 

int main(){
	int cmd, x;
	SqStack s;
	init(s); 
	while(~scanf("%d",&cmd)){
		switch(cmd){
			case 1:
				scanf("%d",&x);
				if(!push(s,x)) printf("full\n");
				break;
			case 2:
				if(!pop(s)) printf("empty\n");
				break;
			case 3:
				clear(s);
				break;
			case 4:
				if(getTop(s, x)) printf("%d\n", x);
				else printf("empty\n");
				break;
			case 5:
				printSqStack(s);
				break;
			default:
				printf("Unknown Command\n");
				break;
		}
	}
}
Status init(SqStack &s)
{
	s.base = new SElemType[MAXSIZE];
	if(!s.base) exit(OVERFLOW);
	s.top = s.base;
	return OK;
}

Status push(SqStack &s, SElemType e)
{
	if(s.top - s.base == MAXSIZE) return ERROR;
	*s.top++=e; // 元素e壓入top,top+1
	return OK;
}

Status pop(SqStack &s)
{
	if(s.top == s.base) return ERROR;
	int e=*--s.top;
	return OK;
}

Status getTop(SqStack s, SElemType &e)
{
	if(s.top != s.base)
		e = *(s.top-1);
	return OK;
}

void clear(SqStack &s)
{
	s.top = s.base;
}

void printSqStack(SqStack s){
	if(s.top == s.base)
		printf("empty");
	while(s.top != s.base){
		printf("%d ",*--s.top);
	}
	
	printf("\n");
}

鏈棧:

#include<stdio.h>
#include<stdlib.h> 

// 函數結果狀態碼 
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int SElemType;	// 元素數據類型 

typedef struct LNode{
	SElemType data;
	struct LNode *next;
}StackNode, *LinkStack;

void init(LinkStack &s);		// 初始化一個空棧 
Status push(LinkStack &s, SElemType e); 	// 元素e入棧 
Status pop(LinkStack &s);					// 出棧 
Status getTop(LinkStack s, SElemType &e);	// 將棧頂元素賦值給e 
void clear(LinkStack &s);					// 清空棧 
void printLinkStack(LinkStack s);	//按輸入的順序打印棧中的元素 

int main(){
	int cmd, x;
	LinkStack s;
	init(s); 
	while(~scanf("%d",&cmd)){
		switch(cmd){
			case 1:
				scanf("%d",&x);
				if(!push(s,x)) printf("full\n");
				break;
			case 2:
				if(!pop(s)) printf("empty\n");
				break;
			case 3:
				clear(s);
				break;
			case 4:
				if(getTop(s, x)) printf("%d\n", x);
				else printf("empty\n");
				break;
			case 5:
				printLinkStack(s);
				break;
			default:
				printf("Unknown Command\n");
				break;
		}
	}
}
void init(LinkStack &s)
{
	s = NULL;
}

Status push(LinkStack &s, SElemType e)
{
	StackNode *p = new StackNode;
	p->data = e;
	p->next = s;
	s = p;
	return OK;
}

Status pop(LinkStack &s)
{
	if(s == NULL) return ERROR;
	StackNode *p = s;
	s = s->next;
	delete p;
	return OK;
}

Status getTop(LinkStack s, SElemType &e)
{
	if(s != NULL)
		e = s->data;
	return OK;
}

void clear(LinkStack &s)
{
	while(s != NULL)
		pop(s);
}

void printLinkStack(LinkStack s)
{
	if(s == NULL)
		printf("empty\n");
	else
	{
		StackNode *p = s;
		while(p)
		{
			printf("%d ",p->data);
			p = p->next;
		}
		printf("\n");
	}
}

循環隊列:

#include<stdio.h>
#include<stdlib.h> 

// 函數結果狀態碼 
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2

#define  MAXSIZE  10	 
typedef int QElemType;
typedef struct{
	QElemType   *base;	//存儲空間的基地址 
	int front;			// 隊頭
	int rear;			// 隊尾 
}SqQueue;

Status init(SqQueue &q);	// 初始化一個空隊列 
Status enqueue(SqQueue &q, QElemType e); 	// 元素e入隊 
Status dequeue(SqQueue &q);					// 出隊 
Status getFront(SqQueue q, QElemType &e);	// 將隊頭元素賦值給e 
void clear(SqQueue &q);					// 清空隊列 
void printSqQueue(SqQueue q);	//按輸入的順序打印隊列中的元素 

int main(){
	int cmd, x;
	SqQueue q;
	init(q); 
	while(~scanf("%d",&cmd)){
		switch(cmd){
			case 1:
				scanf("%d",&x);
				if(!enqueue(q,x)) printf("full\n");
				break;
			case 2:
				if(!dequeue(q)) printf("empty\n");
				break;
			case 3:
				clear(q);
				break;
			case 4:
				if(getFront(q, x)) printf("%d\n", x);
				else printf("empty\n");
				break;
			case 5:
				printSqQueue(q);
				break;
			default:
				printf("Unknown Command\n");
				break;
		}
	}
}
Status init(SqQueue &q)
{
	q.base = new QElemType[MAXSIZE];
	if(!q.base) exit(OVERFLOW);
	q.front = q.rear = 0;
	return OK;
}

Status enqueue(SqQueue &q, QElemType e)
{
	if((q.rear + 1) % MAXSIZE == q.front) return ERROR;
	q.base[q.rear] = e;
	q.rear = (q.rear + 1) % MAXSIZE;
	return OK;
}

Status dequeue(SqQueue &q)
{
	if(q.front == q.rear) return ERROR;
	q.front = (q.front + 1) % MAXSIZE;
	return OK;
}

Status getFront(SqQueue q, QElemType &e)
{
	if(q.front != q.rear)
	{
		e = q.base[q.front];
		return OK;
	}
	else return ERROR;
}

void clear(SqQueue &q)
{
	q.front = q.rear = 0;
}

void printSqQueue(SqQueue q)
{
	int x;
	int cnt = 0;
	int nums[100];
	if(q.front == q.rear)
	{
		printf("empty\n");
		return;
	}
	else
	{
		while(q.front != q.rear)
		{
			getFront(q,x);
			dequeue(q);
			nums[cnt++] = x;
		}
	
		for(int i = 0; i < cnt; i++)
			printf("%d ",nums[i]);
		printf("\n");
	}
}

鏈隊:

#include<stdio.h>
#include<stdlib.h> 

// 函數結果狀態碼 
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int QElemType;	// 元素數據類型 

typedef struct QNode{
	QElemType data;
	struct QNode *next;
}QNode, *QueuePtr;

typedef struct{
	QueuePtr front;	// 隊頭  
	QueuePtr rear;	// 隊尾 
} LinkQueue;

void init(LinkQueue &q);		// 初始化一個空隊列 
Status enqueue(LinkQueue &q, QElemType e); 	// 元素e入隊 
Status dequeue(LinkQueue &q);					// 出隊 
Status getFront(LinkQueue q, QElemType &e);	// 將隊頭元素賦值給e 
void clear(LinkQueue &q);					// 清空隊列 
void printLinkQueue(LinkQueue q);	//按輸入的順序打印隊列中的元素 

int main(){
	int cmd, x;
	LinkQueue q;
	init(q); 
	while(~scanf("%d",&cmd)){
		switch(cmd){
			case 1:
				scanf("%d",&x);
				if(!enqueue(q,x)) printf("full\n");
				break;
			case 2:
				if(!dequeue(q)) printf("empty\n");
				break;
			case 3:
				clear(q);
				break;
			case 4:
				if(getFront(q, x)) printf("%d\n", x);
				else printf("empty\n");
				break;
			case 5:
				printLinkQueue(q);
				break;
			default:
				printf("Unknown Command\n");
				break;
		}
	}
}

void init(LinkQueue &q)
{
	q.front = q.rear = new QNode;
	q.front->next = NULL;
}

Status enqueue(LinkQueue &q, QElemType e)
{
	QNode *p = new QNode;
	p->data = e;
	p->next = NULL;
	q.rear->next = p;
	q.rear = p;
	return OK;
}

Status dequeue(LinkQueue &q)
{
	if(q.front == q.rear) return ERROR;
	QNode *p = q.front->next;
	q.front->next = p->next;
	if(q.rear == p) q.rear = q.front;
	delete p;
	return OK;
}

Status getFront(LinkQueue q, QElemType &e)
{
	if(q.front != q.rear)
	{
		e = q.front->next->data;
		return OK;
	}
	else return ERROR;
}

void clear(LinkQueue &q)
{
	while(q.front != q.rear)
		dequeue(q);
}

void printLinkQueue(LinkQueue q)
{
	if(q.front == q.rear) printf("empty\n");
	else
	{
		while(q.front != q.rear)
		{
			q.front = q.front->next;
			printf("%d ",q.front->data);
		}
	printf("\n");
	}
}

圖(Graph):

/* 圖的鄰接矩陣表示法 */
 
#define MaxVertexNum 100    /* 最大頂點數設爲100 */
#define INFINITY 65535        /* ∞設爲雙字節無符號整數的最大值65535*/
typedef int Vertex;         /* 用頂點下標表示頂點,爲整型 */
typedef int WeightType;        /* 邊的權值設爲整型 */
typedef char DataType;        /* 頂點存儲的數據類型設爲字符型 */
 
/* 邊的定義 */
typedef struct ENode *PtrToENode;
struct ENode{
    Vertex V1, V2;      /* 有向邊<V1, V2> */
    WeightType Weight;  /* 權重 */
};
typedef PtrToENode Edge;
        
/* 圖結點的定義 */
typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;  /* 頂點數 */
    int Ne;  /* 邊數   */
    WeightType G[MaxVertexNum][MaxVertexNum]; /* 鄰接矩陣 */
    DataType Data[MaxVertexNum];      /* 存頂點的數據 */
    /* 注意:很多情況下,頂點無數據,此時Data[]可以不用出現 */
};
typedef PtrToGNode MGraph; /* 以鄰接矩陣存儲的圖類型 */
 
 
 
MGraph CreateGraph( int VertexNum )
{ /* 初始化一個有VertexNum個頂點但沒有邊的圖 */
    Vertex V, W;
    MGraph Graph;
     
    Graph = (MGraph)malloc(sizeof(struct GNode)); /* 建立圖 */
    Graph->Nv = VertexNum;
    Graph->Ne = 0;
    /* 初始化鄰接矩陣 */
    /* 注意:這裏默認頂點編號從0開始,到(Graph->Nv - 1) */
    for (V=0; V<Graph->Nv; V++)
        for (W=0; W<Graph->Nv; W++)  
            Graph->G[V][W] = INFINITY;
             
    return Graph; 
}
        
void InsertEdge( MGraph Graph, Edge E )
{
     /* 插入邊 <V1, V2> */
     Graph->G[E->V1][E->V2] = E->Weight;    
     /* 若是無向圖,還要插入邊<V2, V1> */
     Graph->G[E->V2][E->V1] = E->Weight;
}
 
MGraph BuildGraph()
{
    MGraph Graph;
    Edge E;
    Vertex V;
    int Nv, i;
     
    scanf("%d", &Nv);   /* 讀入頂點個數 */
    Graph = CreateGraph(Nv); /* 初始化有Nv個頂點但沒有邊的圖 */ 
     
    scanf("%d", &(Graph->Ne));   /* 讀入邊數 */
    if ( Graph->Ne != 0 ) { /* 如果有邊 */ 
        E = (Edge)malloc(sizeof(struct ENode)); /* 建立邊結點 */ 
        /* 讀入邊,格式爲"起點 終點 權重",插入鄰接矩陣 */
        for (i=0; i<Graph->Ne; i++) {
            scanf("%d %d %d", &E->V1, &E->V2, &E->Weight); 
            /* 注意:如果權重不是整型,Weight的讀入格式要改 */
            InsertEdge( Graph, E );
        }
    } 
 
    /* 如果頂點有數據的話,讀入數據 */
    for (V=0; V<Graph->Nv; V++) 
        scanf(" %c", &(Graph->Data[V]));
 
    return Graph;
}
/* 圖的鄰接表表示法 */
 
#define MaxVertexNum 100    /* 最大頂點數設爲100 */
typedef int Vertex;         /* 用頂點下標表示頂點,爲整型 */
typedef int WeightType;        /* 邊的權值設爲整型 */
typedef char DataType;        /* 頂點存儲的數據類型設爲字符型 */
 
/* 邊的定義 */
typedef struct ENode *PtrToENode;
struct ENode{
    Vertex V1, V2;      /* 有向邊<V1, V2> */
    WeightType Weight;  /* 權重 */
};
typedef PtrToENode Edge;
 
/* 鄰接點的定義 */
typedef struct AdjVNode *PtrToAdjVNode; 
struct AdjVNode{
    Vertex AdjV;        /* 鄰接點下標 */
    WeightType Weight;  /* 邊權重 */
    PtrToAdjVNode Next;    /* 指向下一個鄰接點的指針 */
};
 
/* 頂點表頭結點的定義 */
typedef struct Vnode{
    PtrToAdjVNode FirstEdge;/* 邊表頭指針 */
    DataType Data;            /* 存頂點的數據 */
    /* 注意:很多情況下,頂點無數據,此時Data可以不用出現 */
} AdjList[MaxVertexNum];    /* AdjList是鄰接表類型 */
 
/* 圖結點的定義 */
typedef struct GNode *PtrToGNode;
struct GNode{  
    int Nv;     /* 頂點數 */
    int Ne;     /* 邊數   */
    AdjList G;  /* 鄰接表 */
};
typedef PtrToGNode LGraph; /* 以鄰接表方式存儲的圖類型 */
 
 
 
LGraph CreateGraph( int VertexNum )
{ /* 初始化一個有VertexNum個頂點但沒有邊的圖 */
    Vertex V;
    LGraph Graph;
     
    Graph = (LGraph)malloc( sizeof(struct GNode) ); /* 建立圖 */
    Graph->Nv = VertexNum;
    Graph->Ne = 0;
    /* 初始化鄰接表頭指針 */
    /* 注意:這裏默認頂點編號從0開始,到(Graph->Nv - 1) */
       for (V=0; V<Graph->Nv; V++)
        Graph->G[V].FirstEdge = NULL;
             
    return Graph; 
}
        
void InsertEdge( LGraph Graph, Edge E )
{
    PtrToAdjVNode NewNode;
     
    /* 插入邊 <V1, V2> */
    /* 爲V2建立新的鄰接點 */
    NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV = E->V2;
    NewNode->Weight = E->Weight;
    /* 將V2插入V1的表頭 */
    NewNode->Next = Graph->G[E->V1].FirstEdge;
    Graph->G[E->V1].FirstEdge = NewNode;
         
    /* 若是無向圖,還要插入邊 <V2, V1> */
    /* 爲V1建立新的鄰接點 */
    NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
    NewNode->AdjV = E->V1;
    NewNode->Weight = E->Weight;
    /* 將V1插入V2的表頭 */
    NewNode->Next = Graph->G[E->V2].FirstEdge;
    Graph->G[E->V2].FirstEdge = NewNode;
}
 
LGraph BuildGraph()
{
    LGraph Graph;
    Edge E;
    Vertex V;
    int Nv, i;
     
    scanf("%d", &Nv);   /* 讀入頂點個數 */
    Graph = CreateGraph(Nv); /* 初始化有Nv個頂點但沒有邊的圖 */ 
     
    scanf("%d", &(Graph->Ne));   /* 讀入邊數 */
    if ( Graph->Ne != 0 ) { /* 如果有邊 */ 
        E = (Edge)malloc( sizeof(struct ENode) ); /* 建立邊結點 */ 
        /* 讀入邊,格式爲"起點 終點 權重",插入鄰接矩陣 */
        for (i=0; i<Graph->Ne; i++) {
            scanf("%d %d %d", &E->V1, &E->V2, &E->Weight); 
            /* 注意:如果權重不是整型,Weight的讀入格式要改 */
            InsertEdge( Graph, E );
        }
    } 
 
    /* 如果頂點有數據的話,讀入數據 */
    for (V=0; V<Graph->Nv; V++) 
        scanf(" %c", &(Graph->G[V].Data));
 
    return Graph;
}

/* 鄰接矩陣存儲的圖 - BFS */
 
/* IsEdge(Graph, V, W)檢查<V, W>是否圖Graph中的一條邊,即W是否V的鄰接點。  */
/* 此函數根據圖的不同類型要做不同的實現,關鍵取決於對不存在的邊的表示方法。*/
/* 例如對有權圖, 如果不存在的邊被初始化爲INFINITY, 則函數實現如下:         */
bool IsEdge( MGraph Graph, Vertex V, Vertex W )
{
    return Graph->G[V][W]<INFINITY ? true : false;
}
 
/* Visited[]爲全局變量,已經初始化爲false */
void BFS ( MGraph Graph, Vertex S, void (*Visit)(Vertex) )
{   /* 以S爲出發點對鄰接矩陣存儲的圖Graph進行BFS搜索 */
    Queue Q;     
    Vertex V, W;
 
    Q = CreateQueue( MaxSize ); /* 創建空隊列, MaxSize爲外部定義的常數 */
    /* 訪問頂點S:此處可根據具體訪問需要改寫 */
    Visit( S );
    Visited[S] = true; /* 標記S已訪問 */
    AddQ(Q, S); /* S入隊列 */
     
    while ( !IsEmpty(Q) ) {
        V = DeleteQ(Q);  /* 彈出V */
        for( W=0; W<Graph->Nv; W++ ) /* 對圖中的每個頂點W */
            /* 若W是V的鄰接點並且未訪問過 */
            if ( !Visited[W] && IsEdge(Graph, V, W) ) {
                /* 訪問頂點W */
                Visit( W );
                Visited[W] = true; /* 標記W已訪問 */
                AddQ(Q, W); /* W入隊列 */
            }
    } /* while結束*/
}
/* 鄰接表存儲的圖 - DFS */
 
void Visit( Vertex V )
{
    printf("正在訪問頂點%d\n", V);
}
 
/* Visited[]爲全局變量,已經初始化爲false */
void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) )
{   /* 以V爲出發點對鄰接表存儲的圖Graph進行DFS搜索 */
    PtrToAdjVNode W;
     
    Visit( V ); /* 訪問第V個頂點 */
    Visited[V] = true; /* 標記V已訪問 */
 
    for( W=Graph->G[V].FirstEdge; W; W=W->Next ) /* 對V的每個鄰接點W->AdjV */
        if ( !Visited[W->AdjV] )    /* 若W->AdjV未被訪問 */
            DFS( Graph, W->AdjV, Visit );    /* 則遞歸訪問之 */
}

無向圖鄰接矩陣表示法+DFS&&BFS遍歷:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

#define MVNum 100                       	//最大頂點數 
typedef char VertexType;              	//假設頂點的數據類型爲字符型 
typedef int ArcType;                  	//假設邊的權值類型爲整型 
typedef struct{ 
  	VertexType vexs[MVNum];            		//頂點表 
  	ArcType arcs[MVNum][MVNum];      	//鄰接矩陣 
  	int vexnum,arcnum;                	//圖的當前點數和邊數 
}AMGraph; 

void create(AMGraph &g)
{
	scanf("%d %d", &g.vexnum, &g.arcnum);
	getchar();
	for (int i = 0; i < g.vexnum; i++)
	{
		scanf("%c", &g.vexs[i]);
		getchar();
	}
	for (int i = 0; i < MVNum; i++){
		for (int j = 0; j < MVNum; j++){
			g.arcs[i][j] = 0;
		}
	}
	char u,v;
	for (int i = 0; i < g.arcnum; i++){
		scanf("%c %c",&u,&v);
		getchar();
		int m = -1, n = -1, k;
		for ( k = 0; k < g.vexnum; k++)
		{
			if(g.vexs[k] == u) m = k;
			if(g.vexs[k] == v) n = k;
		} 
		g.arcs[m][n] = 1;
		g.arcs[n][m] = 1;
	}

void dfs(AMGraph &g, int v)
{
	visited[v] = 1;
	printf("%c ",g.vexs[v]);
	for(int w = 0;w < g.vexnum; w++)
	{
		if((g.arcs[v][w] != 0) && (!visited[w]))
			dfs(g,w);
	}
}

void bfs(AMGraph &g, int v)
{
	printf("%c ",g.vexs[v]);
	visited[v] = 1;
	queue<int> q;
	q.push(v);
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		for(int i = 0;i < g.vexnum;i++)
		{
			if(!visited[i] && g.arcs[u][i] != 0)
			{
				printf("%c ",g.vexs[i]);
				visited[i] = 1;
				q.push(i);
			}
		}
	}
}

int main(){
	AMGraph g;
	create(g);
	memset(visited, 0, sizeof(visited));
	dfs(g, 0);
	printf("\n");
	memset(visited, 0, sizeof(visited));
	bfs(g, 0);
	printf("\n");
	
}

無向圖的鄰接表表示方法+DFS&&BFS遍歷:

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;

#define MVNum 10

typedef char VextexType;
typedef struct ArcNode {
       int adjvex;			// 該邊的起始點位置(下標)
       struct ArcNode *nextarc;   	 // 指向下一條邊的指針
}ArcNode;	 // 邊結點 

typedef struct { 	
       VextexType data; 	// 頂點信息
       ArcNode *firstarc;   	// 指向第一條依附該頂點的邊 
}VNode;	  // 頂點結點 

typedef struct 	
{     VNode vertices[MVNum];	// 頂點數組 
      int vexnum, arcnum; 	  	 // 當前頂點數和邊數
}ALGraph;    // 鄰接表 



void create(ALGraph &g)
{
	scanf("%d %d", &g.vexnum, &g.arcnum);
	getchar();
	for (int i = 0; i < g.vexnum; i++)
	{
		scanf("%c", &g.vertices[i].data);
		getchar();
		g.vertices[i].firstarc = NULL;
	}
	char u,v;
	for (int i = 0; i < g.arcnum; i++)
	{
		scanf("%c %c",&u,&v);
		getchar();
		int m = -1, n = -1, k;
		for (k = 0; k < g.vexnum; k++)
		{
			if(g.vertices[k].data == u) m = k;
			if(g.vertices[k].data == v) n = k;
		} 
		ArcNode *p = new ArcNode;
		p->adjvex = n;
		p->nextarc = g.vertices[m].firstarc;
		g.vertices[m].firstarc = p;
		
		p = new ArcNode;
		p->adjvex = m;
		p->nextarc = g.vertices[n].firstarc;
		g.vertices[n].firstarc = p;
	}
}

void dfs(ALGraph &g, int v)
{
    printf("%c ", g.vertices[v].data);
	visited[v]=1;
	ArcNode *p = g.vertices[v].firstarc;
	while(p)
	{
		int w = p->adjvex;
		if(!visited[w]){
			dfs(g, w);
		}
		p = p->nextarc;
	}
}

void bfs(ALGraph &g, int v)
{
	queue<int> q;
	printf("%c ", g.vertices[v].data);
	visited[v]=1;
	q.push(v);
	while(!q.empty())
	{
		int u = q.front();
		q.pop();
		ArcNode *p = g.vertices[u].firstarc;
		while(p)
		{
			int w = p->adjvex;
			if(!visited[w])
			{
				printf("%c ", g.vertices[w].data);
				visited[w] = 1;
				q.push(w);
			}
			p = p->nextarc;
		}
	}    
}

int main()
{
	ALGraph g;
	create(g);
	memset(visited, 0, sizeof(visited));
	dfs(g, 0);
	printf("\n");
	memset(visited, 0, sizeof(visited));
	bfs(g, 0);
	printf("\n");
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章