首页 > 其他分享 >循环单链表实现

循环单链表实现

时间:2024-01-05 22:44:12浏览次数:47  
标签:Node 单链 return 实现 next int pHead printf 循环

#include <stdio.h>
#include <stdlib.h>

#define Elemtype int 
#define ERROR -1
/*
    循环链表实现
*/
typedef struct Node {
    Elemtype e;
    Node* next;
}Node,*LinkList;

void InitList(LinkList& pHead) {
    pHead = (Node*)malloc(sizeof(Node));
    pHead->next = pHead;
}

void Visit(Elemtype e) {
    printf("%d ", e);
}

int ListTravel(LinkList pHead) {
    if (pHead->next == pHead)
        return false;
    Node* p;
    p = pHead->next;
    while (p!=pHead)
    {
        Visit(p->e);
        p = p->next;
    }
    return true;
}

void DestoryList(LinkList& pHead) {
    if (pHead == NULL) {
        printf("链表不存在,无需销毁\n");
        return;
    }
    Node* p = pHead->next;
    Node* q = NULL;
    while (p!=pHead)
    {
        q = p->next;
        free(p);
        p = q;
    }
    free(pHead);
    pHead = NULL;
}

void ClearList(LinkList pHead) {
    if (pHead == NULL) {
        printf("链表不存在,无法清空\n");
        return;
    }
    Node* p = pHead->next;
    Node* q = NULL;
    while (p != pHead)
    {
        q = p->next;
        free(p);
        p = q;
    }
    pHead->next = pHead;
}

int ListEmpty(LinkList pHead) {
    if (pHead == NULL) //排除链表不存在
    {
        printf("链表不存在\n");
        return ERROR;
    }
    if (pHead->next != pHead)
        return false;
    return true;
}

int ListLength(LinkList pHead) {
    if (pHead == NULL) {
        printf("链表不存在\n");
        return ERROR;
    }        
    Node* p;
    p = pHead->next;
    int count = 0;
    while (p != pHead)
    {
        ++count;
        p = p->next;
    }
    return count;
}

int GetElem(LinkList pHead, int i, Elemtype& e) {
    if (i < 0 || i >= ListLength(pHead)) {
        printf("不合法的下标\n");
        return ERROR;
    }        
    Node* p;
    p = pHead->next;
    int count = 0;
    while (p!=pHead)
    {
        if (count == i) {
            e = p->e;
            return true;
        }
        count++;
        p = p->next;
    }
}

Node* LocateElem(LinkList pHead, Elemtype x) {
    Node* p;
    if (pHead == NULL) {
        printf("链表不存在\n");
        return NULL;
    }
    p = pHead->next;
    while (p!=pHead)
    {
        if (p->e == x)
            return p;
        p = p->next;
    }
    return NULL;
}

Node* LocateSecondElem(LinkList pHead, Elemtype x) {   // 查询第二次出现的元素位置
    Node* p;
    int count = 0;
    if (pHead == NULL) {
        printf("链表不存在\n");
        return NULL;
    }
    p = pHead->next;
    while (p!=pHead)
    {
        if (p->e == x) {
            count++;
            if (count == 2) {
                return p;
            }    
        }    
        p = p->next;
    }
    return NULL;
}

int ListInsert(LinkList pHead, int i, Elemtype e) {
    if (pHead == NULL) {
        printf("链表不存在\n");
        return ERROR;
    }
    if (i < 0 || i > ListLength(pHead)) {
        printf("不合法的下标\n");
        return ERROR;
    }
    Node* p = pHead;
    Node* q = (Node*)malloc(sizeof(Node));
    int count = 0;
    q->e = e;
    while (count < i)  // 定位到下标为i-1的位置
    {
        p = p->next;
        ++count;
    }
    q->next = p->next;
    p->next = q;
    return 0;
}

