第九饼结构
1 第九讲 结构
结构的概念与应用 例:跳马。依下图将每一步跳马之后的位置(x2y)放到 个“结点”里,再用“链子穿起来”,形成一条 链,相邻两结点间用一个指针将两者连到一起。 结点10123 678
2 例:跳马。依下图将每一步跳马之后的位置(x,y)放到 一个“结点”里,再用“链子穿起来”,形成一条 链,相邻两结点间用一个指针将两者连到一起。 结构的概念与应用 0 1 2 3 4 5 6 7 8 4 3 2 1 结点 1 2 3 4 5 6 7
依上图有7个结点 (x1,y1)|r1(x2y2) (x6,y6) (x72y7 为了表示这种既有数据又有指针的情况,引入结构 这种数据类型
3 依上图有7个结点 (x1,y1) (x2,y2) (x6,y6) (x7,y7) 为了表示这种既有数据又有指针的情况,引入结构 这种数据类型
结构是一种构造类型的数据类型。结构是数 目固定、类型不同的若干变量的有序集合。结 构与数组的区别在于结构内允许有不同类型的 数据。 结构的定义,格式如下: sruc
4 结构——是一种构造类型的数据类型。结构是数 目固定、类型不同的若干变量的有序集合。结 构与数组的区别在于结构内允许有不同类型的 数据。 结构的定义,格式如下: struct { }
例如跳马棋局可如下定义 struct TM int x,y; ∥结构TM的成员,x2y为整数型 struct TM*next∥/结构TM的成员,属TM型 下面的表是马的跳步方案,从左下角跳到右上角 结点n1m2n3n4n5n6n7 0 2 6 8 y02 3 4
5 例如跳马棋局可如下定义 struct TM { int x,y; // 结构TM的成员,x,y为整数型 struct TM *next // 结构TM的成员,属TM型 } 下面的表是马的跳步方案,从左下角跳到右上角 结点 n1 n2 n3 n4 n5 n6 n7 x y 0 0 1 2 2 4 4 3 6 4 7 2 8 4
head &n &n3 &n4 NULL &n1 NULL为空地址 下面是形成链表的一个参考程序(分三页)
6 8 4 NULL NULL为空地址 下面是形成链表的一个参考程序(分三页) 2 4 &n4 1 2 &n3 0 0 &n2 &n1 head
∥结构1c #include ∥预编译命令 #define null o ∥定义空指针常量 struct TM ∥定义结构TM int x,y ∥整型变量x,y struct TM *next ∥指向TM结构的指针 void maino ∥主函数 ∥主函数开始 ∥声明整型变量 ∥声明TM结构n1~n7,结构指针head,p struct TM nl, n2, n3, n4, n5, n6, n7, * head, * p
7 // 结构1.c #include // 预编译命令 #define null 0 // 定义空指针常量 struct TM // 定义结构TM { int x,y; // 整型变量x,y struct TM *next; // 指向TM结构的指针 }; void main() // 主函数 { // 主函数开始 int i; // 声明整型变量 // 声明TM结构n1~n7,结构指针head,p struct TM n1,n2,n3,n4,n5,n6,n7,*head,*p;
∥分别对TM结构n1~n7中的xy赋值 n1x=0;n1y=0 n2.x=1;n2y=2 n3. x-2: n3.Y n4.x=4;n4.y=4 n5.x=6;n5.v=4 n6,x=7;n6y=2 n7x=8;n7y=4 ∥head赋值为n1,即head指向n1 head =&nl ∥n1~n7构成链表 n1. next=&n2: 2.next=&n3 n3. next=&n4 n4. next=&n5 n5.next=&n6 n6. next=&n7 ∥n7的next指针赋值为空指针 next=null
8 // 分别对TM结构n1~n7中的x,y赋值 n1.x=0;n1.y=0; n2.x=1;n2.y=2; n3.x=2;n3.y=4; n4.x=4;n4.y=4; n5.x=6;n5.y=4; n6.x=7;n6.y=2; n7.x=8;n7.y=4; // head赋值为n1,即head指向n1 head=&n1; // n1~n7构成链表 n1.next=&n2; n2.next=&n3; n3.next=&n4; n4.next=&n5; n5.next=&n6; n6.next=&n7; // n7 的next指针赋值为空指针 n7.next=null;
p=head;∥/p赋值为head,即p指向head所指的内容 i=1;∥/i赋值为1 do ∥直到型循环 ∥循环体开始 ∥输出结点信息 printi("结点%:x=%d,y=%dm",ip->x,p->y); p=p->next; ∥lp指向下一个结点 i+1 ∥计数加1 } while(p!=nu;∥未到达链表尾部,则继续循环 ∥主函数结束
9 p=head; // p赋值为head,即p指向head所指的内容 i=1; // i赋值为1 do // 直到型循环 { // 循环体开始 // 输出结点信息 printf("结点%d: x=%d, y=%d\n",i,p->x,p->y); p=p->next; // p指向下一个结点 i=i+1; // 计数加1 } while(p!=null); // 未到达链表尾部,则继续循环 } // 主函数结束
用结构数组,利用键盘输入结点中的数据。 重点看 scanf(%d”,&a); n.x-a 结构数组,数组中的元素为结构类型的数据,如n81 ∥结构2c #include <stdio. h ∥预编译命令 #define null o ∥定义空指针常量 struct TM ∥定义TM结构 int x, y; ∥整型变量x,y struct TM *next: ∥指向TM结构的指针
10 用结构数组,利用键盘输入结点中的数据。 重点看 scanf(“%d”,&a); n[i].x=a; 结构数组,数组中的元素为结构类型的数据,如n[8] // 结构2.c #include // 预编译命令 #define null 0 // 定义空指针常量 struct TM // 定义TM结构 { int x,y; // 整型变量x,y struct TM *next; // 指向TM结构的指针 };