单链表

 

  • 声明指向一个结构的指针并不创建该结构,而只是给出足够的空间容纳结构可能会使用的地址。
  • malloc(sizeof(PtrToNode))是合法的,但是它并不给结构体分配足够的空间。它只给指针分配一个空间。
  • Find 、 FindPrevious 、Delete 函数最坏情况运行时间是$O(N)$,其余的都为$O(1)$,因为不管表多大都只执行固定数目的指令。
#include <cstdio>
#include <cstdlib>
#include <malloc.h>

struct Node;
typedef struct Node *PtrToNode;
typedef PtrToNode List;
typedef PtrToNode Position;
typedef int ElementType;

List MakeEmpty(List L);
int IsEmpty(List L);
int IsLast(Position P,List L);
Position Find(ElementType X,List L);
void Delete(ElementType X,List L);                  // 删除第一次出现的X元素 
Position FindPrevious(ElementType X,List L);
void Insert(ElementType X,List L,Position P);
void DeleteList(List L);
Position Header(List L);
Position First(List L);
Position Advance(Position P);
ElementType Retrieve(Position P);

struct Node
{
    ElementType Element;
    Position Next;
};

int IsEmpty(List L)
{
    return L->Next == NULL;
}

int IsLast(Position P,List L)
{
    return P->Next == NULL;
}

Position Find(ElementType X,List L)
{
    Position P = NULL;
    P = L->Next;
    while(P!=NULL && P->Element != X)
    {
        P=P->Next;
    }
    return P;
}

Position FindPrevious(ElementType X,List L)
{
    Position P = L;
    while(P->Next!=NULL && P->Next->Element!=X)
    {
        P = P->Next;
    }
    return P;
}

void Delete(ElementType X,List L)
{
    Position P = FindPrevious(X,L);
    if(!(IsLast(P,L)))
    {
        Position TmpCell = P->Next;
        P->Next = TmpCell -> Next;
        free(TmpCell);
    }
}

void Insert(ElementType Element,List L,Position P)
{
    Position TmpCell = Position(malloc(sizeof(struct Node)));
    if(!TmpCell)
    {
        printf("Out of Space
");
    }
    TmpCell->Element = Element;
    TmpCell->Next = P->Next;
    P->Next = TmpCell;
}

void DeleteList(List L)
{
    Position P = L->Next;
    L->Next = NULL;
    Position TmpCell;
    while(P!=NULL)
    {
        TmpCell = P;
        P = P->Next;
        free(TmpCell);
    }
}

List Create()
{
    List L = List(malloc(sizeof(struct Node)));
    L->Next = NULL;
    Position PrePosition = L;
    for(int i = 1; i<=5;++i) { Insert(i,L,PrePosition); PrePosition = PrePosition -> Next;
    }
    return L;
}

void Print(List L)
{
    Position P = L->Next;
    while(P!=NULL)
    {
        printf("%d",P->Element);
        P=P->Next;
        if(P!=NULL)
        {
            printf(" "); 
        }
    } 
    printf("
");
}
 
 Position Header(List L)
{
    return L;
}

Position First(List L)
{
    return L->Next;
}

Position Advance(Position P)
{
    return P->Next;
}

ElementType Retrist(Position P)
{
    return P->Element;
}
 
int main()
{
    List L = Create();   // Create()函数是作测试用 
    Print(L);
    return 0;
}
原文地址:https://www.cnblogs.com/kachunyippp/p/10255351.html