单链表的实现

首先,需要定义一个链表的结构体

1 struct Node
2 {
3     ElementType Element;
4     Position Next;
5 };
View Code

然后,你可能还需要这样定义几个别名,方便后面使用。

typedef struct Node *PtrToNode;
typedef int ElementType;//这样是为了结点结构体更通用,只需改变这里的int,就可以将结点元素改成其他数据类型。
typedef PtrToNode List;
typedef PtrToNode Position;
View Code

常用的链表操作:

int IsEmpty( List L )
{
    return L->Next == NULL ;//因为L是头结点,如果头结点的next指向空,说明没有结点。
}

/*判断当前节点是否是最后一个结点*/
int IsLast( Position P, List L)
{
    return P->Next == NULL;//假设这个元素是存在的,如果没有指向下一个结点,那么它就是最后一个
}

/*在链表中找出元素位X的结点*/
Position Find( ElementType X, List L )
{
    Position P;
    P = L->Next;
    while(P != NULL && P->Element != X)
        P = P->Next;
    return P;//当返回P时有两种情况,一是找到了,返回此结点,二是当检查到结尾也没找到时,返回NULL。
}

/*找到元素为X的结点前面一个结点*/
Position FindPrevious( ElementType X, List L )
{
    Position P;
    P = L;
    while(P->Next != NULL && P->Next->Element != X)
        P = P->Next;
    return P;//如果最后没找到,那么返回的P的next是空。
}
/*删除元素为X的结点*/
void Delete( ElementType X, List L )
{
    Position P,Tmp;
    P = FindPrevious(X,L);
    if(P->Next != NULL)
    {
        Tmp = P->Next;
        P->Next = Tmp->Next;//让X之前的结点的next指向X的下一个结点,再free掉X这个结点。
        free(Tmp);
    }
}
/*删除所有节点,只剩头结点*/
List MakeEmpty( List L )
{
    Position P;
    while((P = L->Next) != NULL)
    {
        L->Next = P->Next;
        free(P);
    }
}
/*在链表中位置P前面插入一个元素为X的结点*/
void Insert( ElementType X, List L, Position P )
{
    Position Pre,behind;
    Pre = L;
    while( Pre->Next != NULL && Pre->Next != P )//找到P前一个结点
        Pre = Pre->Next;
    if(Pre->Next == NULL)//如果没有P结点,那么就把X放在链表的最后
    {
        Pre->Next = P;
        P->Element = X;
        P->Next = NULL;
    }
    else if(Pre->Next == P)
    {
        behind = (Position)malloc(sizeof(struct Node));//如果找到P结点,先为新结点申请一块内存
        behind->Element = P->Element;//把新节点放在P后面,然后把P的值放到新节点,把X放到原来的P结点。
        behind->Next = P->Next;
        P->Element = X;
        P->Next = behind;
    }
}
/*删除链表*/
void DeleteList( List L )
{
    Position P;
    while((P = L->Next) != NULL)
    {
        L->Next = P->Next;
        free(P);
    }
    free(L);
}
View Code

 

posted @ 2016-08-13 22:21  九杯水  阅读(97)  评论(0)    收藏  举报