链表的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
链表基础
创建单向链表
●
创建步骤:
(1)创建单向链表⏹定义结点的结构类型,说明表头指针⏹按照结构的大小分配一块内存区域首地址赋给
个头指针⏹将该区域的首地址赋给一个头指针⏹继续分配一块内存区域
将该区域的首地址分配给前一个结点的指针变量⏹将该区域的首地址分配给前个结点的指针变量⏹继续上述过程,直到
链表的尾。
链表基础
(2) 两个重要的库函数
动态存储分配函数(头文件:stdlib.h)
原型:void * malloc(int size)
功能:动态分配长度为size个字节的存储区。
功能动态分配长度为个字节的存储区
返回值:分配成功,返回所分配区域的首地址。
分配失败,返回0 。
分配失败返回0
注意:一般系统返回指向void型数据的指针,而应用时需要指向结构类型的指针,所以要用强制类型转换。
例如t t t d t*
例如:struct student * ps;
ps=(struct student *)malloc(sizeof(struct student));
链表基础
释放内存函数
原型:void free(void *p)
头文件:stdlib.h
头文件:stdlib h
功能:释放p所指向的内存空间
返回值:无
例如:free(ps);
ps是最近一次调用malloc函数时返回的值
链表基础
(3) 创建链表的过程
定义结点的结构,说明表头指针
例如:定义描述学生(姓名/住址/电话)的结点
d
struct node
{ char name[20],address[20],phone[15];
struct node * link; /*定义node型结构指针*/ }; /* 定义结构*/
typedef struct node NODE/* 定义结点类型*/ NODE*head;/*说明头指针head NODE * head ;/* 说明头指针head*/
链表基础
申请存储空间建立表头节点
将malloc的返回值强NODE * p;
p= ( NODE * ) malloc( sizeof (NODE) ) ;
/*开辟新存储区,申请表头节点*/
制转换为NODE型
/ 开辟新存储区,申请表头节点/ p->link = NULL;/* 将表头节点的link置为NULL*/ head = p;/* head指向表头节点p*/
head
p
P指向最后一个结点
NULL
表头节点
表头指针
(不含数据节点的空链表)
链表基础
加入第一个数据结点
NODE * p;
p
p= ( NODE * ) malloc( sizeof(NODE) ) ;
/* 申请新数据结点*/ gets(p>name);gets(p>address);gets(p>phone );
gets(p->name );gets(p->address);gets(p->phone );
/* 用访问结构的方法将数据读入p所指向的结点成员*/ p->link = NULL; /*将NULL存入p的link中*/
head->link = p; /* 将数据结点p 插在表头结点之后*/
p
head
NULL
name
NULL
表头指针表头节点数据节点
链表基础
从表头开始将数据节点插入链表中(插下一个数据节点)=(NODE *)malloc (sizeof (NODE));/*
p = ( NODE * ) malloc ( sizeof (NODE) ) ;/* 申请数据节点*/gets(p->name); gets(p->address);gets(p->phone );
/* 按照访问结构的方法,将数据存入p 所指向的节点*/li k h d li k p->link = head->link;
/* 将表头节点的link 存入p 的link 中*/
head->link = p;
/* 将数据结点p 插在表头结点之后*/p;p p
name2
head
数据节点
表头指针
表头节点
数据节点
name1NULL
x
链表基础
3、访问链表中全部数据节点
output ( NODE
* head )p (){ NODE * p;
p = head->link;/* p 指向第一个数据节点*/while (p!=NULL )while ( p!NULL ){puts ( p->name ) ; /* 输出p 所指向节点的数据*/
p = p->link ;/* p 指向下一个数据节点*/
head }
}
需要分析两种情况:
NULL
表头指针
表头节点head
表头指针表头节点数据节点
name1NULL
链表基础
4、在链表中插入新节点(基本原理)
q 个节点指针p
定位——指针q 指向第i 个节点,指针p 指向需要插入的节点
◆——p->link = q->link ;链接后面指针p q ;
◆
链接前面指针——q->link = p ;
q
x
head
D3
D2D1D0^表头节点
数据节点
数据节点
数据节点
数据节点
p