设置尾指针的单循环链表的表示和实现

设立尾指针的单循环链表的表示和实现

设有尾指针的单循环链表的12个基本操作

void InitList(LinkList &L){
    L = (LinkList)malloc(sizeof(LNode));//产生头结点,并使L指向此头结点
    if (!L)exit(OVERFLOW);
    L->next = L;//头结点的指针域指向头结点
}

void ClearList(LinkList &L){
    LinkList p, q;
    L = L->next;//L指向头结点
    p = L->next;//p指向第一个结点
    while (p != L){//未到表尾
        q = p->next;//q指向p的后继结点
        free(p);//释放p所指结点
        p = q;//p指向q所指结点
    }
    L->next = L;//头结点指针域指向自身(头结点)
}

void DestroyList(LinkList &L){
    ClearList(L);
    free(L);
    L = NULL;
}

Status ListEmpty(LinkList L){
    if (L->next == L)return TRUE;
    else return FALSE;
}

int ListLength(LinkList L){
    LinkList p = L->next;//p指向头结点
    int i = 0;
    while (p != L)//未到表尾
    {           
        i++;//计数器+1
        p = p->next;//p指向下一个结点
    }
    return i;
}

Status GetElem(LinkList L, int i, ElemType &e){
    int j = 1;//初始化,j为计数器,初值为1
    LinkList p = L->next->next;//p指向第1个结点
    if (i <= 0 || i > ListLength)return ERROR;//第i个元素不存在
    while (j < i)//顺时针向后查找,直到p指向第i个元素
    {
        j++;//计数器+1
        p = p->next;//p指向下一个结点
    }
    e = p->data;//第i个元素赋给e
    return OK;
}

int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType)){
    int i = 0;//计数器初值为0
    LinkList p = L->next->next;//p指向第1个结点
    while (p!=L->next)//p未指向头结点
    {
        i++;
        if (compare(p->data, e))//找到这样的数据元素
            return i;//返回其位序
        p = p->next;//p指向下一个结点
    }
    return 0;//满足关系的数据元素不存在
}

Status PriorElem(LinkList L, ElemType cur_e, ElemType &pre_e){
    LinkList q, p = L->next->next;//p指向第1个结点
    q = p->next;//q指向p的后继
    while (q != L->next){//p未到表尾(q未指向头结点)
        if (q->data == cur_e){//p的后继为cur_e
            pre_e = p->data;//将p所指的元素的值赋给pre_e
            return OK;
        }
        p = q;//p的后继不为cur_e,p向后移
        q = q->next;//q指向p的后继
    }
    return ERROR;
}

Status NextElem(LinkList L, ElemType cur_e, ElemType &next_e){
    LinkList p = L->next->next;//p指向第1个结点
    while (p!=L){//p未到表尾
        if (p->data == cur_e){//p所指结点的值为cur_e
            next_e = p->next->data;//将p所指结点的后继结点的值赋给next_e
            return OK;
        }
        p = p->next;//p指向下一个结点
    }
    return ERROR;
}

Status ListInsert(LinkList L, int i, ElemType e){
    int j = 0;
    LinkList s, p = L->next;//p指向头结点
    if (i <= 0 || i > ListLength(L) + 1) return ERROR;
    while (j < i - 1)//寻找第i-1个结点
    {
        j++;
        p = p->next;//p指向下一个结点
    }
    s = (LinkList)malloc(sizeof(LNode));//生成新结点,以下将其插入L中
    s->data = e;
    s->next = p->next;//新结点指向原第i个结点
    p->next = s;//原第i-1个结点指向新结点
    if (p == L)//插在表尾
        L = s;//L指向新的尾结点
    return OK;
}

Status ListDelete(LinkList L, int i, ElemType &e){
    int j = 0;
    LinkList q, p = L->next;//p指向头结点
    if (i <= 0 || i >= ListLength(L)) return ERROR;//第i个元素不存在
    while (j < i - 1)//寻找第i-1个结点
    {
        j++;
        p = p->next;//p指向下一个结点
    }
    q = p->next;//q指向待删除结点,p的后继
    p->next = q->next;//待删除结点的前驱指向待删结点的后继
    e = q->data;//将待删结点的值赋给e
    if (L == q)//删除的是表尾元素
        L = p;//L指向新的表尾元素
    free(q);//释放待删除结点
    return OK;
}

void ListTraverse(LinkList L, void(*visit)(ElemType&)){
    LinkList p = L->next->next;//p指向首元结点
    while (p != L->next)//p不指向头结点
    {
        visit(p->data);
        p = p->next;
    }
    printf("\n");
}

版权声明:本文为博主原创文章,未经博主允许不得转载。