• 链式存储结构 -- 线性表插入时,中间留有内存地址都有可能应为地址不够或者造成浪费。解决办法是每个元素多用一个位置来存放指向下一个元素位置的指针,这样各个元素都可以找到下一个元素
    链表中第一个结点的存储位置叫头指针,最后一个结点指针为空。
    头结点放在第一个元素的结点之前,其数据域一般无意义(为操作的统一和方便而设立),头指针指向头结点
    

八皇后问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <stdio.h>
int notDanger(int row,int j,int (*chess)[8]){
int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
//判断列方向
for(i;i<8;i++){
if(*(*(chess+i)+j)!=0){
flag1 = 1;
break;
}
}
//判断左上方
for(i=row,k=j;i>=0&&k>=0;i--,k--){
if (*(*(chess+i)+k)!=0) {
flag2=1;
break;
}
}
//判断右下方
for(i=row,k=j;i<8&&k<8;i++,k++){
if (*(*(chess+i)+k)!=0) {
flag3=1;
break;
}
}
//判断右上方
for(i=row,k=j;i>=0&&k<8;i--,k++){
if (*(*(chess+i)+k)!=0) {
flag4=1;
break;
}
}
//判断左下方
for(i=row,k=j;i<8&&k>=0;i++,k--){
if (*(*(chess+i)+k)!=0) {
flag5=1;
break;
}
}
if(flag1||flag2||flag3||flag4||flag5){
return 0;
}else{
return 1;
}
}
int count=0;
void eightQueen(int row,int n,int (*chess)[0]){
int chess2[8][8],i,j;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
chess2[i][j] = 0; //初始化赋0
}
}
if (0==row) {
printf("第%d种\n", count+=1);
for(i=0;i<8;i++){
for(j=0;j<8;j++){
printf("%d ", *(*(chess2+i)+j));
}
printf("\n");
}
printf("\n");
}else{
for(j=0;j<n;j++){
if (notDanger(row,j,chess)) {//判断是否危险
for(i=0;i<8;i++){
*(*(chess2+row)+i)=0;
}
*(*(chess2+row)+i)=1;
eightQueen(row+1,n,chess2);
}
}
}
}
int main(){
int chess[8][8],i,j;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
chess[i][j] = 0; //初始化赋0
}
}
eightQueen(8,8,chess);
printf("总共有%d种解决办法\n", count);
return 0;
}

KMP算法--回溯

二叉树 Binary Tree

不存在度大于2的结点,二叉树要区分左右,叶子深度相同

  • 特殊二叉树

    斜树
    满二叉树 --所有层都满
    完全二叉树 --叶子只能出现在最下两层,序号连续
    


    学习中…