ImageVerifierCode 换一换
格式:PPT , 页数:22 ,大小:200.50KB ,
资源ID:3788632      下载积分:15 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-3788632.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构 第2章-2线性表的单链表存储结构.ppt)为本站会员(Facebook)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

数据结构 第2章-2线性表的单链表存储结构.ppt

1、1,typedef struct Node DataType data; struct Node *next; SLNode, *LinkList;,对于线性表的单链表存储结构描述:,讨论:,问1:第一行的Node 与最后一行的SLNode是不是一回事? 答1:不是。前者Node是结构名,后者SLNode是对整个struct类型的一种“缩写”,是一种“新定义名”,它只是对现有类型名的补充,而不是取代。,请注意:typedef不可能创造任何新的数据类型,而仅仅是在原有的数据类型中命名一个新名字,其目的是使你的程序更易阅读和移植。,2,typedef struct student char nam

2、e; int age; student,*pointer;,注意:student和student同名但不同意。同名是为了表述起来方便。 例如,若结构名为student,其新定义名缩写也最好写成student,因为描述的对象相同,方便阅读和理解。,问2:结构体中间的那个struct Node是何意? 答2:在“缩写” SLNode还没出现之前,只能用原始的struct Node来进行变量说明。此处说明了指针分量的数据类型是struct Node。,3,例: 单链表的建立和输出,例:用单链表结构来存放26个英文字母组成的线性表(a,b,c,z),请写出C语言程序。,实现思路:先开辟头指针,然后陆续

3、为每个结点开辟存储空间并及时赋值,后继结点的地址要提前送给前面的指针。,先挖“坑”,后种“萝卜”!,4,#include #include typedef struct node char data; struct node *next; node;,将全局变量及函数提前说明:,node *p,*q,*head; /一般需要3个指针变量 int n ; / 数据元素的个数 int m=sizeof(node); /*结构类型定义好之后,每个node类型的长度就固定了,m求一次即可*/,5,新手特别容易忘记!, int i; head=(node*)malloc(m); /m=sizeof(no

4、de) 前面已求出 p=head; for( i=1; idata=i+a-1; / 第一个结点值为字符a p-next=(node*)malloc(m); /为后继结点“挖坑”! p=p-next; /让指针变量P指向后一个结点 p-data=i+a-1; /最后一个元素要单独处理 p-next=NULL ; /单链表尾结点的指针域要置空!,void build( ) /字母链表的生成。要一个个慢慢链入,6,p=head; while (p) /当指针不空时循环(仅限于无头结点的情况)printf(“%c“,p-data);p=p-next; /让指针不断“顺藤摸瓜” ,讨论:要统计链表中数

5、据元素的个数,该如何改写?,sum+;,sum=0;,void display() /*字母链表的输出*/,7,void main( ) build( ); display( ); 问:上述建立的单链表带头结点吗?,8,二、单链表的操作实现,定义单链表结点的结构体如下: typedef struct Node DataType data; struct Node *next; SLNode; 、初始化 void ListInitiate(SLNode *head) *初始化*/ /*如果有内存空间,申请头结点空间并使头指针head指向头结点*/if(*head = (SLNode *)mall

6、oc(sizeof(SLNode) = NULL) exit(1);(*head)-next = NULL; /*置链尾标记NULL */ ,9,、求单链表中数据元素的个数 int ListLength(SLNode *head) SLNode *p = head; /*p指向头结点*/ int size = 0; /*size初始为0*/ while(p-next != NULL) /*循环计数*/ p = p-next; size +; return size; ,10,在链表中插入一个元素X 的示意图如下:,链表插入的核心语句:,Step 1:q-next=p-next; Step 2:

7、p-next=q ;,p-next,s-next,思考:Step1和2能互换么?,X 结点的生成方式: m=sizeof(SLNode); q=(SLNode *)malloc(m); q-data=X ; q-next= ?,、向单链表中插入一个元素,11,int ListInsert(SLNode *head, int i, DataType x) SLNode *p, *q; int j; p = head; j = -1;while(p-next != NULL 注:此单链表是带头结点的,12,在链表中删除某元素b的示意图如下:,删除动作的核心语句(要借助辅助指针变量q):,q = p

8、-next; /首先保存b的指针,靠它才能找到c; p-next=q-next; /将a、c两结点相连,淘汰b结点; free(q) ; /彻底释放b结点空间,p-next,思考: 省略free(q)语句行不行?,(p-next) - next,q,、从 单链表中删除一个元素,13,int ListDelete(SLNode *head, int i, DataType *x) SLNode *p, *s; int j; (1) p = head; j = -1; while(p-next != NULL ,14,三、单链表的操作效率分析,(1) 查找 因线性链表只能顺序存取,即在查找时要从头

9、指针找起,查找的时间复杂度为 O(n)。,时间效率分析,(2) 插入和删除 因线性链表不需要移动元素,只要修改指针,仅就插入或删除而言,时间复杂度为 O(1)。,但是,如果要在单链表中进行在某结点前插或删除操作,因为要从头查找前驱结点,所以一般情况下,单链表插入和删除操作的时间复杂度是 O(n)(同顺序表)。,15,四、应用举例,例、编程实现:建立一个单链表,首先依次输入数据元素,10,然后删除数据元素,最后依次显示当前表中的数据元素。#include #include #include typedef int DataType; #include “LinList.h“,重点是链表,16,v

10、oid main(void) SLNode *head; int i , x; ListInitiate( ,17,for(i = 0; i ListLength(head); i+) if(ListGet(head, i, ,18,五、循环单链表,x,head,a0,an,循环链表示意图:循环单链表是单链表的另一种形式,其结构特点是链表中的最后一个结点的指针域不再是结束标记,而是指向整个链表的第一个结点,从而使链表形成一个环。 问:带头结点的循环单链表的插入、删除算法如何写?,head,19,例2:试用C语言编写一个算法,将一循环单链表就地逆置。,操作前:(a1, a2, ai-1,ai,

11、ai+1 ,, an),操作后:( an, ai+1 ,ai, ai-1 ,, a2, a1 ),20,q=head; p=head-next; /有头结点 while(p!=head) /循环单链表 r=p-next;p-next=q; /前驱变后继q=p;p=r; /准备处理下一结点 head-next=q; / 以an为首,q=head; p=head-next; /有头结点 while(p!=head) /循环单链表 s=q;q=p; p=p-next;q-next=s; /准备处理下一结点 p-next=q; / 以an为首,(要求同学们根据下面算法的核心语句,编写一个完整算法) 算法的核心语句 A 或 B,21,例3: 试写一算法,实现顺序表的就地逆置,即利用原表的存储空间将线性表(a1,a2,an)逆置为(an,an-1,.,a1)。参考程序: void inverse (SeqList *L ) DataType temp; int i;for ( int i=0; isize-1)/2;i+ ) /循环次数为表长的一半temp=L-listi; L-listi= L-listL-size-i-1;L-listL-size-i-1=temp; ,22,

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报