数据结构_循环双链表

循环双链表数据结构

#ifndef __DBLLIST_H__
#define __DBLLIST_H__
#include <bits/stdc++.h>
using namespace std;

typedef int DataType;
typedef struct node{
    DataType data;
    struct node *lLink, *rLink;
    int freq;        //访问计数
}DblNode, *DblList;
#endif

循环双链表基本操作实现

#include <bits/stdc++.h>
#include "DblList.h"

using namespace std;

void initDblList(DblList& first){
    //建立循环双链表的头结点,并形成空表
    first = (DblNode *)malloc(sizeof(DblNode));
    first ->lLink = first; first ->rLink = first;
}

void createListR(DblList& first, DataType A[], int n){
    DblNode *s, *q, *r = first;
    for(int i = 0; i < n; i ++){
        //使用尾插法顺序建立链表
        s = (DblNode *)malloc(sizeof(DblNode));
        s ->data = A[i]; s ->freq = 0;
        q = r ->rLink; s ->lLink = r; q ->lLink = s; //前驱方向链接
        r ->rLink = s; s ->rLink = q; r = s;         //后继方向链接 
    }
}

void printDblList(DblList& first, int d){
    //输出循环链表所有值,d = 0 安前驱方向; d = 1按后继方向
    DblNode *p = (d == 0)? first ->lLink : first ->rLink;
    while(p != first){
        cout << p ->data << ", ";
        p = (d == 0)? p ->lLink : p ->rLink;
    }
    cout << endl;
}

DblNode *Search(DblList& first, DataType x, int d) ///找到其值与x相等的结点
{
    DblNode *p = (d == 0)? first ->lLink : first ->rLink;
    while(p == first || p -> data == x){
        p = (d == 0)? p ->lLink : p ->rLink;
    }
   return (p != first)? p: NULL;
}

DblNode *Locate(DblList& first, int i, int d){
    //按d方向寻找第i个结点
    DblNode *p = (d == 0)?first ->lLink : first ->rLink; int k = 1;
    if(i < 0) return NULL;
    if(i == 1) return first;
    while (k < i && p != first)
    {
        p = (d == 0)? p ->lLink : p ->rLink;
        k ++;
    }
    return (p != first)? p : NULL;
}

bool Insert(DblList& first, int i, DataType x, int d){
    DblNode *p = Locate(first, i - 1, d);
    if( p == NULL) return false;
    DblNode *s = (DblNode *)malloc(sizeof(DblNode));
    s ->data = x;
    if(d == 0){
        DblNode *l = p ->lLink;
        p ->lLink = s; s ->lLink = l;
        l ->rLink = s; s ->rLink = p; 
    }else{
        DblNode *r = p ->lLink;
        p ->rLink = s; s ->rLink = r;
        r ->lLink = s; s ->lLink = p;
    }
    return true;
}

bool Remove(DblList& first, int i, DataType& x, int d){
    DblNode *p = Locate(first, i, d);
    DblNode *r = p ->rLink, *l = p ->lLink;
    if(p == NULL) return false;
    l ->rLink = r;
    r ->lLink = l;
    x = p ->data;
    free(p);
    return true;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值