若线性表为空表,则头结点的指针域为空
p是指向线性表第i个元素的指针,p->data的值是一个数据元素,
单链表的读取
/* 初始条件:链式线性表L已存在,1≤i≤ListLength(L) */
/* 操作结果:用e返回L中第i个数据元素的值 */
Status GetElem(LinkList L,int i,ElemType *e)
{
int j;
LinkList p; /* 声明一结点p */
p = L->next; /* 让p指向链表L的第一个结点 */
j = 1; /* j为计数器 */
while (p && j<i) /* p不为空或者计数器j还没有等于i时,循环继续 */
{
p = p->next; /* 让p指向下一个结点 */
++j;
}
if ( !p || j>i )
return ERROR; /* 第i个元素不存在 */
*e = p->data; /* 取第i个元素的数据 */
return OK;
}
思路:声明头节点,定义指针指向头节点,将计数器定为1,当链表不为空且i<j时,继续循环
注:要考虑该节点不存在的情况
单链表的插入
将s插入到p和p->next之间
核心代码如下:
//插入s
s->next=p->next;
p->next=s;
两句话的顺序不可调整
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p = *L;
j = 1;
while (p && j < i) /* 寻找第i个结点 */
{
p = p->next;
++j;
}
if (!p || j > i)
return ERROR; /* 第i个元素不存在 */
s = (LinkList)malloc(sizeof(Node)); /* 生成新结点(C语言标准函数) */
s->data = e;
s->next = p->next; /* 将p的后继结点赋值给s的后继 */
p->next = s; /* 将s赋值给p的后继 */
return OK;
}
思路:声明头节点,初始化j=1,j<i,指针向后移动,若到链表末尾,指针为空,返回ERROR,找到,系统生成空节点,核心代码,OK
单链表的删除
核心代码
q = p->next;
p->next = q->next
代码如下:
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p = *L;
j = 1;
while (p->next && j < i) /* 遍历寻找第i个元素 */
{
p = p->next;
++j;
}
if (!(p->next) || j > i)
return ERROR; /* 第i个元素不存在 */
q = p->next;
p->next = q->next; /* 将q的后继赋值给p的后继 */
*e = q->data; /* 将q结点中的数据给e */
free(q); /* 让系统回收此结点,释放内存 */
return OK;
}
思路:声明指针指向头节点,j<i时,往后遍历,若到链表末为空,则不存在,找到-核心代码,将q节点的数据赋值给e,返回,释放q节点
单链表的创建
对于链表来说,所占用的空间大小和位置是不需要预先分配的,所以创建单链表的过程就是一个动态生成链表的过程
1)头插法:
void CreatFromHead(LinkList L, int n)
{
int i;
LNode *s;
for (i = 0; i < n; i++)
{
s = (LNode *)malloc(sizeof(LNode));
scanf("%d", &s->data);
s->next = L->next;
L->next = s;
}
}
2) 尾插法:
核心代码:
r->next = s;
r = s;
void CreatFromTail(LinkList L, int n)
{
int i;
LNode *r, *s;
r = L;
for (i = 0; i < n; i++)
{
s = (LNode *)malloc(sizeof(LNode));
scanf("%d", &s->data);
r->next = s;
r = s;
}
r->next = NULL;
}
单链表的整表删除
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next; /* p指向第一个结点 */
while(p) /* 没到表尾 */
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL; /* 头结点指针域为空 */
return OK;
}
除以上内容外,链表还有静态链表、循环链表和双向链表,在后续的博客中会慢慢更新