单链表在应用中经常用到增加新结点、删除结点、修改结点、查找结点等操作,本文针对上述基本操作做了简单汇总,并给出了详细的算法。
一、在单链表中增加结点
在链表中增加新结点是经常要用到的操作,增加新结点大致可以分为在链表末尾增加、在链表头增加、在中间某个位置增加等三种情形。增加新结点也称为插入新结点。链表结点的接头体如下:
typedef struct Lnode
{
int data; //数据域
struct Lnode *next; //指针域
}LNode;
1.在链表尾插入新结点
假设有单链表如下:
增加元素为3的新结点,得到如下新链表:
算法流程:
1)生成新结点s存储元素3
2)让p指向表头h
3)让p依次后移到链表尾
4)将s链接到p之后
算法:
s = ( LNode* )malloc( sizeof( LNode ) );
s->data = 3;
s->next = NULL;
p = h;
while( p->next != NULL )
{
p = p->next;
p->next = s;
}
2.在链表头插入新结点
在表头插入新结点比较简单,生成新结点之后挂在表头之后即可。
算法为:
s = ( LNode* )malloc( sizeof( LNode ) );
s->data = 3;
s->next = h->next; //此部关键,先把s和结点1链接上。
h->next = s;
3.在链表中间某个位置插入新结点
已有链表如下:
想在元素为4的结点之前插入新结点s,插入过程为:
1)生成新结点s;
2)引入两个临时指针p和q,p通过遍历指向4的结点,q作为p的直接前驱
3)把新结点s插入到q和p之间
算法实现(只考虑了插值成功未考虑失败):
key = 4;
s = ( LNode* )malloc( sizeof( LNode ) );
s->data = 3;
q = h;
p = q->next;
while( p->data != key )
{
q = p;
p = p->next;
}
q->next = s;
s->next = p;
二、在单链表中删除结点
1.删除一个结点
删除元素为3的结点,其算法如下:
key = 3;
q = h;
p = q->next;
while( p != NULL && p->data != key )//当p结点的值不是key,则q和p平行后移,
{
q = p; //q先指向p,之后p再后移
p = p->next;
}
if( p == NULL )
输出链表中无目标结点
else
q->next = p->next;
free( p );
2.删除与某个元素相同的全部结点
删除链表中元素为3的全部结点,则算法为:
key = 3;
q = head;
p = head->next;
//定位
while( p != NULL)
{
if( p->data == key )
{
q->next = p->next;
free(p);
p = q->next;
}
else
{
q