软件技术基础_链表.ppt

  1. 1、本文档共51页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
软件技术基础_链表

二、链表 动态数据结构 若一种数据结构,在物理上并不一定占用连续的内存空间,且占用的内存空间在程序运行期间可以动态地变化,可以根据需要随机地增加或删除其元素,就称为动态数据结构 动态数据结构分配内存空间时必须采用动态存储分配技术 链表是一种动态数据结构 内存动态申请和释放 void * malloc(unsigned int size) 在动态存储区分配长度为size的连续空间,并返回指向该空间起始地址的指针。若分配失败(系统不能提供所需内存),则返回空指针(NULL)。 例:int *p=(int *)malloc(sizeof(int)*length); void free(void * ptr) 释放ptr指向的内存空间; ptr是malloc( )函数返回的指针。 例:free(p); 3、双向链表 C语言描述: 4、循环链表 例:将两个带头结点的循环链表连接成一个链表。 P.19 例:两个一元多项式相加 作业: p74第10题 分别写出双向链表结点ai前插入新元素和删除结点ai算法的关键语句,设temp指向ai-1 上机实验二:链表(4学时) 链表的特点: 1)操作的顺序性:平均n/2次查找过程 2)离散存放:不受链表初始大小限制 不进行结点内容的搬移 查找操作:顺序表优于链表 插入删除操作:链表优于顺序表 特点:每一个链点包含两个指针, 前趋指针P,后继指针N a1 …… head tail N a2 N P an P a1 N P P:prior N:next typedef struct double_link_node { struct double_link_node *prior; struct double_link_node *next; elemtype data; }dl_node_type ; typedef struct { dl_node_type *head; dl_node_type *tail; int length; }dl_list_type; 链点的定义 链表的定义 ai-1 N P 双向链表的插入操作: ai N P *问题描述:在元素ai前插入新元素anew anew N P 1、 pnew ->next = &ai 2、 pai-1 ->next = pnew 3、 pnew ->prior = &ai-1 4、 pai ->prior = pnew temp pnew->next = temp; temp->prior->next = pnew; pnew->prior = temp->prior; temp->prior = pnew; pnew *算法实现(略) *体会: 插入操作有多种方式实现,步骤比较复杂 双向链表的使用灵活,可进可退 *思考: 四个步骤的组合顺序里,哪些是正确的、 哪些是错误的? 双向链表的删除操作: *问题描述:删除元素ai ai-1 N P ai N P ai+1 N P temp temp -> prior -> next = temp -> next ; temp -> next -> prior = temp -> prior ; free(temp); a1 ai+1 an head tail ai-1 ... ... ai *将链表头尾相接* 对循环链表的遍历可以从任何一个节点开始 ai+1 an tail a1 ... ai … head 例:删除一个单向链表中数据大于100的所有结点 *算法分析: 1) 逐个取结点元素进行比较 ai-1 ai ai+1 …… …… current while(current!=NULL){ …… current=current->next; } 2) 删除大于100的结点 if(current->data>100){ 删除由current指针指向的结点 } ai-1 ai ai+1 …… …… current last last->next=current->next; free(current); current=last->next; 删除操作: 否则,移动指针: last=current; current=current->next; *注意:last指针的作用 3) 边界问题: 被删结点是第一个结点 if(current==head){ head=head->next; free(current); current=head; } *算法实现: void deleteover100(list_type

您可能关注的文档

文档评论(0)

mv2323 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档