循环链表模板

#include <stdio.h>
#include <stdlib.h>
typedef struct lnode{
    int data;
    struct lnode* next;
} node,*linklist;
void initlist(linklist &l){
     linklist p=(linklist)malloc(sizeof(node));
     p->next=p;//此处可以控制循环链表
     l=p;
}
void InsertFront(linklist &l,int e){//从表头插入元素
    linklist p;
    p=(linklist)malloc(sizeof(node));
    p->data=e;
    p->next=l->next;
    l->next=p;
}
void InsertEnd(linklist &l,int e){//从末尾插入元素
    linklist p,q;
    p=(linklist)malloc(sizeof(node));
    p->data=e;
    q=l;
    while(q->next!=l){//此处判断扫到末尾的条件为!=l
        q=q->next;
    }
    p->next=q->next;
    q->next=p;
}
void Print(linklist l){
    linklist p;
    p=l->next;
    while(p!=l){
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
void DeleteFront(linklist &l,int &val){//删除表前面的元素
    linklist p;
    p=l->next;
    if(p!=l){//判断是不是空表
        l->next=p->next;
        val=p->data;
        free(p);
    }
    else
        printf("LinkList is empty!/n");
}
void DeleteEnd(linklist &l,int &val){//删除表后面的元素
    linklist p,q;//q为p的前驱节点
    q=l;
    p=l->next;
    if(p!=l){//判断表是否为空
        while(p->next!=l){
            q=p;
            p=p->next;
        }
        val=p->data;
        q->next=p->next;
    }
    else
        printf("LinkList is empty!/n");
}
int main(){
    linklist l;
    int i,res;
    initlist(l);
    for(i=1; i<=8; i++){
        InsertFront(l,i+38);
        InsertEnd(l,i+100);
    }
    Print(l);//输出表的元素
    DeleteFront(l,res);
    DeleteEnd(l,res);
    Print(l);
    return 0;
}
时间: 2024-10-01 21:06:04

循环链表模板的相关文章

数据结构与算法——线性表链式存储(双向循环链表)

今天总结线性表中的双向循环链表. 什么是双向循环链表? 看名字估计也就知道了,首相他是一个循环链表,也就是最后一个结点的指针域不为空,而是指向头结点,其次与单向循环链表相比,它是双向的.所谓双向,就是给每个结点再增加一个指针域,这个指针域指向前一个结点. 即是下面这样(来自百度图片): 为什么要用双向循环链表? 无论单链表还是单向循环链表,都只有一个指针域,它们都是直接指向后继结点的,如果要查找当前结点的后继结点,会很方便.但是如果给定一个结点,要得到它的前继结点,就会很麻烦,必须从第一个元素开

循环链表--主要操作

template<typename DataType> class CircularListNode {//循环链表结点模板 public: friend class CircularList<DataType>; CircularListNode() { m_next = NULL; } CircularListNode(DataType data, CirculatListNode* nextOne = NULL) { m_data = data; m_next = mextO

C++ 模板双向不循环链表!!

CTDChain<T,sort,equal,pointer> * nodeTemp = NULL; ------------------------------------------------------------------------------ using namespace std; //双向不循环链表 //sort 指示是否有序 //equal 指示当出现相同节点时的处理方法 //pointer 指示是否是一个指针类型,在析构时必不可少 template <class T

第33课 双向循环链表的实现

1. DTLib中双向链表的设计思路 (1)数据结点之间在逻辑上构成双向循环,这有别于Linux内核链表的实现. (2)头结点仅用于结点的定位,而Linux内核链表是将头结点作为循环的一部分. 2. 实现思路 (1)通过模板定义DualCircleList类,继承自DualLinkList类 (2)在DualCircleList内部使用Linux内核链表进行实现(另类实现) (3)使用struct list_head定义DualCircleList的头结点 (4)特殊处理:循环遍历时忽略头结点

双向循环链表

//双向循环链表 typedef int datatype; //方便修改 //当然也可以写成模板来适应更多的数据类型 struct dclink{ datatype data;//数据定义 struct dclink *pre; struct dclink *next;//前驱和后继指针 }; class DCLink { public: DCLink();//default constructor DCLink(datatype data);//单参constructor void add(

Linux内核中的通用双向循环链表

开发中接触Linux越来越多,休息放松之余,免不了翻看翻看神秘的Linux的内核.看到双向链表时,觉得挺有意思的,此文记下. 作为众多基础数据结构中的一员,双向循环链表在各种“教科书”中的实现是相当的标准和一致的. 大概就是下面这个样子: 1 typedef struct node_tag{ 2 //T data; 3 struct node_tag *prev; 4 struct node_tag *next; 5 }node; 当你需要某种类型的链表时,把数据成员之类的往节点里塞就是了.比如

C++ Primer 学习笔记_13_标准模板库_list双向链表容器

C++ Primer 学习笔记_13_标准模板库_list双向链表容器 list容器实现了双向链表的数据结构,数据元素是通过链表指针串连成逻辑意义上的线性表,这样,对链表的任一位置的元素进行插入.删除和查找都是超快速的.下图是双向循环链表的结构示意图. list的每个节点有三个域:前驱元素指针域.数据域和后继元素指针域.前驱元素指针域保存了前驱元素的首地址:数据域则是本节点的数据:后继元素指针域则保存了后继元素的首地址.list的头结点的前驱元素指针域保存的是链表中尾元素的首地址,而list的尾

约瑟夫问题的求解——利用循环链表

约瑟夫问题--利用循环链表求解 1. 约瑟夫问题的提法 约瑟夫问题(约瑟夫环)是一个数学的应用问题. 已知n个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,数到m的那个人出列,他的下一个人又从1开始报数,数到m的那个人又出列,依此规律重复下去,直到圆桌周围的人全部出列. 通常解决这类问题时我们把编号从1~n,最后结果编号即为原问题的解. 2. 求解约瑟夫问题的算法原理示例 注:n=8,m=3的约瑟夫问题示例,若n=8,k=1,m=3,则出列的顺序将为3,6,1,5

循环链表(Circular Linked List)

循环链表(Circular Linked List) 1. 循环链表的概念 循环链表是另一种形式的表示线性表的链表. 循环链表的结点结构与单链表相同,与单链表不同的是链表中表尾结点的link域中不是NULL,而是存放了一个指向链表开始结点的指针. 循环链表与单链表一样,可以有附加头结点,这样能够简化链表操作的实现,统一空表与非空表的运算. 循环链表的示意图: 2. 循环链表的特点 循环链表的特点是无须增加存储量,仅对表的链接方式稍作改变,即可使得表处理更加方便灵活. 循环链表中没有NULL指针.