第10章 结构体与共用体.ppt
文本预览下载声明
内容回顾 10.1 自定义类型标识符 结构体导入 11.2 结 构 体 ⒉ 定义结构变量 ⑶直接定义结构体变量。 ⑷用typedef将结构体类型定义新类型,再定义变量。 ⒋ 结构体变量的引用 (3)可以对变量、数组元素及其成员进行取地址运算 取结构体变量的地址为: 结构体变量名 如:std 取结构体成员的地址为: 结构体变量名.成员 如:std.age (4)成员运算符“.”和指向运算符“-”的优先级最高,结合性自右向左。 ++sp-num等价于++(sp-num) sp-num++等价于(sp-num)++ (5)成员运算符的优先级高于地址运算符 (*sp).name 不同于*sp.name、*sp-name 若有struct student std={20001,John,M,19,85},*sp=std; 则 *((*sp).name)值为John 而 *sp.name 错误 但 *sp-name值为c (6)结构体指针只能指向同类结构体,不能指向结构体成员 若有STREC std,*pstd, pers[3]; 则sp=pers[2].num 错误 ⒌ 函数之间结构体变量的数据传递 6. 用指针处理链表 3. 链表的输出 4. 链表的删除 5. 链表的插入 共用体与结构体的区别 思考题 例10.10 编写函数delete( )实现链表的删除操作 基本思路: 通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域找到学号为num的结点,修改其前一个节点的指针域的值,使他指向他的下一个结点。 q-next=p-next; free(p); STUD *delete(STUD *head,int num) { STUD *p,*q; if(head==NULL) {printf("list null!");return(0);} p=head; while(num!=p-num p-next!=NULL) /* p指向的不是要找的结点,并且后面还有结点*/ { q=p;p=p-next;} /*向后移一个结点*/ if(num==p-num) /*找到了待删结点*/ { if(p==head) head=p-next;/* 待删的是第一个结点 */ else q-next=p-next;/* 待删的不是第一个结点 */ printf("delete :%d\n",p-num); free(p); } else /*没有找到待删结点*/ printf("%ld not been found!\n",num); return(head); } 例10.11 编写插入结点的函数insert( ),实现在有序链表中结点的插入操作(假设链表按照num(学号)从小到大顺序排列)。 基本思路: 通过单链表的头指针,首先找到链表的第1个结点;然后顺着结点的指针域找到值为x的节点,然后将新结点y插入。 q-next=p; r-next=q; STUD *insert(STUD *head,STUD *stud) { STUD *p,*q,*p0; p=head; /* 设置扫描指针p */ p0=stud; /*p0指向要插入的结点*/ if(head==NULL) /*原来是空表*/ { head=p0;p0-next=NULL;} else { while((p0-nump-num) (p-next!=NULL)) { q=p;p=p-next;} if(p0-num=p-num) { if(head==p)head=p0;/*插到原来第一个结点之前*/ else q-next=p0; /*插到q指向的结点之后*/ p0-next=p; } else { p-next=p0;p0-next=NULL;}/*插到最后的结点之后*/ } return(head); } 例10.12 编写主函数调用以上各函数 STUD *creat( );void print(STUD *head); STUD *delete(STUD *head,int num); STUD *insert(STUD *head,STUD *stud); main( ) { STUD *head ,*stu; int del_num; printf
显示全部