#include<cstdio>
#include <iostream>
using namespace std;
typedef struct DNode {
int data;
struct DNode* next, * prior;
}DNode,*DLinklist;
/*********双向链表的初始化************/
bool InitDlist(DLinklist& L) {
L = new DNode;
if (L == NULL) return false;
L->next = NULL;
L->prior = NULL;
return true;
}
/*******双向链表的尾插法创建(头插法和单链表头插相同道理,不做赘述)*********/
DLinklist RearInsert_Creat(DLinklist& L) {
DNode *p, *rear;
rear = L;
int Data;
cin >> Data;
while (Data != 222)
{
p = new DNode;
if (p ==NULL) perror("Error exists!");
p->data = Data;
rear->next = p;
p->prior = rear;
rear = p;
cin >> Data;
}
rear->next = NULL;
return rear;
}
/*******插入*********/
bool DLinklist_Insert(DNode *p,DNode* s){
if (p == NULL || s == NULL) return false;
p->next = s->next;
p->prior = s;
if (s->next != NULL) s->next->prior = p;//插入到链尾时;
s->next = p;
return true;
}
int main()
{
DLinklist L;
InitDlist(L);
DNode* s = L;
RearInsert_Creat(L);
while (s->next!=NULL)
{
s = s->next;
cout << s->data << endl;
}
}
/*****************循环链表的创建:
* 1.循环单链表就是让尾部的next指针指头指针,有利于单链表的前向操作及尾部操作
* 2.循环双链表就是让头指针的prior指针指向尾指针,尾指针指向头,有利于头尾的双向操作。
* 原理于操作都简单,不做赘述,注意判空条件(循环单链表,循环双链表判空条件都是是否指向自己,初始化也是都指向自己)
************************/