每走一步压栈一次,当无法继续向前时进行回溯,注意开头节点要求[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;
}