【 数据结构(C语言)】线性表——双向循环链表

/**
**  2017.11.2
**  Ahthor:799
**  循环双向链表
**
***/
#include <bits/stdc++.h>
using namespace std;
#define ElemType  int
#define Status int
#define ERROR -1
#define OK 1

typedef struct LNode
{
   ElemType data;
   struct  LNode *prev;
   struct  LNode *next;
};
typedef struct DLinkList
{
    int len;
    LNode  *head;
};
void InitLinkList (DLinkList &L)
{
    L.len = 0;
    L.head = (LNode * )malloc(sizeof(LNode));
    L.head->next = L.head;
    L.head->prev = L.head;
    return ;
}
int GetLengthLinkList(DLinkList &L)
{
    LNode *index = L.head->next;
    int ct = 0;
    while (index != L.head)
    {
        ct++;
        index = index->next;
    }
    return ct;
}
LNode* GetLinkListElem(DLinkList &L,int i)
{
    LNode *index = L.head;
    int ct = 0;
    while (ct < i)
    {
        ct++;
        index = index->next;
    }
    return index;
}
Status InsertLinkList(DLinkList &L,int i,ElemType data)///* 前插入
{
    if (i <0 || i > GetLengthLinkList(L) + 1) return ERROR;
    LNode *pointer =  GetLinkListElem(L,i);
    LNode *newnode  = (LNode *)malloc(sizeof(LNode)) ;
    newnode->data = data;
    newnode->prev = pointer->prev;
    pointer->prev->next = newnode;
    newnode->next = pointer;
    pointer->prev = newnode;
    L.len++;
    return OK;
}
Status DeteleLinkListByPos(DLinkList &L,int i,ElemType &e)/// 按位删除
{
    LNode *pointer = GetLinkListElem(L,i);
    e = pointer->data;
    pointer->prev->next = pointer->next;
    pointer->next->prev = pointer->prev;
    free(pointer);
    return OK;
}
Status DeteleLinkListByVal(DLinkList &L,ElemType e)/// 按位删除
{
    LNode *pointer = L.head->next;
    for (;pointer != L.head; pointer = pointer->next)
    {
        if (pointer->data == e)
        {
            pointer->prev->next = pointer->next;
            pointer->next->prev = pointer->prev;
            free(pointer);
        }
    }
    return OK;
}
void TrverseLinkList(DLinkList &L)
{
    LNode *index = L.head->next;;
    for (; index != L.head; index = index->next )
    {
        cout<<index->data<<" ";
    }
    cout<<endl;
}
int main()
{
    int n;
    cin>>n;

    DLinkList *Dk = (DLinkList *) malloc(sizeof(DLinkList));
    InitLinkList(*Dk);
    for (int i=1; i <= n; i++)
    {
        int tmp;
        cin>>tmp;
        InsertLinkList(*Dk,i,tmp);
    }
    TrverseLinkList(*Dk);
    int pos,val;
    cin>>val;
    DeteleLinkListByVal(*Dk,val);
    TrverseLinkList(*Dk);
}

  

时间: 2024-10-08 10:24:52

【 数据结构(C语言)】线性表——双向循环链表的相关文章

线性表-双向循环链表