int ListDelete(LinkList pHead, int i, Elemtype& e) {
    if (pHead == NULL) {
        printf("链表不存在\n");
        return ERROR;
    }
    if (i < 0 || i >= ListLength(pHead)) {
        printf("不合法的下标\n");
        return ERROR;
    }
    Node* p = pHead;
    Node* q = NULL;
    int count = 0;
    while (count < i) // 定位到第i-1个元素
    {
        p = p->next;
        ++count;
    }
    q = p->next;
    p->next = q->next;
    free(q);
    return 0;
}

int PriorElement(LinkList pHead, Elemtype cur, Elemtype& prior) {
    Node* p = LocateElem(pHead, cur);
    if (p == NULL) {
        printf("找不到这个元素\n");
        return ERROR;
    }
    Node* q = pHead;
    if (q->next == p) {
        printf("第一个元素没有前驱\n");
        return false;
    }
    while (q->next != p)
    {
        q = q->next;
    }
    prior = q->e;
    return true;
}

int NextElement(LinkList pHead, Elemtype cur, Elemtype& e) {
    Node* p = LocateElem(pHead, cur);
    if (p == NULL) {
        printf("找不到这个元素\n");
        return ERROR;
    }
    if (p->next == pHead) {
        printf("最后一个元素没有后继\n");
        return ERROR;
    }
    e = p->next->e;
    return true;
}

void InputList(LinkList pHead) {
    int length;
    int elem;
    printf("输入要初始化的集合元素个数:");
    scanf_s("%d", &length);
    printf("分别输入所有元素\n");
    for (int i = 0; i < length; i++)
    {
        scanf_s("%d", &elem);
        ListInsert(pHead, i, elem);
    }
}

int UnionList(LinkList La, LinkList& Lb) {
    Node *p = Lb;
    while (p->next != Lb)
    {
        p = p->next;
    }
    p->next = La->next;
    La->next = Lb->next;
    free(Lb);
    Lb = NULL;
    return 0;
}

void testGetElem(int times,LinkList pHead) {
    int index,e;
    for (int i = 0; i <times; i++)
    {
        printf("输入需要得到第几个元素的下标:");
        scanf_s("%d", &index);
        if (GetElem(pHead, index, e) != -1) {
            printf("得到的元素为%d\n", e);
        }
    }
}

void testLocate(int times, LinkList pHead) {
    Node* p = NULL;
    int elem;
    for (int i = 0; i < times; i++)
    {
        printf("输入需要找的元素:");
        scanf_s("%d", &elem);
        p = LocateElem(pHead, elem);
        if (p == NULL) {
            printf("没有找到该元素\n");
        }else{
            printf("该元素的地址是:%p 找的元素是:%d\n",p,p->e);
        }
    }
}

void testPriorElem(int times, LinkList pHead) {
    int cur, prior;
    for (int i = 0; i < times; i++)
    {
        printf("输入需要查找前驱的元素:");
        scanf_s("%d", &cur);
        if (PriorElement(pHead, cur, prior) == true) {
            printf("当前元素%d的前驱元素是%d\n",cur, prior);
        }
    }
}

void testNextElem(int times, LinkList pHead) {
    int cur, next;
    for (int i = 0; i < times; i++)
    {
        printf("输入需要查找后继的元素:");
        scanf_s("%d", &cur);
        if (NextElement(pHead, cur, next) == true) {
            printf("当前元素%d的后继元素是%d\n", cur, next);
        }
    }
}

int main() {
    LinkList  La;
    int e,i;
    InitList(La);
    InputList(La);
//测试代码
    testNextElem(3, La);
    ListTravel(La);
    DestoryList(La);
    return 0;
}

 

标签:Node,单链,return,实现,next,int,pHead,printf,循环
From: https://www.cnblogs.com/xinrenbool/p/17948241

