其它形式链表总结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fighting123678/article/details/82704784

一、双向列表
1、定义
在双向链表的结点中有两个指针域,其一指向直接后继,另一指向直接前驱,可如下描述

//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//函数状态码定义
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int  Status;
typedef int  ElemType; //假设线性表中的元素均为整型

typedef struct DuLNode
{
    ElemType data; // 数据域
    struct DuLNode *prior; // 指向前驱的指针域
    struct DuLNode *next;// 指向后继的指针域
}DuLNode,*DuLinkList;

二、 循环链表
1、定义
循环链表是另一种形式的链式存储结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环由此,从表中任一结点出发均可找到表中其他结点。

2、循环链表的操作和线性链表基本一致,差别仅在于算法中的循环条件不是p或p->next是否为空,而是它们是否等于头指针


三、双向循环链表
1、
这里写图片描述

2、在双向链表中,有些操作如:ListLength、GetElem和LocateElem等仅需涉及一个方向的指针,则它们的算法描述和线性链表的操作相同,但是在插入和删除时有很大的不同,在双向链表中需同时修改两个方向上的指针。

3、双向链表插入数据

Status ListInsert_DuL(DuLinkList& L,int i,ElemType e)//在第i个位置处插入e元素
{
    DuLinkList s;
    DuLinkList p=L;
    int j=0;
    while(p->next!=L&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(p->next==L||j>i-1) return ERROR;
    s=(DuLinkList)malloc(sizeof(Node));
    scanf("%d",&s->data);
    s->next=p->next;p->next=s;
    s->next->prior=s;//新加
    s->prior=p;//新加
    return OK;
}

注意:
(1)与单向列表不同的地方是

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

4、双向链表删除数据

Status ListDelete_DuL(DuLinkList& L,int i,ElemType e)//删除第i个位置处的元素
{
    DuLinkList s,p=L;
    int j=0;
    while(p->next!=L&&j<i-1)
    {
        p=p->next;
        j++;
    }
    if(p->next==L||j>i-1) return ERROR;
    s=p->next;
    e=p->next->data;
    p->next=p->next->next;
    p->next->prior = p;//新加
    free(s);
    return OK;
}

猜你喜欢

转载自blog.csdn.net/fighting123678/article/details/82704784
今日推荐