线性表--链式存储结构--双向链表

作者: 我可能是个假开发 | 来源:发表于2018-03-29 19:26 被阅读156次

双向链表

一、双向链表结构

双向链表结点结构

typedef struct DualNode
{
    ElemType data;
    struct DualNode *prior;  //前驱结点
    struct DualNode *next;   //后继结点
} DualNode, *DuLinkList;
双向链表结点结构.png

既然单链表可以有循环链表,那么双向链表当然也可以有。

非空的双循环链表.png

由于这是双向链表,那么对于链表中的某一个结点p,它的后继结点的前驱结点是它本身。

二、双向链表的插入操作

插入操作.jpg

代码实现:

s->next = p;    
s->prior = p->prior;    
p->prior->next = s; 
p->prior = s;

关键在于交换的过程中不要出现矛盾,例如第四步先被执行了,那么p->prior就会提前变成s,使得插入的工作出错。

三、双向链表的删除操作

删除操作.png

代码实现:

p->prior->next = p->next;
p->next->prior = p->prior;  
free(p);

双向链表可以有效提高算法的时间性能,说白了就是用空间来换取时间。

四、双向链表的实践

要求实现用户输入一个数使得26个字母的排列发生变化,例如用户输入3,输出结果:
DEFGHIJKLMNOPQRSTUVWXYZABC
同时需要支持负数,例如用户输入-3,输出结果:
XYZABCDEFGHIJKLMNOPQRSTUVW

代码实现:

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

#define OK 1
#define ERROR 0

typedef char ElemType;
typedef int Status;
typedef struct DualNode{
    ElemType data;
    struct DualNode *prior;
    struct DualNode *next;
}DualNode,*DuLinkList;

Status InitList(DuLinkList *L){
    DualNode *p,*q;
    int i;

    *L = (DuLinkList)malloc(sizeof(DualNode));
    if(!(*L)){
        return ERROR;
    }
     
    (*L)->next = (*L)->prior = NULL;
    p = (*L);

    for(i=0;i<26;i++){
        q = (DualNode *)malloc(sizeof(DualNode));
        if(!q){
            return ERROR;
        }

        q->data = 'A'+i;
        q->prior = p;
        q->next = p->next;
        
        p = q;

    }

    p->next = (*L)->next;
    (*L)->next->prior = p;

    return OK;
}

void Caesar(DuLinkList *L,int i){
    if(i>0){
        do{
            (*L) = (*L)->next;
        }while(--i);
    }

    if(i<0){
        do{
            (*L) = (*L)->next;
        }while(++i);
    }
}

int main(){
    DuLinkList L;
    int i,n;

    InitList(&L);

    printf("请输入一个整数:");
    scanf("%d",&n);
    printf("\n");
    Caesar(&L,n);
    
    for(i=0;i<26;i++){
        L = L->next;
        printf("%c",L->data);
    }
    printf("\n");
    return 0;
}

相关文章

  • 线性表(三)——双向链表的表示和实现

    在上篇文章中我们分析讨论了线性表的链式存储结构。链式存储结构表示的线性表主要分为单链表、单循环链表和双向循环链表三...

  • 数据结构——线性表

    线性表分为顺序存储结构和链式存储结构(单链表,静态链表,循环链表,双向链表)。 单链表(**一种动态结构,所占空间...

  • 线性链表

    线性链表 线性表的顺序存储结构:顺序表线性表的链式存储结构:线性链表 线性表的链式存储所占存储空间大于顺序存储。 ...

  • 线性表的链式存储--单链表

    Java之线性表的链式存储——单链表 我们都知道,线性表的存储结构分为两种,顺序存储结构和链式存储结构,线性表的分...

  • 数据结构-单向链表

    一、线性表 线性表可以分为: 顺序表(数组) 链表(单向链表、双向链表、循环链表) 二、链表 链表是一种链式存储的...

  • 学习数据结构第一弹 线性表(5)

    循环链表与双向链表 循环链表: 循环链表也是一种线性表的链式存储结构,其实他和单链表很像,其特点是它是一个环,也就...

  • 数据结构-线性表

    归纳 线性关系、线性表的定义,线性表的基本操作。 线性表的顺序存储结构与链式存储结构(包括单(向)链表、循环链表和...

  • 数据结构学习第一弹 线性表(2)

    线性表的链式存储结构 前言: 采用链式存储结构的线性表称为链表,由n个结点链接而成特点: 对于顺序表的使用,我们一...

  • 线性表--链表(Linked)

    线性表的链式存储结构--链表(Linked) 链表(Linked)是用一组任意的存储单元存储线性表的数据元素,他们...

  • 数据结构之线性表

    线性表 线性表:零个或多个数据元素的有限序列线性表的两种存储结构:顺序存储&链式存储 单链表结构&顺序存储结构对比...

网友评论

    本文标题:线性表--链式存储结构--双向链表

    本文链接:https://www.haomeiwen.com/subject/wwdvcftx.html