相关文章

  • PROC HTTP 实现自动下载宏程序依赖
    问题引出我有时候会针对一些具体的场景编写很多宏程序,为了防止单个宏程序过于臃肿,会将重复的代码进行抽取,封装成一个个独立的程序单元。这其实有点类似面向对象中的基类,其他程序都在这些基类上进一步衍生,形成适用不同场景的宏程序。举个例子,我写了一个宏%quantify_multi_test,它......
  • 使用Apache Commons Chain实现命令模式
    第1章:引言大家好,我是小黑。今天咱们来聊聊一个挺有意思的话题:如何用ApacheCommonsChain实现命令模式。首先,得先搞明白什么是命令模式,对吧?命令模式,它其实是一种设计模式,主要用来把一个请求或者操作封装成一个对象。这样做的好处是什么呢?主要是让你的软件设计更加灵活,更容易扩展......
  • 如何从零开始实现TDOA技术的 UWB 精确定位系统(3)
    ​ 这是一个系列文章《如何从零开始实现TDOA技术的UWB精确定位系统》第3部分。重要提示(劝退说明):Q:做这个定位系统需要基础么?A:文章不是写给小白看的,需要有电子技术和软件编程的基础Q:你的这些硬件/软件是开源的吗?A:不是开源的。这一系列文章是授人以“渔”,而不是授人以“鱼”。......
  • 引领流量管理变革:实现高效、智能的网络监控与优化
        在当今高度信息化的时代,网络流量管理已成为企业数据分析和决策的关键环节。为了更好地满足不断变化的市场需求,提高企业运营效率,监控易推出的流量管理模块,将助力企业实现更高效、更智能的流量监控与优化。一、流量监控:实时掌握网络流量动态    监控易的流量监控功......
  • 使用Python+selenium实现第一个自动化测试脚本
    这篇文章主要介绍了使用Python+selenium实现第一个自动化测试脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧最近在学web自动化,记录一下学习过程。此处我选用python3.6+selenium3.0,均用最新版本,以适应......
  • 【设计模式】单例模式——利用ThreadLocal或CAS实现单线程内部的单例模式
    很多时候我们并不需要一个类创建的对象是全局唯一的,只需要保证在单个线程内是唯一的、线程安全的就可以。为了实现单线程内部的单例,我们可以用ThreadLocal或CAS实现。利用ThreadLocal实现先看代码:publicclassThreadLocalSingleton{privatestaticfinalThreadLocal<Thread......
  • Java限流功能的实现
    在Java中,限流是一种常见的技术手段,用于控制系统的访问速率,以保护系统免受过载和滥用。以下是一些常见的Java限流实现方法:1.计数器限流这是一种简单而常见的限流方法。在该方法中,我们可以使用计数器来记录每个时间窗口内的请求数量,并与预设的阈值进行比较。如果请求数量超过......
  • wsl2 通过桥接实现 局域网访问,docker 远程连接执行testcontainer
    为了不想在本地安装docker运行testcontainer容器测试,需要wsl2的所有端口,局域网都可以访问,折腾了3天,最后在https://zhuanlan.zhihu.com/p/659074950这篇文章的指引下才实现 首先打开控制面板点击程序 点击启用或关闭Window功能   确保开启虚拟化然后打开......
  • 【JDK+jenkins+gitee实现CI/CD(之三)】 jenkins拉取gitee代码WebHook返回403或404错误
     先上几张让我纠结了很多天的截图  以上是在我配置好jenkins和gitee令牌后一直出现的错误,查询了很多天资料后,确认造成的主要原因就是权限问题我的Jenkins 是最新的版本2.426.2,说下以下我使用过但无效果的办法,这些方法不能解决我提交代码后Jenkins触发WebHook的403问题......
  • 通过模板类实现一个简单的vector容器
    什么是模板模板分为类模板和函数模板,关键字为template,基本的声明形式如下:template<classT>;//也可以写成这样template<typenameT>class和typename在声明模板参数时的用法是相似的,一般情况下可以互换但在成员模板内部访问嵌套类型时,需要使用typename。下面举一个例子加以理......