版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}