数据结构之链表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SCIE, University of Electronic Science and Technology of China
88
2.1.2单链表
初始化算法: elemtype initlist(node * * h) { *h=(node *)malloc(sizeof(node)); (*h)->next=null; }
a1
a2
ai-1
ai
an
new
p
node
p =list->header; counter = 1
while( counter < i -1 && p != NULL){
counter = counter + 1;
p = p->next;
}
找到ai-1
q = p->next;
法 一
}
p->next = new_node;
2、通过“地址”,找到链点 ,计数,如果计数到i,就结束
3、在链点中找到后继元素的“地址” 4、记录这个地址,回到2
p = list->head; counter = 1; while(1){
cpo-u>ntdearta++…; … ifp( -c>onuenxtet r…=…= i)
break;
2.1线性表
线性表不同的实现方式:
2.1.1顺序表 ➢ 顺序表定义 ➢ 顺序表基本操作:
遍历、插入、删除 ➢ 顺序表算法分析 2.1.2单链表 2.1.3双向链表 2.1.4循环链表
数组存储 链接存储
SCIE, University of Electronic Science and Technology of China
while( counter < i -1 && p != NULL){ counter = counter + 1; p = p->next;
}
new_node->next = p->next;
p->next = new_node;
list->length ++;
}
SCIE, University of Electronic Science and Technology of China
p = p->next;
}
SCIE, University of Electronic Science and Technology of China
12
2.1.2单链表
a1 next
a2
ai
ai+1
an
p
counter: 312
node_type *get_node( list, i ){
设i = 3
counter = counter + 1;
p = p->next;
}
new_node->next = p->next;
} p->next = new_node;
} list->length ++;
SCIE, University of Electronic Science and Technology of China
list.data[i]=no;list.length++;
}
no=30;
insert(list,no,5);
delete(list,8)
return 0;
}
SCIE, University of Electronic Science and Technology of China
2
2.1.2单链表
a4
4
2.1.2单链表
二、 链表的定义
链点
data
link
元素域
链接域
数据域(数据元素域):存放一个数据元素。 链接域(关系域):存放指向下一个元素的指针
——元素间的关系。
数据域 + 链接域 = 结点(链点)
SCIE, University of Electronic Science and Technology of China
}
return p;
SCIE, University of Electronic Science and Technology of China
13
2.1.2单链表
注意
1、p = p->next ; 沿链表前进
2、循环结束条件 counter = = i 或 node = = NULL
counter > list->length
elemtype data;
data next
struct node_type * next;
};
链点的定义
struct list_type{
node_type *head;
node_type *tail;
int length;
};
链表的定义
SCIE, University of Electronic Science and Technology of China
思考 如果希望获得值为x的元素,如何实现? while( p->data == x && p != NULL)
SCIE, University of Electronic Science and Technology of China
14
2.1.2单链表
链表插入操作
问题描述:
➢在元素ai前插入新的元素new_node ;
}
SCIE, University of Electronic Science and Technology of China
19
2.1.2单链表
void insertl(list, new_node , location){
counter = 1; p = list->head; 初始化
边界情况: 表首插入 表尾插入
一、链表的引入
数组结构的缺点: 1、在插入、删除时要移动大量的节点 2、表的大小固定。 预先在申明数组时指定,无法更改
原因: 存放的连续性
突破 离散存放 用指针来表示元素之间的关系。
SCIE, University of Electronic Science and Technology of China
1
2.1线性表
#include "stdio.h“ struct list_seq {
int data[20]; int length; }; int main(){
struct list_seq list; int no, i;
list.length=0;
for(i=0;i<10;i++){
scanf("%d",&no); if(no==0) break;
ai-1->next = anew ;
anew->next = ai ;
... ai-1
anew
ai
tail
... an
SCIE, University of Electronic Science and Technology of China
tail
16
2.1.2单链表
void insertl(list, new_node , location){
p = list->head;
while( ){
p->data …… p->next ……
p = p->next;
}
SCIE, University of Electronic Science and Technology of China
11
2.1.2单链表
继续完善描述
1、先找到链表首结点的地址
ai-1->next = anew ;
new_node->next =
??q?;
anew->next = ai ;
SCIE, University of Electronic Science and Technology of China
18
2.1.2单链表
void insertl(list, new_node , location){
int counter ; node_type * p;
思考
p = list->head; counter = 1;
当iwenku.baidu.comn时算法结果怎样?
while(counter < i && p != NULL){
counter = counter +1;
p = p -> next; }
逐个“数”的动作
if( p = = NULL) return NULL;
3
2.1.2单链表
用链表实现线性表(非连续存储)
线性表元素:a1、a2、a3、a4....
链表链点
线性关系: a1 a2
a3
a4
指针域,指针关系 顺序存储
链式存储
a1 a2 a3 a4
a1 a2
a3
SCIE, University of Electronic Science and Technology of China
20
2.1.2单链表
list->head
a1
ai-1
ai
an
new
new_node->next = ali1st;->head;
node list->head = new_node;
SCIE, University of Electronic Science and Technology of China
21
2.1.2单链表
void insertl(list, new_node , location){
if(location == 1){
边界情况:
new_node = list->head;
表首插入
list->head = new_node; }
表尾插入
else{ counter = 1;
p = list->head; 初始化 while( counter < i -1 && p != NULL){
5
2.1.2单链表
链表
a1
head
a2
……
length
由链点及链点相互间的链接构成
链表头 链表尾
链表长度(节点数目)
SCIE, University of Electronic Science and Technology of China
an ^
tail
6
2.1.2单链表
定义
struct node_type{
a1
a2 ……
an
head
temp
temp temp
SCIE, University of Electronic Science and Technology of China
tail
10
2.1.2单链表 从自然语言到算法语言
如何描述我们找到第i个节点的动作。
1、先找到链表首结点的地址 2、通过“地址”,找到链点 3、在链点中找到后继元素的“地址” 4、记录这个地址
7
2.1.2单链表
带头节点的单链表
a1
……
an ^
head
带头节点链表的引入是为了使算法对空表和非空表的处理一致
普通单链表对链表尾的判断 (假定p是链表尾的指针) 空表: p==null; 非空表:p->next==null;
带头节点单链表对链表尾的判断 空表: p->next==null; 非空表:p->next==null;
问题分析:
➢输入:链表,location,x ➢输出:插入新元素后的链表。
算法实现分析
SCIE, University of Electronic Science and Technology of China
15
2.1.2单链表
anew
a1 ... ai-1
ai
... an
head
a1
head
两个步骤:
22
2.1.2单链表
list->head
a1
ai-1
ai
表尾插入
an
NULL
当i > 链表长度 时
p
while( counter < i -1 && pp-!>=nNexUtL!=L)N{ ULL){
counter = counter + 1; p = p->next; }
注意当循环执行到表尾时 p 的值为NULL(空) p->next是悬空的值
三、链表的基本操作 访问 插入 删除
SCIE, University of Electronic Science and Technology of China
9
2.1.2单链表
访问操作
问题描述:访问链表的第i个节点 问题分析:
➢输入:链表,i ➢输出:链点——指向链点的指针
算法实现分析:
只能从链表头开始,一个一个“数”下去,直到第i个。
找到ai-1 执行插入动作
两个步骤: ai-1->next = anew ; anew->next = ai ;
}
SCIE, University of Electronic Science and Technology of China
17
2.1.2单链表
void insertl(list, new_node , location){ q
a1
a2
ai-1
ai
an
new
p
node
p =list->header; counter = 1
while( counter < i -1 && p != NULL){ counter = counter + 1; p = p->next;
}
法 new_node->next = p->next;
二 p->next = new_node;