实现循环单链表的各种基本运算

1.头文件

#include 
#include 
#include 

typedef char ElemType;

2.初始化循环单链表

typedef struct DNode{
    ElemType data;
    struct DNode *next;
}LinkNode;

 LinkNode *p;
    p = (LinkNode * ) malloc(sizeof(LinkNode));
    p -> next = NULL;

3.尾插法插入元素a,b,c,d,e,和普通链表实现差别不大,就是让最后一个节点的后继节点指向头节点,循环往复,可以实现对一个节点的多次访问。

void CreateCLink(LinkNode * L,ElemType a[],int n){
    LinkNode *p = L,*q;
    for (int i = 0; i < n; ++i) {
        q = (LinkNode * ) malloc(sizeof(LinkNode));
        q -> data = a[i];
        p -> next = q;
        p = q;
    }
    p -> next = L;
}

4.输出循环单链表

void DisCLink(LinkNode *L){
    LinkNode *p = L -> next;
    if(p == L){
        printf("链表为空\n");
        return;
    }
    while (p != L){
        printf("%c  ",p -> data);
        p = p -> next;
    }
    printf("\n");
    return;

}

5.输出循环单链表长度

int LengthCLink(LinkNode * L){
    LinkNode *p = L -> next;
    int cnt = 0;
    if(p == L){
        printf("循环链表为空\n");
        return 0;
    }
    while (p != L){
        cnt++;
        p = p -> next;
    }
    printf("链表有%d个元素\n",cnt);
    return cnt;
}

6.判空

bool EmptyLink(LinkNode * L){
    LinkNode *p = L -> next;
    if(p == L){
        printf("链表为空\n");
        return false;
    } else{
        printf("链表不为空\n");
        return true;
    }
}

7.输出循环单链表第3个元素

bool GetCLink(LinkNode * L,int i,ElemType x){
    if(i <= 0){
        printf("位置不合法\n");
        return false;
    }
    int j = 0;
    LinkNode *p = L -> next;
    while (j < i - 1 && p != L){
        j++; p = p -> next;
    }
    x = p -> data;
    printf("第%d位是%c\n",i,x);
    return true;
}

8.输出元素a的位置

bool GetCFLink(LinkNode * L,ElemType x){
    LinkNode *p = L -> next;
    int cnt = 1;
    while (p != L && p -> data != x){
        cnt++;  p = p -> next;
    }

    if(p == L){
        printf("位置不合法\n");
        return false;
    } else{
        x = p -> data;
        printf("%c在第%d位\n",x,cnt);
    }
}

9.在第4个位置上插入元素f

bool InsertCLink(LinkNode * L,int i,ElemType x){
    if(i <= 0){
        printf("位置不合法\n");
        return false;
    }
    int j = 1;
    LinkNode *p = L -> next,*q;
    while (j < i - 1 && p != L){
        j++; p = p -> next;
    }
    if(p == L){
        printf("位置不合法\n");
        return false;
    } else{
        q = (LinkNode * ) malloc(sizeof(LinkNode));
        q -> data = x;
        if(p -> next != L)
        q -> next = p -> next;
        p -> next = q;
        printf("%c插入成功\n",x);
        return true;
    }
}

10.输出循环单链表

11.删除第3个元素

bool DelCLink(LinkNode * L,int i,ElemType x){
    if(i <= 0){
        printf("位置不合法\n");
        return false;
    }
    int j = 1;
    LinkNode *p = L -> next,*q;
    while (j < i - 1 && p != L){
        j++; p = p -> next;
    }
    if(p == L){
        printf("位置不合法\n");
        return false;
    } else{
        q = (LinkNode * ) malloc(sizeof(LinkNode));
        q = p -> next;
        x = q -> data;
        if(q -> next != L)
            p -> next = q -> next;
        free(q);
        printf("%c删除成功\n",x);
        return true;
    }
}

12输出循环单链表

13.释放循环单链表

void DestroyCLink(LinkNode * L){
    LinkNode *pre = L,*p = L -> next;
    while (p != L){
        free(pre);
        pre = p;
        p = pre -> next;
    }
    free(pre);
    printf("销毁成功\n");
}

14.主函数

int main(){
    LinkNode *p;
    p = (LinkNode * ) malloc(sizeof(LinkNode));
    p -> next = NULL;
    ElemType ch[5] = {'a','b','c','d','e'};
    CreateCLink(p,ch,5);
    DisCLink(p);
    LengthCLink(p);
    EmptyLink(p);
    ElemType x;
    GetCLink(p,3,x);
    GetCFLink(p,'a');
    InsertCLink(p,4,'f');
    DisCLink(p);
    DelCLink(p,3,x);
    DisCLink(p);
    DestroyCLink(p);
    return 0;
}

你可能感兴趣的:(数据结构,算法,数据结构)