/*
在单循环链表和双循环链表中,在前面书上给出的删除插入就是正确的
因为尾结点和头结点的prior和next都不会空,错误除外
这次输出采取了倒序,因为可以验证双循环prior指针的正确性
在第i个位置插入时,这次没有采用写一个返回第i个结点的函数
而是全部在一起写
而且用了两种方式,初始化p结点等于L,或者L的头结点两种情况
在第i个位置删除时,直接就用一个p结点进行操作,因为这样直接找到第i个结点就可以
如果采用后删操作,还需要向前移动一位(在我的这种计数器情况下)
传入数组尾插建立时,也要把n传进去呀!!!!!!!!!!!!!!
*/
#include<iostream>
using namespace std;
typedef struct DDNode {
int data;
struct DDNode* prior, * next;
}DDNode, * DDLinkList;
//数组传入尾插建立
bool InitDDLinkList_a(DDLinkList& L,int a[],int n) {
L = new DDNode;
L->next = L;
L->prior = L;
DDNode* r = L;//尾指针
for (int i = 0; i < n; i++) {
DDNode* p = new DDNode;
p->data = a[i];
r->next = p;
p->prior = r;
r = p;
}
r->next = L;
L->prior = r;
cout << mm << endl;
return true;
}
//输入尾插法建立
bool InitDDLinkList(DDLinkList& L) {
L = new DDNode;//分配返回
L->next = L;
L->prior = L;
DDNode* r = L;//尾指针
//循环双链表指向自身
cout << "请输入结点个数:" << endl;
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cout << "第" << i+1 << "个结点数值:";
int e;
cin >> e;
DDNode* p = new DDNode;
p->data = e;
r->next = p;
p->prior = r;
r = p;
}
L->prior = r;
r->next = L;
return true;
}
//倒序输出
bool printDDLinkList(DDLinkList L) {
if (L->prior == L || L->prior == NULL)
return false;//空表
DDNode* p = L->prior;//尾结点
//为了验证下循环双链表的正确性
while (p != L) {
//不等于头结点
cout << p->data << " ";
p = p->prior;
}
cout << "这是倒序输出哟"<<endl;
return true;
}
//在第i个位置插入结点
bool InsertDDNode_i(DDLinkList& L, int i, int e) {
//DDNode* p = L->next;
//int j = 0;
//while (p != NULL && j < i-1) {
// j++;
// p = p->next;
//}
在j=i时退出,但p已经向下移动了一位
//p = p->prior;//在此刻p的后面进行插入
DDNode* p = L;
int j = 0;
while (p->next != NULL && j < i-1) {
p = p->next;
j++;
}
DDNode* s = new DDNode;
s->data = e;
s->next = p->next;
p->next->prior = s;
p->next = s;
s->prior = p;
return true;
}
//删除第i个结点
bool DeleteDDNode_i(DDLinkList& L, int i) {
DDNode* p = L->next;
int j = 0;
while (p != NULL && j < i - 1) {
j++;
p = p->next;
}//这时候p是第i个结点,j=i-1
p->prior->next = p->next;
p->next->prior = p->prior;
delete p;
return true;
}
int main() {
DDLinkList DDL;
InitDDLinkList(DDL);
printDDLinkList(DDL);
InsertDDNode_i(DDL, 3, 4);
printDDLinkList(DDL);
DeleteDDNode_i(DDL, 4);
printDDLinkList(DDL);
int a[5] = { 1,2,3,4,5 };
InitDDLinkList_a(DDL, a, 5);
printDDLinkList(DDL);
return 0;
}
23王道——循环双链表
于 2022-03-16 16:33:28 首次发布