您的位置:逆风者 数据结构 正文
原作者:www.upwinder.com 添加时间:2007-09-02 原文发表:2007-08-31 人气:98 来源:未知

本文章共2090字,分2页,当前第1页,快速翻页:
 

本课主题: 循环链表与双向链表

教学目的: 掌握循环链表的概念,掌握双向链表的的表示与实现

教学重点: 双向链表的表示与实现

教学难点: 双向链表的存储表示

逆风编程精品

授课内容:

一、复习线性链表的存储结构

二、循环链表的存储结构

循环链表是加一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点。

循环链表的操作和线性链表基本一致,差别仅在于算法中的循环条件不是p或p->next是否为空,而是它们是否等于头指针

三、双向链表的存储结构

提问:单向链表的缺点是什么?

提示:如何寻找结点的直接前趋。

双向链表可以克服单链表的单向性的缺点。

在双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前趋。

1、线性表的双向链表存储结构

typedef struct DulNode{

struct DulNode *prior;

ElemType data;

struct DulNode *next;

}DulNode,*DuLinkList;

对指向双向链表任一结点的指针d,有下面的关系:

d->next->priou=d->priou->next=d

即:当前结点后继的前趋是自身,当前结点前趋的后继也是自身。

2、双向链表的删除操作

Status ListDelete_DuL(DuLinkList &L,int i,ElemType &e){

if(!(p=GetElemP_DuL(L,i)))

return ERROR;

e=p->data;

p->prior->next=p->next;

p->next->prior=p->pror;

free(p);

return OK;

}//ListDelete_DuL

3、双向链表的插入操作

Status ListInsert_DuL(DuLinkList &L,int i,ElemType &e){

if(!(p=GetElemP_DuL(L,i)))

return ERROR;

if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) return ERROR;

s->data=e;

s->prior=p->prior;

p->prior->next=s;

s->next=p;

p->prior=s;

return OK;

}//ListInsert_DuL

四、一个完整的带头结点的线性边表类型定义:

typedef struct LNode{

ElemType data;

struct LNode *next;

}*Link,*Position;

typedef struct{

Link head,tail;

int len;

}LinkList;

Status MakeNode(Link &p,ElemType e);

//分配由p指向的值为e的结点,并返回OK;若分配失败,则返回ERROR

void FreeNode(Link &p);

//释放p所指结点

Status InitLinst(LinkList &L);

//构造一个空的线性链表L

Status DestroyLinst(LinkList &L);

//销毁线性链表L,L不再存在

Status ClearList(LinkList &L);

//将线性链表L重置为空表,并释放原链表的结点空间

Status InsFirst(Link h,Link s);

//已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前

Status DelFirst(Link h,Link &q);

//已知h指向线性链表的头结点,删除链表中的第一个结点并以q返回

Status Append(LinkList &L,Link s);

//将指针s所指(彼此以指针相链)的一串结点链接在线性链表L的最后一个结点

//之后,并改变链表L的尾指针指向新的尾结点

Status Remove(LinkList &L,Link &q);

//删除线性链表L中的尾结点并以q返回,改变链表L的尾指针指向新的尾结点

Status InsBefore(LinkList &L,Link &p,Link s);

//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之前,

//并修改指针p指向新插入的结点

Status InsAfter(LinkList &L,Link &p,Link s);

//已知p指向线性链表L中的一个结点,将s所指结点插入在p所指结点之后,

//并修改指针p指向新插入的结点

Status SetCurElem(Link &p,ElemType e);

//已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值

ElemType GetCurElem(Link p);
 

本文章更多内容1 - 2 - 下一页>>
相关文章

数据结构教程 第三课 算法及算法设计要求
数据结构教程 第三十五课 实验七 查找
数据结构教程 第十九课 实验四 串的实现实验
数据结构教程 第二十七课 实验六 二叉树实验
数据结构教程 第四课 算法效率的度量和存储
数据结构教程 第十三课 队列
数据结构教程 第二十九课 静态查找表(一)
C语言完成一个学生成绩管理程序
数据结构教程 第二十三课 二叉树的存储结构
数据结构教程 第十四课 串的定义

相关评论


本文章所属分类:首页 数据结构

  热门关键字: