数据结构之线性表(1-3)——单链表(不带头节点)的基本操作
程序员文章站
2024-03-21 14:36:52
...
1 结构定义
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
2 函数接口
Position Find( List L, ElementType X );
List Insert( List L, ElementType X, Position P );
List Delete( List L, Position P );
各个操作函数的定义为:
Position Find( List L, ElementType X ):返回线性表中首次出现X的位置。若找不到则返回ERROR;
List Insert( List L, ElementType X, Position P ):将X插入在位置P指向的结点之前,返回链表的表头。如果参数P指向非法位置,则打印“Wrong Position for Insertion”,返回ERROR;
List Delete( List L, Position P ):将位置P的元素删除并返回链表的表头。若参数P指向非法位置,则打印“Wrong Position for Deletion”并返回ERROR。
3 分析
操作的单链表是不带头节点的,也就是说第一个节点是含有元素信息的。
在插入节点时,是在给定的节点前插入。插入节点的位置范围是[0,length](插入节点前链表的位置);
删除节点时,删除的节点的位置范围[0,length]
为什么在插入和删除节点时,要区分是否是第一个节点?
——插入节点,实际上是在给定节点的前驱节点后插入节点,而这个前驱节点在第一个节点之前是不存在的。所以需要区分。
——删除节点与插入节点原因相同。
4 代码
Position Find( List L, ElementType X )
{// 对
List p=L;
while(p!=NULL)
{
if(X == p->Data)
{
return p;
}
p=p->Next;
}
return ERROR;
}
List Insert( List L, ElementType X, Position P )
{
List s=(List)malloc(sizeof(List));
s->Data=X;
s->Next=NULL;
//在第一个节点前插入
if(P == L)
{
s->Next=L;
return s;
}
//在其他节点前插入,q s P
// P是给定节点,
//s是待插入节点,
//q是插入节点之前的给定节点的前驱节点
List q=L;
while(q != NULL )//在p的前面插入节点
{//保证前驱结点不为NULL
if(q->Next != P)
q=q->Next;
else//(q->Next == P)
{
s->Next=q->Next;
q->Next=s;
return L;
}
}
printf("Wrong Position for Insertion\n");
return ERROR;
}
List Delete( List L, Position P )
{
if(P == L)
{
L=L->Next;
return L;
}
List q=L,tmp;
while(q !=NULL)
{
//要删除节点的前驱节点
if(q->Next != P)
q=q->Next;
else
{
//要删除的节点
tmp=q->Next;
//更新前驱节点的后继节点
q->Next=q->Next->Next;
//释放删除节点的空间
free(tmp);
tmp=NULL;
return L;
}
}
printf("Wrong Position for Deletion\n");
return ERROR;
}
上一篇: 【数据结构】(单链表)递归删除值为 x的节点(不带头节点)
下一篇: Mysql查询数据库表大小