线性结构-单链表
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//读入下一个元素 pread ( x ) ; } //链表结束标志 temp->next=NULL ; }
顺序表与单向链表的比较
存储
元素访问 插入、删除
顺序表
单向链表
连续的存储空间 存储空间可以不 连续,用指针连 接
随机访问O(1) 顺序访问O(n)
O(n) 移动元素 O(n) 寻找插入 位置
作业:单链表的建立
}
}if(p->next == NULL) {
s = p->next; p->next = s->next;
}
free(s); }
综合练习 单向链表的建立
操作描述: 建立一个数据元素为正整数的 单链表。
单链表的数据元素由键盘输入, 以-1为结束标志。 新输入元素是链表的最后一个 节点。
head
NULL
C语言描述
算法
void deletesl(node * h, int i) {
node * p, * s;
int j;
p = h; j = 0;
for( j=0; j<i-1; j++){
p = p->next;
if(p==NULL) {
return;
printf(“ i is invalid”);
}
return;
删除结点
操作描述: 删除单链表的第i个元素。
算法分析: 由于删除第i个元素,所以必须 先找到第i-1个元素,然后打开 两者间的链,使第i-1个元素的 指针指向i+1个元素,并释放 元素ai的空间。
head
Baidu Nhomakorabeaa1
…… ai-1
ai
ai+1
…… an
三个步骤:
1、找到要删除的节点的前一个节点ai-1; 2、令ai-1->next=ai->next , 即使ai-1的指 针指向ai+1 ; 3、释放元素ai所占用的空间;
a1 NULL
a2 NULL
…
从前向后插入元素,每次插入的元素都是链表 的最后一个节点。 三个步骤:
1、初始化链表,建立一个带头节点的空链表。
2、插入第一个元素a1,并使头节点指向a1
3、插入下一个元素,并使上次插入的元素的指针指向该元 素;
void create_list ( node ** h ) {
算法分析: 由于链表的存储与逻辑无关性。 要访问第i个元素,只能从第一 个元素开始遍历,直到找到第i 个元素为止。
C语言描述
算法:
elemtype access(node *h, int i){ node * p; int j; p=h; j=0; for( j=0; j<i; j++){ p=p->next; if(p==NULL) return NULL; } return p->data;
从前向后插入元素,每次插入的元素都是 链表的第一个节点。
}
插入结点
操作描述: 在第i个元素后插入新元素anew, 构成一个新链表。
算法分析: 由于是在第i个元素后插入,所 以必须先找到第i个元素,然后 打开第i个元素和第i+1个元素 两者间的链,插入新元素anew 后,重新建立链接关系。
head
a1
…… ai
anew
ai +1
…… an
三个步骤:
申请一个新 的节点空间 存放anew
❖ 整型节点:
struct node {
int data; struct node* next; }
a1
a2
链表头指针
an-1
an
头结点的需要性
头结点
a1
a2
存放线性表的表长等数据信息 空表和非空表的处理相统一
an
单链表的基本操作
空单链表的建立(初始化) 单链表的访问 插入结点 删除结点
空单链表的建立
h
C语言描述
为什么双指针
void initiatesl(node ** h) {
*h= (node *)malloc(sizeof(node));
(*h)->next = NULL;
}
int main() {
……
node * h;
……
initiatesl(&h);
……
}
值传递
单链表的访问
操作描述: 访问第i个元素。即返回第i个节 点的数据值。
anew->next = ai+1
ai->next = anew
C语言描述
算法:
void insertsl(node * h, int i){ node * p, * t; int j; p = h; j = 0; for( j=0; j<i; j++){ p = p->next; if(p==NULL) { printf(“ i is invalid”); } } t = (node *) malloc(sizeof(node)); t->data = x; t->next = p->next; p->next = t;
node *temp , *temp_1 ; elemtype x ;
//初始化链表 *h=(node *) mallcoc(sizeof(node)); (*h)->next=NULL; temp=(*h);
//读入第一个数据x,,在x合法(不为-1)时执行插入过程 pread ( x ) ; while ( x!=-1 ) {
//为新元素分配空间, //并使指针temp_1指向新元素的存储空间 temp_1=(node*) mallcoc(sizeof(node)); temp_1->data=x ;
//将新元素插入链表 temp->next=temp_1;
//指针temp始终指向最后一个节点 temp=temp_1 ;
线性结构-单链表
线性链表的引出
顺序表的不足
空间上:需要分配大块连续的内存空间,且需 要预先 给定数据元素的最大个数 时间上:插入、删除操作需要移动大量数据
单链表
节点定义
data
next
❖ C语言描述:
struct node {
Elemtype data; struct node* next; }
顺序表与单向链表的比较
存储
元素访问 插入、删除
顺序表
单向链表
连续的存储空间 存储空间可以不 连续,用指针连 接
随机访问O(1) 顺序访问O(n)
O(n) 移动元素 O(n) 寻找插入 位置
作业:单链表的建立
}
}if(p->next == NULL) {
s = p->next; p->next = s->next;
}
free(s); }
综合练习 单向链表的建立
操作描述: 建立一个数据元素为正整数的 单链表。
单链表的数据元素由键盘输入, 以-1为结束标志。 新输入元素是链表的最后一个 节点。
head
NULL
C语言描述
算法
void deletesl(node * h, int i) {
node * p, * s;
int j;
p = h; j = 0;
for( j=0; j<i-1; j++){
p = p->next;
if(p==NULL) {
return;
printf(“ i is invalid”);
}
return;
删除结点
操作描述: 删除单链表的第i个元素。
算法分析: 由于删除第i个元素,所以必须 先找到第i-1个元素,然后打开 两者间的链,使第i-1个元素的 指针指向i+1个元素,并释放 元素ai的空间。
head
Baidu Nhomakorabeaa1
…… ai-1
ai
ai+1
…… an
三个步骤:
1、找到要删除的节点的前一个节点ai-1; 2、令ai-1->next=ai->next , 即使ai-1的指 针指向ai+1 ; 3、释放元素ai所占用的空间;
a1 NULL
a2 NULL
…
从前向后插入元素,每次插入的元素都是链表 的最后一个节点。 三个步骤:
1、初始化链表,建立一个带头节点的空链表。
2、插入第一个元素a1,并使头节点指向a1
3、插入下一个元素,并使上次插入的元素的指针指向该元 素;
void create_list ( node ** h ) {
算法分析: 由于链表的存储与逻辑无关性。 要访问第i个元素,只能从第一 个元素开始遍历,直到找到第i 个元素为止。
C语言描述
算法:
elemtype access(node *h, int i){ node * p; int j; p=h; j=0; for( j=0; j<i; j++){ p=p->next; if(p==NULL) return NULL; } return p->data;
从前向后插入元素,每次插入的元素都是 链表的第一个节点。
}
插入结点
操作描述: 在第i个元素后插入新元素anew, 构成一个新链表。
算法分析: 由于是在第i个元素后插入,所 以必须先找到第i个元素,然后 打开第i个元素和第i+1个元素 两者间的链,插入新元素anew 后,重新建立链接关系。
head
a1
…… ai
anew
ai +1
…… an
三个步骤:
申请一个新 的节点空间 存放anew
❖ 整型节点:
struct node {
int data; struct node* next; }
a1
a2
链表头指针
an-1
an
头结点的需要性
头结点
a1
a2
存放线性表的表长等数据信息 空表和非空表的处理相统一
an
单链表的基本操作
空单链表的建立(初始化) 单链表的访问 插入结点 删除结点
空单链表的建立
h
C语言描述
为什么双指针
void initiatesl(node ** h) {
*h= (node *)malloc(sizeof(node));
(*h)->next = NULL;
}
int main() {
……
node * h;
……
initiatesl(&h);
……
}
值传递
单链表的访问
操作描述: 访问第i个元素。即返回第i个节 点的数据值。
anew->next = ai+1
ai->next = anew
C语言描述
算法:
void insertsl(node * h, int i){ node * p, * t; int j; p = h; j = 0; for( j=0; j<i; j++){ p = p->next; if(p==NULL) { printf(“ i is invalid”); } } t = (node *) malloc(sizeof(node)); t->data = x; t->next = p->next; p->next = t;
node *temp , *temp_1 ; elemtype x ;
//初始化链表 *h=(node *) mallcoc(sizeof(node)); (*h)->next=NULL; temp=(*h);
//读入第一个数据x,,在x合法(不为-1)时执行插入过程 pread ( x ) ; while ( x!=-1 ) {
//为新元素分配空间, //并使指针temp_1指向新元素的存储空间 temp_1=(node*) mallcoc(sizeof(node)); temp_1->data=x ;
//将新元素插入链表 temp->next=temp_1;
//指针temp始终指向最后一个节点 temp=temp_1 ;
线性结构-单链表
线性链表的引出
顺序表的不足
空间上:需要分配大块连续的内存空间,且需 要预先 给定数据元素的最大个数 时间上:插入、删除操作需要移动大量数据
单链表
节点定义
data
next
❖ C语言描述:
struct node {
Elemtype data; struct node* next; }