1.单链表的插入
头插中间插尾插 2.单链表的删除链表长度计算链表查找数值带头节点的单链表
头插尾插
1.单链表的插入
头插
中间插
尾插
2.单链表的删除
bool Remove(LinkList
& first, int i, dataType
& x)
{
LinkNode
*p,
*q;
int k;
if (i
== 0)
return false;
if (i
== 1)
{
q
= first;
first
= first
->link;
}
else
{
p
= first; int k
= 1;
while (p
!= NULL && k
< i
- 1)
{
p
= p
->link; k
++;
}
if (p
== NULL || p
->link == NULL)
{
printf(“无效的删除位置
!\n”);
return false;
}
else
{
q
= p
->link;
p
->link = q
->link;
}
x
= q
->data;
free(q);
return true;
}
}
链表长度计算
int Length(LinkList first)
{
LinkNode *p = first->link;
int count =
0;
while (p != NULL)
{
p = p->link;
count++;
}
return count;
}
链表查找数值
LinkNode
*Search ( LinkList first, DataType x )
{
LinkNode
* p
= first
->link;
while ( p
!= NULL && p
->data != x )
p
= p
->link;
return p;
}
while ( p != NULL && p->data != x ) 这个条件不能写成while(p->data != x && p != NULL) 因为前面为假 && 就不再判断后面了,见《c陷阱和缺陷》
带头节点的单链表
头结点位于表的最前端,本身不带数据,仅标志表头。
目的: 1.统一空表与非空表的操作 2.简化链表操作的实现。
头插
void insertFront(LinkList
& first, DataType endTag)
{
DataType val; LinkNode
*s;
scanf(“
%d”,
&val);
while (val
!= endTag)
{
s
= (LinkNode
*)malloc(sizeof(LinkNode));
s
->data = val;
s
->link = first
->link;
first
->link = s;
scanf(“
%d”,
&val);
}
}
尾插
void insertRear(LinkList
& first, DataType endTag)
{
DataType val;
LinkNode
*s,
*rear
= first;
scanf(“
%d”,
&val);
while (val
!= endTag)
{
s
= (LinkNode
*)malloc(sizeof(LinkNode));
s
->data = val;
rear
->link = s; rear
= s;
scanf(“
%d”,
&val);
}
rear
->link = NULL;
}