c语⾔链表中next作⽤,C语⾔链表详解
本⽂摘⾃wikipedia。本⽂内容是关于:C语⾔ 链表详解,c语⾔链表教程。 链表(Linked list)是⼀种常见的基础数据结构,是⼀种线性表,但是并不会按线性的顺序存储数据,⽽是在每⼀个节点⾥存到下⼀个节点的指针(Pointer)。 单链表(单向链表)是链表的⼀种,其特点是链表的链接⽅向是单向的,对链表的访问要通过顺序读取从头部开始,如下图所⽰。
本⽂将结合代码详解C语⾔链表,单向链表的数据结构可以分为两部分:数据域和指针域,数据域存储数据,指针域指向下⼀个储存节点的地址,C语⾔详细代码及注释如下。
/*线性表的单链表存储结构*/
typedef struct LNode {
ElemType data;
struct LNode * next;
}
LNode,
*LinkList;
/*带有头结点的单链表的基本操作(12个)*/
void InitList(LinkList * L) {
/* 操作结果:构造⼀个空的线性表L */
* L = (LinkList) malloc(sizeof(struct LNode));
/* 产⽣头结点,并使L指向此头结点 */
if (!*L)
/* 存储分配失败 */
exit(OVERFLOW); ( * L) - >next = NULL;
/* 指针域为空 */
}
void DestroyList(LinkList * L) {
/* 初始件:线性表L已存在。操作结果:销毁线性表L */
LinkList q;
while ( * L) {
q = ( * L) - >next;
free( * L); * L = q;
void ClearList(LinkList L)
/* 不改变L */
{
/* 初始条件:线性表L已存在。操作结果:将L重置为空表 */
LinkList p,
q;
p = L - >next;
/* p指向第⼀个结点 */
while (p)
/* 没到表尾 */
{
q = p - >next;
free(p);
p = q;
}
L - >next = NULL;
/* 头结点指针域为空 */
}
Status ListEmpty(LinkList L) {
/* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */ return L - >next == NULL;
}
int ListLength(LinkList L) {
/* 初始条件:线性表L已存在。操作结果:返回L中数据元素个数 */
int i = 0;
LinkList p = L - >next;
/* p指向第⼀个结点 */
while (p)
/* 没到表尾 */
{
i++;
p = p - >next;
}
Status GetElem(LinkList L, int i, ElemType * e)
/* 算法2.8 */
{
/
* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */ int j = 1;
/* j为计数器 */
LinkList p = L - >next;
/* p指向第⼀个结点 */
while (p && j < i)
/* 顺指针向后查,直到p指向第i个元素或p为空 */
{
p = p - >next;
j++;
c语言listinsert函数}
if (!p || j > i)
/* 第i个元素不存在 */
return ERROR; * e = p - >data;
/* 取第i个元素 */
return OK;
}
int LocateElem(LinkList L, ElemType e, Status( * compare)(ElemType, ElemType)) {
/* 初始条件: 线性表L已存在,compare()是数据元素判定函数(满⾜为1,否则为0) */
/* 操作结果: 返回L中第1个与e满⾜关系compare()的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int i = 0;
LinkList p = L - >next;
while (p) {
i++;
if (compare(p - >data, e))
/* 到这样的数据元素 */
return i;
return 0;
}
Status PriorElem(LinkList L, ElemType cur_e, ElemType * pre_e) {
/* 初始条件: 线性表L已存在 */
/* 操作结果: 若cur_e是L的数据元素,且不是第⼀个,则⽤pre_e返回它的前驱, */
/* 返回OK;否则操作失败,pre_e⽆定义,返回INFEASIBLE */
LinkList q,
p = L - >next;
/* p指向第⼀个结点 */
while (p - >next)
/* p所指结点有后继 */
{
q = p - >next;
/* q为p的后继 */
if (q - >data == cur_e) { * pre_e = p - >data;
return OK;
}
p = q;
/* p向后移 */
}
return INFEASIBLE;
}
Status NextElem(LinkList L, ElemType cur_e, ElemType * next_e) {
/* 初始条件:线性表L已存在 */
/* 操作结果:若cur_e是L的数据元素,且不是最后⼀个,则⽤next_e返回它的后继, */ /* 返回OK;否则操作失败,next_e⽆定义,返回INFEASIBLE */
LinkList p = L - >next;
/* p指向第⼀个结点 */
while (p - >next)
/* p所指结点有后继 */
{
if (p - >data == cur_e) { * next_e = p - >next - >data;
p = p - >next;
}
return INFEASIBLE;
}
Status ListInsert(LinkList L, int i, ElemType e)
/* 算法2.9。不改变L */
{
/* 在带头结点的单链线性表L中第i个位置之前插⼊元素e */
int j = 0;
LinkList p = L,
s;
while (p && j < i - 1)
/* 寻第i-1个结点 */
{
p = p - >next;
j++;
}
if (!p || j > i - 1)
/* i⼩于1或者⼤于表长 */
return ERROR;
s = (LinkList) malloc(sizeof(struct LNode));
/* ⽣成新结点 */
s - >data = e;
/* 插⼊L中 */
s - >next = p - >next;
p - >next = s;
return OK;
}
Status ListDelete(LinkList L, int i, ElemType * e)
/* 算法2.10。不改变L */
{
/* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论