第8章 结构体和共用体 C语言课件.ppt
文本预览下载声明
8.7 用指针处理链表 第8章 动态链表结构需要动态地分配和释放存储空间,即在需要时开辟一个结点的存储空间,在删除某个结点时要释放其占用的存储空间。C语言编译系统提供了如下相关函数。 8.7.3 处理动态链表结点所需的函数 4. sizeof运算符 在处理动态链表时,以上前2个函数在内存动态申请长度为size的连续空间的大小,是用sizeof运算符计算出来的,其语法格式为: sizeof(变量、表达式或类型名) 功能:测试变量、表达式或类型名所占内存的字节数。 8.7 用指针处理链表 第8章 【例8.10】输出链表函数。 /* 依次输出以head开头的链表中所有结点中的数据的函数 */ void print(struct studinf *head) { struct studinf *p; printf(\nNow, These %d records are:\n, n); p=head; if(head) /* 如果头指针不空,说明有结点,则输出数据 */ do { printf(%ld%5.1f\n, p-num, p-score); p=p-next; }while(p!=NULL); } 8.7.5 输出单向链表 8.7 用指针处理链表 第8章 (1)删除任意i结点(操作如图8-9所示) 语句:i-1-next=i-next; 8.7.6 在单向链表中删除结点 删除步骤: ①二个指针p1,p2,p1寻找删除位置,p2指向刚查找过的结点 ②找到删除的结点,又分两种情况 a)删除第一个结点: head=p1-next; b)删除中间或最后一个结点:p2-next=p1-next; 8.7 用指针处理链表 第8章 8.7.6 在单向链表中删除结点 若删除最后一个结点,执行以上语句,同样适合。 8.7 用指针处理链表 第8章 (2)循环条件 查找数num,若num?p1-num 并且p-next?NULL,则往后查,p2=p1,p1=p1-next; 【例8.11】删除给定数据所在结点的函数。 struct studinf *del(struct studinf *head, long num) /* 从head链表中删除学号为num的结点,返回值为链表的首地址 */ { struct studinf *p1, *p2; if(!head){printf(\nlist null!\n); return(head);} /*链表为空,结束操作*/ p1=head; while(num!=p1-nump1-next!=NULL) /*p1所指非要找的结点,且后面还有结点*/ 8.7.6 在单向链表中删除结点 8.7 用指针处理链表 第8章 { p2=p1; p1=p1-next; } /*p2紧跟p1,p1下移一个结点*/ if(num= =p1-num) /*找到了要删除的结点*/ { if(p1= =head) head=p1-next; /*若p1指向的是头结点,则把第二个结点地址赋予head*/ else p2-next=p1-next; /*否则,下一个结点地址赋给前一个结点地址*/ free(p1); printf(delete:%ld\n, num); } else printf(%ld not been found!\n, num); return(head); /*返回删除后的链表头指针*/ } 8.7.6 在单向链表中删除结点 8.7 用指针处理链表 第8章 8.7.7 在链表中插入结点 插入新结点有以下二种情况: (1)原来链表是空的(新建立一个链表,如【例8.9】) (2)原来链表非空,但又分为三种情况,如图8-10所示三种插入位置: a.插入在第一个结点前; b.插入在任意二个结点之间; c.插入在最后; 8.7 用指针处理链表 第8章 8.7.7 在链表中插入结点 8.7 用指针处理链表 第8章 8.7.7 在链表中插入结点 8.7 用指针处理链表 第8章 8.7.7 在链表中插入结点 8.8 共用体 第8章 共用体类型变量定义的一般形式
显示全部