结构体与链表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
结构体与链表
例子
main() { struct student
{ long int num; char name[20]; char sex; float score;
}stu_1, *p; p=&stu_1; stu_1.num=89101; strcpy(stu_1.name,"Li Lin"); p->sex='M'; p->score=89.5; printf("\nNo:%ld\nname:%s\nsex:%c\nscore:%f\n",
struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c); printf("Call Func()....\n"); func(arg); printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c); } void func(struct data parm) { printf("parm.a=%d parm.b=%d parm.c=%d\n",parm.a,parm.b,parm.c); printf("Process...\n"); parm.a=18; parm.b=5; parm.c=parm.a*parm.b; printf("parm.a=%d parm.b=%d parm.c=%d\n",parm.a,parm.b,parm.c); printf("Return...\n"); }
struct data { int a, b, c; }; main() { void func(struct data *parm);
struct data arg; arg.a=27; arg.b=3; arg.c=arg.a+arg.b; printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c); printf("Call Func()....\n"); func(&arg); printf("arg.a=%d arg.b=%d arg.c=%d\n",arg.a,arg.b,arg.c); } void func(struct data *parm) { printf("parm->a=%d parm->b=%d parm->c=%d\n",parm->a,parm->b,parm->c); printf("Process...\n"); parm->a=18; parm->b=5; parm->c=parm->a*parm->b; printf("parm->a=%d parm->b=%d parm->c=%d\n",parm->a,parm->b,parm->c); printf("Return...\n"); }
long num float score; struct student *link; }
用 struct student 本 身说明成员 *link
• 链表的特点:动态性
– 节点可以根据需要增加或减少(插入/删除) – 节点的位置可以调整
原来的链(不含数据节点t)
head
link
link link NULL
向一个空节点,空节点表示为 NULL
head
link
link
data
data
link NULL data
• 链表是由节点构成的,因此,关键就是定义节 点。
• 链表的节点定义打破了先定义再使用的限制, 即,可以用自己定义自己(回想递归函数的定 义也违反了先定义再使用的限制)。
• 例子
#define NULL 0 struct student {
NULL
• 调整节点位置
原来的链
p
q
r
head link
link
link
Data-1 Data-2 Data-3
NULL
调整原来链中的数据节点2和数据节点3的位置(实际上不一定相邻): q->link=r->link; p->link=r; r->link=q;
(main)
a :27
b: 3
arg
c :30
(main) a :27 b: 3 c :30
(func)
****
arg parm
(main) a :18 b: 5 c :90
(func)
****
arg parm
(main)
a :18
b: 5
arg
c :90
链表—指针与结构的综合
• 链表是程序设计中一种重要的动态数据结构, 动态性体现为:
(*p).num, p->name, stu_1.sex,p->score); }
结构体变量作为函数参数
• 用结构体变量的成员作实在参数----值传递 • 用指向结构体变量或数组的指针作参数----地址传递 • 用结构体变量作参数----多值传递,效率低
用结构体变量作函数参数
void func(struct data); struct data { int a, b, c; }; main() {
–链表中的元素个数可以根据需要增加和减少,不像 数组,在声明之后就固定不变;
–元素的位置可以变化,即可以从某个位置删除,然 后再插入到一个新的地方;
• 链表中的元素称为“节点”,每个节点包括两 个大的部分:数据部分和指向其它节点的指针;
• 单向链表通常有一个头指针,用于指向链表头; • 单向链表有一个尾节点,该节点的指针部分指
Data-1 Data-2 Data-3
在原数据节点2和3之间要新增数据节点t: 假定数据节点2和3 分别由指针 p 和 r 指示,待插数据节点t 由 q 指示; 则,新增操作为: q->link=r; p->link=q;
p
q
r
head link
link
link
link
Data-1 Data-2 Data-t Data-3
(main)
(main)
a :27 b: 3
a :27
arg
b: 3
c :30
arg
c :30
(main)
a :27
(main)
b: 3
arg
a :27
c :30
b: 3
பைடு நூலகம்
arg
c :30
(func)
(func)
a :27
a :18
b: 3
parm
b: 5
parm
c :30
c :90
用结构体指针变量作函数参数
相关文档
最新文档