欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构之线性表(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;
}
相关标签: 数据结构 ACM