数据结构 链表(循环)

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

//函数状态码定义
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int  Status;
typedef int  ElemType; //假设线性表中的元素均为整型

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList; //循环单链表类型定义与单链表定义相同,区别在尾节点next取值

Status ListCreate_CL(LinkList &CL);

void ListDelete_CL(LinkList &CL, ElemType min, ElemType max);

void ListPrint_CL(LinkList &CL)
{   //输出单链表,空表时输出Empty List。
    LNode *p=CL->next;  //p指向第一个元素结点
    if(p==CL){
      printf("Empty List");
      return;
    }
    while(p!=CL)
    {
        if(p->next!=CL)
            printf("%d ",p->data);
        else
            printf("%d",p->data);
        p=p->next;
    }
}
int main()
{
    LinkList CL;
    ElemType min,max;
    if(ListCreate_CL(CL)!= OK)
    {
       printf("循环链表创建失败!!!\n");
       return -1;
    }
    scanf("%d%d",&min,&max);
    ListDelete_CL(CL,min,max);
    ListPrint_CL(CL);
    return 0;
}
 Status ListCreate_CL(LinkList &CL)
 {
    int n,i;
     scanf("%d",&n);// the num of input numbers
     LNode  *realPtr, *tmpPtr;// 真实指针,和临时指针
     /*对于这道题目来说,CL是一个表,realPtr and tmpPtr 指向的都是表中的一个元素,
     开始的时候是个空表,对于表赋空 CL - >next =NULL .
     把真实的指针指向表头部。
     */
     CL = (LNode *)malloc(sizeof(LNode));
     CL->next=NULL;
     realPtr = CL;
     //赋值的第一个赋值给临时元素,再把元素串到表中
     for(i=1;i<=n;i++)
     {
         tmpPtr = (LNode *)malloc(sizeof(LNode));
         scanf("%d",&tmpPtr->data);
         if(!tmpPtr)
            exit(OVERFLOW);
         //如果内存开辟不出来,就退出程序,
         //下面把这个临时元素加入到CL表中
         realPtr->next = tmpPtr;
         realPtr = tmpPtr;
         //这步操作是把指针的位置往下移动一个位置,保证下个元素能够正常的添加到CL中,否则下次添加的位置就是这次的tmpPtr位置
     }
     realPtr->next = CL;
     return OK;
 }
void ListDelete_CL(LinkList &CL,ElemType min,ElemType max)
{
    LNode *p,*sub;
    p = CL;
    while (p->next!=CL)
    {
    sub = p->next;
    if (sub->data > min&&sub->data < max) {
    p->next = sub->next;
    }
    // 通俗的说,sub 就是侦查兵,手中同时拿着 p->next 和 sub->next 这两条线,如果这和侦查兵位置被删除,他会把p->next 联到 sub->next 上
    else p = p->next;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户画像

5.2.3 十字链表

十字链表是有向图的一种链式存储结构。在十字链表中,对应于有向图中的每条弧有一个结点,对应于每个顶点也有一个结点,这些结点的结构如下:

612
来自专栏猿人谷

顺序循环队列

1 //循环队列的顺序存储表示与实现 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 /**...

1838
来自专栏用户画像

5.2.4 邻接多重表

在邻接表中,容易求得顶点和边的各种信息,但在邻接表中求两个顶点之间是否存在边,或需要对边执行删除等操作时,需要分别在两个顶点的边表中遍历,效率较低。

501
来自专栏算法与数据结构

数据结构 单链表元素定位 PTA

由于这个很简单,他也貌似没要判断溢出,取巧突破 #include<stdio.h> #include<malloc.h> #include<stdlib.h> ...

1797
来自专栏猿人谷

顺序线性表

线性表的顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素。 线性表的第一个数据元素a1的存储位置,通常称作线性表的起始位置...

1815
来自专栏calmound

Prim

1.dist[n]并不是记录该最小生成树的最小权值 2.两个for(j)循环的意义不一样,第一个是寻找与k点相邻的最小边,第二个是更新与k点相邻的边,当然dis...

3398
来自专栏小樱的经验随笔

邻接矩阵存储有向图(详解)

邻接矩阵存储有向图 【输入描述】   输入文件包含多组测试数据,每组测试数据描述了一个无权有向图。每组测试数据第一行为两个正整数n和m,1<=n<=100,1<...

2599
来自专栏数据结构与算法

UOJ #117. 欧拉回路

欧拉回路 有一天一位灵魂画师画了一张图,现在要你找出欧拉回路,即在图中找一个环使得每条边都在环上出现恰好一次。 一共两个子任务: 这张图是无向图。(50分) 这...

3446
来自专栏算法与数据结构

数据结构 重点详解

线性数据结构 线性表-顺序表 代码实现: #include <bits/stdc++.h> #define TRUE 1 #define FALSE 0...

2196
来自专栏算法与数据结构

PTA 循环单链表区间删除 (15 分)

本题要求实现带头结点的循环单链表的创建和单链表的区间删除。L是一个带头结点的循环单链表,函数ListCreate_CL用于创建一个循环单链表,函数ListDel...

1868

扫码关注云+社区