第二章-单链表.pptVIP

  • 1
  • 0
  • 约9.92千字
  • 约 50页
  • 2025-10-22 发布于江苏
  • 举报

为什么引入链表回顾:顺序表的特点:1.存储单元的地址连续;2.逻辑相邻物理位置也相邻;3.查找方便,但删除和插入操作却需要移动大量数据元素,导致效率低下;思考:如何改善这种效率低下的缺点?——链表2.3线性表的链式表示和实现2.3.1单链表的存储结构2.3.2单链表的操作实现2.3.3单链表的效率分析2.3.1单链表的存储结构1.由地址任意的存储单元存储表中的数据元素2.为了表示数据元素间的逻辑关系,引入存储映像3.存储映像=“结点”(数据域+指针域)4.n个结点构成一个链表结点(数据元素的存储映像)=数据域+指针域结点的C语言描述typedefstructNode{DataTypedata;structNode*next;}SLNode,*LinkList;SLNode为结构类型名:该类型的结构变量用于表示链表中的一个结点;LinkList为结构指针类型名:该类型变量存放指向LNode类型结构变量的地址;常见的单链表结点—内存链表例:带头结点单链表和不带头结点单链表的比较带头结点和不带头结点单链表设计单链表头结点,则在第一个数据元素结点前插入/删除还是在其他数据元素结点前插入/删除,都不会改变头指针的值;若不设计单链表头结点,则在第一个数据元素结点前插入/删除和在其他数据元素结点前插入/删除算法的处理方法不同。★设计头结点的其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理,编程更方便。因此,单链表一般构造成带头结点的单链表。2.3线性表的链式表示和实现2.3.1单链表的存储结构2.3.2单链表的操作实现2.3.3单链表的效率分析分配结点单链表中的每个结点,是在需要时向系统申请的,这种被称为动态内存空间申请。头文件malloc.h①动态申请:函数返回值为申请内存空间的首地址;void*malloc(sizeof(定义的数据类型))②动态释放:voidfree(void*p)③sizeof运算符:用于返回给定的数据类型所占字节个数;初始化链表★功能:建立一个空的链表L★思路:调用malloc()分配一结点的空间,并将其地址赋值给链表的头指针head。voidListInitiate(SLNode**head){*head=(SLNode*)malloc(sizeof(SLNode));(*head)-next=NULL;}单链表定位定位结点a2:指针P指向结点a2则P-next指向后一个数据元素(a3)的指针;读取结点a2的数据:P-data★取链表中某一个数据元素必须从头指针出发寻找P=L;P=L-next;P=P-next;单链表的数据元素个数★功能:求链表数据元素个数★思路:从头节点开始寻找查找,当下一个节点的地址不为空时,链表中的元素个数加1。voidListLength(SLNode*head){SLNode*p=head;intsize=0;while(p-next!=NULL){p=p-next;size++;}returnsize;}单链表插入功能:在链表的第i个元素前插入新结点,步骤:★定位:查找链表的第i-1个结点进行定位,并使指针p指向第i-1个结点★动态申请:申请一个结点E,指针q指向要插入的节点,最后将q指向的节点插入。★修改指针域ListInsert(SLNode*,inti,DataTypee){SLNode*p,*q;intj=0;p=head;While(P-next!=NULLji-1){p=p-next;j++;}q=(SLNode*)malloc(sizeof(SLNode));q-data=a5;q-next=p-next;p-next=q;return1;}定位ListInsert(SLNode*,inti,DataTypee){SLNode*p,*q;intj=0;p=head;Wh

文档评论(0)

1亿VIP精品文档

相关文档