1.双向循环链表 双向链表是在单链表的每个结点中,再设置一个纸箱其前驱结点的指针域.双向链表可以有效的提高算法的时间性能,用空间换取时间. typedef struct Node { ElemType data; struct Node* prior; //直接前驱指针 struct Node* next; //直接后继指针 }Node, * CLinkList; 2.双向链表的插入操作:(注意顺序) s->next=p; s->prior=p->prior; p->prior-&

数据结构之双向链表(包含双向循环链表)

双向(循环)链表是线性表的链式存储结构的又一种形式. 在之前已经讲述了单向链表和循环链表.相比于单向链表只能从头结点出发遍历整个链表的局限性,循环链表使得可以从任意一个结点遍历整个链表. 但是,不管单向链表也好,循环链表也罢,都只能从一个方向遍历链表,即只能查找结点的下一个结点(后继结点),而不能查找结点的上一个结点(前驱结点).鉴于上述问题,引入了双向链表.由于双向循环链表包含双向链表的所有功能操作.因此,我们只讲述双向循环链表. 与单向链表不同,双向链表的结点构造如下图所示.即一个结点由三个

数据结构学习笔记——线性表的应用

数据结构学习笔记——线性表的应用 线性表的应用 线性表的自然连接 计算任意两个表的简单自然连接过程讨论线性表的应用.假设有两个表A和B,分别是m1行.n1列和m2行.n2列,它们简单自然连接结果C=A*B(i==j),其中i表示表A中列号,j表示表B中的列号,C为A和B的笛卡儿积中满足指定连接条件的所有记录组,该连接条件为表A的第i列与表B的第j列相等. 如:         1 2 3                3 5 A  =  2 3 3         B =  1 6       

数据结构学习笔记——线性表

第2章  线性表 2.1  线性表的类型定义  线性结构的特点是:在数据元素的非空有限集中,(1)存在唯一的一个被称做“第一个”的数据元素:(2)存在唯一的一个被称做“最后一个”的数据元素:(3)除第一个之外,集合中的每个数据元素只有一个前驱:(4)除最后一个外,集合中每个数据元素均只有一个后继. 线性表的类型定义 线性表(linear_list)是最常用的且最简单的一种数据结构.一个线性表是n个数据元素的有限序列.在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成.在这种情况下

python数据结构之一:线性表

线性表:零个或多个数据元素的有限序列. 咋一看这句话,我也不明白是什么意思,哈哈,举例说明一下吧.去电影院买票时,人们的排队就是一个线性表,有固定的最前一个,固定的最后一个. 张三是其中一个,他的前一个人,和后一个人是确定的单一的. 再如,一个公司里的一个部里有一个领导,多名员工,他们的关系就不是线性表了,有一对多的关系. 那么在python里如何创建线性表呢?如下: L1=["a","b","c","d","e&q

数据结构与算法--线性表系列(循环链表、双向链表)

hello,everybody,今天我们来学习线性表的最后两种形式,循环链表.双向链表.这两种链表,是链式存储结构的不同形式.书归正传,我们先来看看循环链表吧. 大家思考一个问题,我们把线性表各个元素比作下图的路线图上的城市: 我们的线性表各个结点的指针,都是指向唯一的后继结点,线性表的终端结点的指针为空.这样的话,如果我们在南京,我们需要先访问南京右j边的城市,再访问南京左边的城市.根据线性表的结构,我们只能返回上海,从上海依次访问到北京.因为我们的终端结点的指针为空,如果直接访问南京右边的城

数据结构与算法(四)-线性表之循环链表

前言:前面几篇介绍了线性表的顺序和链式存储结构,其中链式存储结构为单向链表(即一个方向的有限长度.不循环的链表),对于单链表,由于每个节点只存储了向后的指针,到了尾部标识就停止了向后链的操作.也就是说只能向后走,如果走过了,就回不去了,还得重头开始遍历,所以就衍生出了循环链表 一.简介 定义:将单链表中中断结点的指针端有空指针改为指向头结点,就使整个单链表形成一个环,这种头尾详解的单链表称为单循环链表,简称循环链表: 特性: 若链表为空,则头结点的next结点还是指向其本身,即head.next

基于c语言数据结构+严蔚敏——线性表章节源码,利用Codeblocks编译通过

白天没屌事,那我们就来玩玩线性表的实现吧,快要失业了,没饭吃了咋整哦 题目描述假设利用两个线性表LA和LB分别表示两个集合A和B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合A=A∪B.这就要求对线性表做如下操作:扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中去.只要从线性表LB中依次取得每个元素,并依值在线性表LA中进行查访,若不存在,则插入之. #ifndef FUNC_H_INCLUDED #define FUNC_H_INCLUDE

数据结构笔记之线性表

线性表即链表,基本特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,其他么个数据元素都有一个前驱和后继.是最基本且最常用的一种线性结构. 2.1线性表的定义和特点 由n(n>=0)个数据特性相同的元素否城的有限序列成为线性表,n为线性表长度,当n=0称空表. 举例:1.26个英文字母的字母表是一个线性表,数据元素是单个字母. 2.学生信息表中,每一个学生为一个数据元素,包括学号.姓名.性别等等数据项. 2.2案例:图书信息管理系统. 2.3线性表的类型定义 线性表是一个相当灵活的数据结构