数据结构之线性表(1-3)——单链表(不带头节点)的基本操作

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;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值