编辑代码

//2.4.1 采用头插法建立循环单链表
void CreateListF(LinkNode * &L,ElemTyoe a[],int n)
{
    LinkNode * s;
    int i;
    L = (LinkNode * )malloc(sizeof(LinkNode));          //创建头结点
    L -> next = L;                                      //置为空的循环单链表
    for(i = 0;i < n;i++)
    {
        s = (LinkNode * )malloc(sizeof(LinkNode));      //创建新结点
        s -> data = a[i];
        s -> next = L -> next;                          //将结点 s 插在头部
        L -> next = s;
    }
}

//2.4.2 采用尾插法建立循环单链表
void CreateListR(LinkNode * &L,ElemTyoe a[],int n)
{
    LinkNode * s, * r;
    int i;
    L = (LinkNode * )malloc(sizeof(LinkNode));          //创建头结点
    r = L;                                              //r 始终指向终端结点,开始时指向头结点
    for(i = 0;i < n;i++)
    {
        s = (LinkNode * )malloc(sizeof(LinkNode));      //创建新结点 s
        s -> data = a[i];
        r -> next = s;                                  //将结点 s 插入结点 r 之后
        r = s;
    }
    r -> next = L;                                      //尾结点的 next 域指向头结点
}

//2.4.3 在循环单链表中查找元素值为 x 的结点
int FinDLinkNode(LinkNode * L.ElemTyoe x)
{
    int i;
    LinkNode * p = L -> next;                           //p 指向首结点,i 置为 1
    while(p != L && p -> data != x)
    {
        p = p -> next;
        i++;
    }
    if(p == L)
        return 0;                                       //没有找到返回 0
    else
        return i;
}

//2.4.4 在循环单链表中插入结点
q -> next = p -> next;
p -> next = q;

//2.4.5 在循环单链表中删除结点
p -> next = p -> next -> next;

//2.4.6 采用头插法建立循环双链表
void CreateListF(DLinkNode * &L,ElemTyoe a[],int n)
{
    DLinkNode * s;
    int i;
    L = (DLinkNode * )malloc(sizeof(DLinkNode));        //创建头结点 L
    L -> next = L -> prior = L;                         //建立一个空的循环双链表
    for(i = 0;i < n;i++)
    {
        s = (DLinkNode * )malloc(sizeof(DLinkNode));    //创建新结点 s
        s -> data = a[i];
        s -> next = L -> next;                          //将结点 s 插在首部
        if(L -> next != NULL)
            L -> next -> prior = s;
        L -> next = s;
        s -> prior = L;
    }
}

//2.4.7 采用尾插法建立循环双链表
void CreateListR(DLinkNode * &L,ElemTyoe a[],int n)
{
    DLinkNode * s, * r;
    int i;
    L = (DLinkNode * )malloc(sizeof(DLinkNode));        //创建头结点
    r = L;                                              //r 始终指向尾结点,开始时指向头结点
    for(i = 0;i < n;i++)
    {
        s = (DLinkNode * )malloc(sizeof(DLinkNode));
        s -> data = a[i];                               //创建新结点 s
        r -> next = s;                                  //将结点 s 插入结点 r 之后
        s -> prior = r;
        r = s;
    }
    r -> next = L;                                      //尾结点的 next 域指向头结点
    L -> prior = r;                                     //头结点的 prior 域指向尾结点
}

//2.4.8 在循环双链表中查找元素值为 x 的结点
int FinCDLinkNode(DLinkNode * L,ElemTyoe x)
{
    int i = 1;
    DLinkNode * p = L -> next;                          //p 指向首结点,i 置为 1
    while(p != L && p -> data != x)
    {
        p = p -> next;
        i++;
    }
    if(p == L)
        return 0;
    else
        return i;
}

//2.4.9 在循环双链表中插入结点
q -> next = p -> next;
p -> next -> prior = q;
q -> prior = p;
p -> next = q;

//2.4.10在循环双链表中删除结点
q = p -> next;
p -> next = q -> next;
q -> next -> prior = p;