双向循环链表的建立

单链表的缺点是只能往前,不能后退,虽然有循环单链表,但后退的成本还是很高的,需要跑一圈。在这个时候呢,双向链表就应运而生了,再加上循环即双向循环 链表就更加不错了。所谓双向链表只不过是添加了一个指向前驱结点的指针,双向循环链表是将最后一个结点的后继指针指向头结点,这在遍历时很关键。

程序:

#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef struct DuLNode{
        int data;
        struct DuLNode *prior;
        struct DuLNode *next;
}DuLNode,*DuLinkList;
//建立一个只含头结点的空双向循环链表
int InitList_DuL(DuLinkList &L){
        L=(DuLinkList)malloc(sizeof(DuLNode));
        if(!L){
                exit(OVERFLOW);
        }
        L->prior=L;
        L->next=L;
        return OK;
}
//建立一个带头结点的含n个元素的双向循环链表L
int CreateList_DuL(DuLinkList &L,int n){
        DuLinkList p,q;
        int i;
        printf("Input the datas:");
        q=L;
        for(i=0;i<n;i++){
                p=(DuLinkList)malloc(sizeof(DuLNode));
                scanf("%d",&p->data);
                p->next=q->next;//新元素总是插入表尾
                q->next=p;
                p->prior=q;
                L->prior=p;//修改头结点的prior的值,指向新结点p
                q=p;//q指向新的尾结点
        }
                return OK;

}       
//遍历双向循环链表
int TraverseList_DuL(DuLinkList L){
        DuLinkList p;
        p=L->next;//p指向第一个结点
    while(p!=L){//还没到链表结尾  这地方注意如何还按照以前条件while(p)输出将是无线循环,因为这是循环链表头尾相连
                printf("%d",p->data);
                p=p->next;
        }
        return OK;
}
main(){
        int n;
        DuLinkList L;
        InitList_DuL(L);
        printf("Input the length of the list L:");
        scanf("%d",&n);
        CreateList_DuL(L,n);
        printf("Output the datas:");
        TraverseList_DuL(L);
        printf("\n");
}
结果:
[email protected]:~/work/c/doublelianbiao$ ./createlist
Input the length of the list L:3
Input the datas: 1 3 5
Output the datas:135

时间: 2024-07-29 11:24:30

双向循环链表的建立的相关文章

数据结构8: 双向链表(双向循环链表)的建立及C语言实现

之前接触到的链表都只有一个指针,指向直接后继,整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 “单向链表”或“单链表”. 如果算法中需要频繁地找某结点的前趋结点,单链表的解决方式是遍历整个链表,增加算法的时间复杂度,影响整体效率.为了快速便捷地解决这类问题,在单向链表的基础上,给各个结点额外配备一个指针变量,用于指向每个结点的直接前趋元素.这样的链表被称为“双向链表”或者“双链表”. 双链表中的结点 双向链表中的结点有两个指针域,一个指向直接前趋,一个指向直接后继.(链表中第一个结点的

线性表实现——双向循环链表

1 /*双向循环链表*/ 2 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <time.h> 6 7 #define OK 1 8 #define ERROR 0 9 typedef int Status; 10 typedef int ElemType; 11 12 typedef struct DCNode 13 { 14 ElemType data; 15 struct DCNode* next; 16

双向循环链表的实现

双向循环链表的实现 2013-01-11 09:29:04     我来说两句      作者:坚持理想_面对现实 收藏    我要投稿 在使用链表来解决约瑟夫问题的时候,用到了循环链表.循环链表又分为单向循环链表与双向循环链表,约瑟夫问题采用单项循环链表可以得到很好的而解决了,但是单向链表的很大的缺陷仍然存在,那就是在删除的时候需要两个并排指针同步移动.双向链表就可以解决这个问题,因为在双向链表中的每一个结点都有两个指针域来分别指向其前驱和后继.这样子在遍历链表时不用两个指针,直接使用一个就好

双向循环链表(c++实现)

在该双向循环链表中,表头结点first不存元素:当双向循环链表为空时:first->rlink=first->llink=first: 以下代码实现了双向循环链表的插入.删除操作:在插入操作中,实现了头插法以及按序插入法. //main.cpp //----------建立一个双向循环链表------- #include<iostream> using namespace std; class dblist; class dblistnode { friend class dbli

队列实现 (双向循环链表 C++)

队列是很简单的,但是用数组实现可能更好点..(其实我觉得数组在多个队列的时候更难) 然后我是第一次写双向循环链表.指向太乱了. 我这里是按照自己的想法,建立了一个头节点,一个尾节点,然后按照队列顺序正向插入到两个节点之间.输出和弹出队列的时候从后面操作. 下面上代码: // // main.cpp // queue // // Created by Alps on 14-7-28. // Copyright (c) 2014年 chen. All rights reserved. // #inc

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

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

双向循环链表 初始化 插入 删除

#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 #define TRUE 1 #define FALSE -1 #define NULL 0 #define OVERFLOW -2 #define ElemType int #define Status int typedef int ElemType typedef int Status #define LEN sizeof(DuLNode)

双向循环链表

//双向循环链表 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(

算法导论13:双向循环链表 2016.1.13

今天这个又打了很长时间,本来觉得数据结构就是那样,不过是一种思维,但是实际上真正自己打和想象中差距还是很大,需要考虑到各种细节. 今天这个问题有一个比较有意思的应用,就是“约瑟夫环问题”. 具体可以参见百度百科: http://baike.baidu.com/link?url=poA1Aanlptc6yzP1puYhSw_0RQjRAplhPfHwk6eoiqMNxw6WigCEbexxZ8a9SUbrMGokpPbKNzVYw308xjeEw_ 读完问题就可以发现,这个问题用链表就是一个很完美