对无向图的dfs_不用递归,回溯搜索

每走一步压栈一次,当无法继续向前时进行回溯,注意开头节点要求[v][i]————v==i

#include<stdio.h>
#include<stdlib.h>
typedef struct stack {
	int data;
	struct stack* next;
}stack,*linklist;
void visit(int visit_point) {
	printf("\n访问点 : %d",visit_point);
}
linklist push(linklist node, int visit_point) {
	linklist head = (linklist)malloc(sizeof(stack));
	if (!head) {
		return head;
	}
	node->data = visit_point;
	head->next = node;
	return head;
}
/*
{0, 0, 0, 0, 0, 0, 0,
		0, 1, 1, 0, 0, 1, 0,
		0, 1, 0, 0, 1, 0, 0,
		0, 0, 0, 0, 1, 0, 0,
		0, 0, 0, 1, 0, 1, 1,
		0, 1, 0, 0, 1, 0, 0,
		0, 0, 0, 0, 1, 0, 0}
					搜索结果:1,2,4,3,5,6
*/
int main() {
	int arr[7][7] = { 0,0,0,0,0,0,0,
					 0,1,1,0,0,1,0,
					 0,1,0,0,0,1,1,
					 0,0,0,0,1,0,0,
					 0,0,0,1,0,1,0,
					 0,1,1,0,1,0,0,
					 0,0,1,0,0,0,0 };
	//搜索结果:1,2,5,4,3,6
	int v = 1, i = 1;
	printf("以点%d为原点进行访问",v);
    linklist sk_head = (linklist)malloc(sizeof(stack));
	if (!sk_head) {
		return 0;
	}
	sk_head->next = NULL;
	linklist rear = NULL;
	int count = 0,j;
	while (count<6) {
		if (arr[v][i] != 0) {
			visit(i);
			//arr[v][i] = 2;
			count++;
			sk_head = push(sk_head, i);
			rear = sk_head->next;
			if (!sk_head) {
				printf("\n由于申请内存空间失败,你将无法进行后续搜索\n");
				return 0;
			}
			v = i;
			i = 0;
			for (j = 1; j <= 6; j++) {
				linklist p = sk_head->next;
				int flag = 1;
				while (p) {
					if (j == p->data) {
						flag = 0;
						break;
					}
					p = p->next;
				}
				if (flag == 1 && arr[v][j] == 1) {
					i = j;
					break;
				}
			}
		}
		else {
			v = rear->data;
			for (j = 1; j <= 6; j++) {
				linklist p = sk_head->next;
				int flag = 1;
				while (p) {
					if (j == p->data) {
						flag = 0;
						break;
					}
					p = p->next;
				}
				if (flag == 1 && arr[v][j] == 1) {
					i = j;
					break;
				}
			}
			rear = rear->next;
		}
	}
	//回收内存
	linklist q = sk_head->next;
	while (sk_head) {
		free(sk_head);
		sk_head = q;
		if (sk_head) {
			q = sk_head->next;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值