循环链表实现方式

本文介绍了一个简单的循环双链表实现及其基本操作,包括创建、删除、修改和查询等。通过一个C语言程序示例展示了如何操作循环双链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于循环双链表的简单练习

/************************************
 *  对于带头节点的循环双链表的练习
 *  Description:对于考验中的循环链表的简单性的练习
 *              因为在我们的408的考研中对于这个知识点并不是也别的重视
 *              因此我们在这里只是做一些简单的增删改查
 *  Author:qichaoqun
 *  Date:2019/07/20
 *************************************/
#include "stdio.h"
#include "stdlib.h"

/**
 * 定义循环链表中的结点
 */
 typedef struct LNode{
     //数据域
     int data;
     //前驱指针
     LNode* prior;
     //后继指针
     LNode* next;
 }*CircleLink;

/*创建循环双链表*/
bool createCircleLink(CircleLink &circleLink);

void showMenu();

/*查看所有的结点的内容*/
void showNode(CircleLink &circleLink);

/*删除一个结点的内容*/
bool deleteNodeByValue(CircleLink &circleLink, int value);

/*修改一个元素的值*/
bool updateNodeByValue(CircleLink &circleLink,int value, int content);

int main(){
    bool isExit = false;
    //定义循环双链表的头节点,并且对其进行初始化
    CircleLink circleLink = (CircleLink)malloc(sizeof(LNode));
    circleLink->data = 0;
    circleLink->prior = circleLink;
    circleLink->next = circleLink;

    while (!isExit){
        showMenu();
        int option;
        scanf("%d",&option);
        switch (option){
            case 1:
                //创建循环双链表
                if(createCircleLink(circleLink)){
                    printf("创建成功\n");
                }else{
                    printf("创建失败\n");
                }
                break;
            case 2:
                //删除一个结点
                printf("请输入你要删除的结点内容 ");
                int value;
                scanf("%d",&value);
                if(deleteNodeByValue(circleLink,value)){
                    printf("删除成功\n");
                }else{
                    printf("删除失败\n");
                }
                break;
            case 3:
                //根据值修改一个结点
                printf("请输入你要修改的元素和元素的值 ");
                int valueTo;
                int content;
                scanf("%d",&valueTo);
                scanf("%d",&content);
                if(updateNodeByValue(circleLink,valueTo,content)){
                    printf("修改成功\n");
                }else{
                    printf("修改失败\n");
                }
                break;
            case 4:
                //显示所有内容
                showNode(circleLink);
                break;
            case 5:
                //退出
                isExit = true;
                break;
        }
    }

    return 0;
}

/*修改一个元素的值*/
bool updateNodeByValue(CircleLink &circleLink,int value, int content){
    //定义辅助指针
    CircleLink cLink = circleLink->next;
    while (cLink != circleLink){
        if(value == cLink->data){
            //找到了要修改的元素
            cLink->data = content;
            return true;
        }
        //更新辅助指针
        cLink = cLink->next;
    }
    return false;
}

/*删除一个结点的内容*/
bool deleteNodeByValue(CircleLink &circleLink, int value){
    //定义辅助指针
    CircleLink cLinkLast = circleLink->next;
    CircleLink cLinkPro = cLinkLast;
    CircleLink flagLink = nullptr;

    //从前往后开始遍历循环链表
    while(cLinkLast != circleLink){
        if(cLinkLast->data == value){
            //找到了要删除的元素
            flagLink = cLinkLast;
            cLinkLast = cLinkLast->next;
            free(flagLink);

            cLinkPro->next = cLinkLast;
            cLinkLast->prior = cLinkPro;

            //链表中的数量减少一个
            circleLink->data--;
            return true;
        }
        //更新辅助指针
        cLinkPro = cLinkLast;
        cLinkLast = cLinkLast->next;
    }
    return false;
}

/*输出循环链表
 * 为了验证我们创建的循环双链表是正确
 * 我们可以采用从头节点的后面和前面来进行遍历
 * 可以从最后一个结点往前开始遍历
 * 如果所有的结果都一样则说明我们创建的循环链表是没有问题的
 * */
void showNode(CircleLink &circleLink){
    //定义辅助指针
    CircleLink cLink = circleLink->next;
    //从头结点的尾部开始遍历
    printf("从头结点的尾部开始遍历 ");
    while (cLink != circleLink){
        printf("%d ",cLink->data);
        cLink = cLink->next;
    }
    printf("\n");


    printf("从头结点的头部开始遍历 ");
    cLink = cLink->prior;
    while (cLink != circleLink){
        printf("%d ",cLink->data);
        cLink = cLink->prior;
    }
    printf("\n");
}



/*创建循环双链表*/
bool createCircleLink(CircleLink &circleLink){
    //定义辅助指针
    CircleLink cLink = circleLink;
    printf("请输入数值 并且以-1结束输入\n");
    int value;
    while (scanf("%d",&value),value != -1){
        //创建结点
        LNode* lNode = (LNode*)malloc(sizeof(LNode));
        lNode->data = value;

        cLink->next = lNode;
        lNode->prior = cLink;
        lNode->next = nullptr;

        //更新辅助指针
        cLink = lNode;
        //更新头节点中的数值域
        circleLink->data++;
    }

    //添加完毕将最后一个节点的为指针指向头节点
    // 将头节点的前驱指针指向最后一个结点
    cLink->next = circleLink;
    circleLink->prior = cLink;

    //完成创建
    return true;
}

void showMenu(){
    printf("对于循环双链表的练习\n");
    printf("1 创建双循环链表\n");
    printf("2 删除一个结点\n");
    printf("3 根据值修改一个结点中的内容\n");
    printf("4 显示当前所有结点元素\n");
    printf("5 退出\n");
    printf("请输入你的选择\n");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值