第十章 高级链表.pptVIP

  • 2
  • 0
  • 约8.36千字
  • 约 33页
  • 2016-05-21 发布于湖北
  • 举报
10.2.3 双链表的删除 删除首节点: HEAD = Pointer-Next HEAD-Back = NULL free(Pointer) 删除中间节点: Back = Pointer-Back Back-Next = Pointer-Next Pointer-Next-Back = Back free(Pointer) 删除尾端节点: Back = Pointer-Back Back-Next = Pointer-Next free(Pointer) * 10.2.3 双链表的删除 双链表中节点的删除操作 * /* 删除双链表内节点 */ DLink Delete_DList(DLink Head,int Key) { Pointer = Head; /* Pointer指针设为首节点 */ while ( 1 ) { if ( Pointer-Next == NULL ) { printf(Not Found!!\n); break; } if ( Head-Number == Key ) /* 删除首节点 */ { Head = Pointer-Next; Head-Back = NULL; free(Pointer); break; } Pointer = Pointer-Next; /* 往下一个节点 */ if ( Pointer-Number == Key ) { Back = Pointer-Back; Back-Next = Pointer-Next; if ( Pointer-Next != NULL ) /* 删除中间节点 */ Pointer-Next-Back = Back; free(Pointer); break; } } return Head; } * 第十章 高级链表 * 10.1 循环链表 10.2 双链表 * 单链表 线性结构:结构中的数据元素之间存在一对一的关系。 线性表 数组 链表 堆栈和队列 线性表是具有相同数据类型的n(n=0)个数据元素的有限序列,通常记为:a0,a1,…?ai-1,ai,ai+1,…an-1?,其中n为表长,n=0?时称为空表; 表中相邻元素之间存在着顺序关系,将ai-1称为ai的直接前趋, ai+1称为ai的直接后继; 非空线性表有且只能有一个开始节点和终端节点,其它的节点前后只能有一个直接前趋节点和直接后继节点。 * 单链表 链表是一种线性表,链表的内容通常是存储于内存中分散的位置上。 单链表: 为了能正确表示节点间的逻辑关系,在存储每个节点值的同时,还必须存储指示其后继节点的地址(或位置)信息。 每个节点(node)所占的存储空间分为两部分:存放对应元素值的域称为数据域(data field),存放后继节点地址信息的域称为指针域(next field) ; * 单链表 相邻节点之间通过指针域建立起前后链接的关系,使得分散存储的一个个节点形成一个整体的链状结构; 第一个节点无前趋,故应设头指针指向第一个节点 ;最后一个节点由于没有后继 ,故指针域为空值 ; 这样的指向关系是单向的,所以称这样的链表为单链表。 * 虽然多个节点的存储位置可能是分散的,但是,只要知道头指针变量的值,就可以顺着这条链依次访问到每一个节点,因而,一个单链表可以由头指针唯一确定。 在C语言中,节点结构的声明格式如下: struct 结构名称 { 数据类型 数据变量; struct List *next; } typedef struct 结构名称 Node; typedef Node *Link; 在程序中要使用此结构只需要声明为: Link 变量名称 单链表 * 10.1 循环链表 单链表上的访问是一种从前向后的顺序访问,从其中某一个节点出发,可以找到它的直接后继,但无法找到它的直接前驱; 最后一个节点的指针域为NULL,表示单链表已经结束。如果将最后一个节点的指针域存放链表中头节点的地址,就使得整个链表构成一个环,称这样的链表为循环链表。 * 10.1 循环链表 判定一个循环链表为空表的条件是:head-next==head; 则判定指针Pointer指向的节点为链表尾节点的条件是:Pointer-next= =head。 * 10.1 循环链表 循环链表的操作算法和单链表的操作算法相似,差别在于算法中的判定条件; 在单链表中循环或选择语句

文档评论(0)

1亿VIP精品文档

相关文档