数据结构与算法-合肥工大(4)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

p↑.next:=s; ]
End;
华电计算机系
void Insert (Pointer &head, int i, ElemType x )在单链表的第i 个结点之前插入值等于x的结点。(C语言实现)
x=‘F’ i=3
p
Head
A
B
C
② F

S
void Insert (Pointer &head, int i, ElemType x )
华电计算机系
4)Locate_Link (Head,x):在单链表中查找值等于x的结点,返 回指向该结点的指针。(Pascal实现)
x=‘C’ Head
A
B
C
D^
p
Function Locate_Link(Head;x:ElemType):Link_list; Begin
p:=Head; while (p↑.Next< >Nil) and (p↑.data< > x) Do p:=p↑.Next; if p↑.data=x then Return(p) else Return(Nil); End;
{ head = new Node; if (!head) exit(1); // 存储空间分配失败 head->next = NULL;华电计算机系
}
2)Length_Link (Head):返回单链表中所含表结点的个数。Pascal实现
Function Length_Link(Head:Link_list):Integer; Begin
p↑.next:=Nil; End;
Procedure Create_Link_3(Var Head:Link_list); Begin
p:=Nil;Read(x);
while (x< > ‘*’ ) Do [ new(q);q↑.data:=x;q↑.next:=p;p:=q;Read(x);]
new(Head); Head↑.next:=p; End;
对不带头结点的单链表要修改头指针)。
华电计算机系
二、单链表基本运算的实现
单链表的类型定义如下 (Pascal语言)
Type Pointer=↑ Node; Node=Record data:ElemType; next:Pointer; End;
单链表的类型定义如下(C语言) typedef struct Node { ElemType data; struct Node *next; } *Pointer;
}
D^
华电计算机系
6)Delete_Link (Head,i):删除单链表的第i个结点。 (Pascal实现)
i=3 Head
p
A
B
C
D^
Procedure Delete_Link(Var Head;i:Integer); Begin
p:=Find_Link(Head,i-1); if (p< >Nil) and (p↑.next< >Nil)
单链表中设置头结点的好处:
1)其头指针是指向头结点的非空指针,无论链表是否为空,头
指针始终保持值不变,因此头指针的处理方法对空表和非空表
的操作是一致的,这与不带头结点的单链表为空时头指针为空
不同。
2)首元结点的地址存放在头结点的指针域中,对该结点的操作
与其它结点的操作一致,无需进行特殊处理(如删除首元结点时,
[s:=p; p:=p↑.next; s↑.next:=h;h:=s;] head↑.next:=h; End;
华电计算机系
单链表的应用示例:
例1.将一个单链表逆置。 C语言实现
void Invert_Link_1(Link_list &Head) {不带头结点}
Link_list=Pointer; 1)Init_Link(Head):初始化一个单链表
Procedure Init_Link(Var Head:Link_list); Begin
new(Head); Head↑.Next:=Nil; End;
void Initial( Pointer &head)
华电计算机系
Head
A
G F
North China Electric Power University
B C
D E
H^
可以采用上面的存储结构,每一个数据元素占用 两个存储单元,其中一个用来存放数据元素的值, 另外一个存放下一个数据元素存储单元的地址,这 种结构称为链式存储结构。在这种结构中,数据元 素存放是不连续的。
if i=j then Return(p) else Return(Nil); End;
返回指向线性表第i个结点的指针。(C语言实现)
Pointer Find(Pointer head, int i) { p = head; j =0;
while ((p->next)&& (j< i) ) { p = p->next; j++;} if (i==j) return(p); Else return(NULL); } // Find
华电计算机系
North China Electric Power University
线性表的链式存储结构的优缺点:
优点
1)存储空间动态分配,可以按需要使用; 2)插入/删除结点操作时,只需要修改指针,不必移动数据 元素
缺点 1)每个结点需要添加指针域,存储密度降低; 2)非随机存储结构,查找定位操作需要从头指针出发顺链 表扫描。
华电计算机系
3)返回指向线性表第i个结点的指针。(Pascal实现)
Function Find_Link(Head:Link_list;i:Integer):Link_list; Begin
p:=Head;j:=0; while (p↑.Next< >Nil) and (j<i) Do [ p:=p↑.Next; j:=j+1;]
头指针 头结点 首元结点
Head
A
B
C
D
表结点
^H
G
F
E
华电计算机系
链表基本概念
North China Electric Power University
头结点:单链表的第一个结点之前附设的一个结点,它的 数据域不存放信息、或存放如线性的长度等附加信息。
首元结点:单链表中存放第一个元素的结点。
表结点:存放线性表中数据元素的结点。
End;
华电计算机系
7)Create_Link (Head):建立一个单链表。C语言实现
void CreateList (Pointer &head)
{ head = new Node; //生成头结点
p=head;
//尾指针指向头结点
getchar(x);
while (x!=’*’) { q = new Node; if (!q) exit(1); // 存储空间分配失败 q->data=x; p->next=q; p=q; getchar(x); } p->next=NULL;
{
// 在表head的第i个结点之前插入一个以x为值的新结点
p=Find(head,i-1);
if(!p) error(“without”);
Else
{ s=new Node; if (!s) exit(1); // 存储空间分配失败 s->data=x; // 创建新元素的结点
s->next=p-> next; p->next=s; // 修改指针}
p=p->next; j++; }
if (p->data==x) return(j);
else return(0); }
华电计算机系
5)Insert_Link (Head,x,i):在单链表的第i个结点之前插入值 等于x的结点。 (Pascal实现)
x=‘F’ i=3 Head
p
A
B
C
D^
② SF
华电计算机系
int Locate(Pointer head, ElemType x):在单链表中查找值等 于x的结点,返回该结点的序号。(C语言实现)
int Locate(Pointer head, ElemType x) { p=head;j=0;
while ((p->next)&&(p->data!=x)) {
then [ q:=p↑.next; p↑.next:=q ↑.next; dispose(q);
] else Error(‘Without’);
End;
华电计算机系
Delete ( Pointer &head, int pos, ElemType &x): 删除单链表的第i个结点。(C实现)
i=3
p:=Head;j:=0; while p↑.Next< >Nil Do [ p:=p↑.Next; j:=j+1;] Return(j); End;
Length(Pointer &head) :返回单链表中所含表结点的个数。C实现
int Length(Pointer &head) {
p=Head;j=0; while (p->next!=NULL)//继续点数 {p=p->next; j++;} return(j);//回传表长 }
p
Head
A
B
C
void Delete ( Pointer &head, int pos, ElemType &x) {
p=Find(head,i-1); //p指向第i-1个结点 if ((p!=NULL)&&(p->next!=NULL))
{ q = p->next; p->next = q->next; // 修改指针 x = q->data; delete(q); } // 释放结点空间
第三章 链表
华电计算机系
North China Electric Power University
3.1 线性链表 3.2 链栈、链队 3.3 循环链表 3.4 多重链表
华电计算机系
3.1线性链表
假定上图为当前内存的使用情况,阴影部分为已用内存, 现有一线性表L=(A,B,C,D,E,F,G,H),假若采用顺序存储 的话,则在当前内存中不能分配一块长度为8的连续的存 储空间。但实际上,系统的可用内存远大于该线性表所 要求的内存空间,应采用其它的存储结构—链式存储。
}
华电计算机系
North China Electric Power University
Procedure Create_Link_2(Var Head:Link_list); Begin
Init_Link(Head); p:=Head;Read(x); while (x< > ‘*’ ) Do [ new(q);q↑.data:=x;p↑.next:=q;p:=q;Read(x);]
else Error(‘Without’);
}
D^
华电计算机系
7)Create_Link (Head):建立一个单链表。
Procedure Create_Link_1(Var Head:Link_list); Begin
Init_Link(Head); Read(x);i:=1;
while (x< > ‘*’ ) Do [ Insert_Link(head,x,i); i:=i+1; Read(x); ]

Procedure Insert_Link(Var Head;x:ElemType;i:Integer); Begin
p:=Find_Link(Head,i-1);
if p=Nil then Error(‘Without’)
else [ new(s);s↑.data:=x;s↑.next:=p↑.next;
华电计算机系
单链表的应用示例:
例1.将一个单链表逆置。 pascal实现
Procedure Invert_Link_1(Var Head:Link_list); {不带头结点} Begin p:=Head;Head:=Nil; while (p < > Nil) Do
[ s:=p; p:=p↑.next;s↑.next:=Head;Head:=s;] End; Procedure Invert_Link_2(Var Head:Link_list); {带头结点} Begin p:=Head↑.next;h:=Nil; while (p < > Nil) Do
华电计算机线性表中的数据元素,为表示 元素间的逻辑关系,除了存储元素本身的信息外,还需存储 一个指示其直接后继元素存储位置的信息,这两部分信息组 成一个元素的存储映像,称为结点。
链表结点 数据域 指针域
链表:以“结点的序列”表示的线性表。
头指针:指向链表中第一个结点的指针。
相关文档
最新文档