/
//双向链表
//参考:https://zhidao.baidu.com/question/584544521.html
#include<stdio.h>
#include<iostream>
using namespace std;
struct DoubleNode {
int Data;
struct DoubleNode* prevAdr;
struct DoubleNode* nextAdr;
};
typedef DoubleNode LinkNode, *P_LinkNode;
//链表节点个数
static int Nodecount = 0;
//**********************************
//功能:初始化链表头结点
//参数:int NodeElem 【输入】节点元素
//返回值类型:P_LinkNode 返回的是刚才创建的这个节点的指针,为了后续的读取,删除,释放内存
//******************************
P_LinkNode InitNode() {
P_LinkNode h = NULL;//这是要建立的链表头
h = new DoubleNode;
memset(h, 0, sizeof(DoubleNode));
h->Data = 2333;
h->prevAdr = h;
h->nextAdr = h;
return h;
}
//**********************************
//功能:创建单链表的结点
//参数:int NodeElem 【输入】节点元素
//返回值类型:P_LinkNode 返回的是刚才创建的这个节点的指针,为了后续的读取,删除,释放内存
//******************************
P_LinkNode CreatNode(int NodeElem) {
P_LinkNode h = new DoubleNode;
h->Data = NodeElem;
h->prevAdr = h;
h->nextAdr = h;
Nodecount++;
return h;
}
//**********************************
//功能:创建节点到已知的链表中,形成初始链表
//参数:P_LinkNode pList 【输入】已知的双链表的头。
//返回值类型:
//******************************
void CreatNodeToList(P_LinkNode h) {
P_LinkNode temp = NULL;//这是要动态建立的节点
for (int i = 0; i < 3; i++) {
temp = CreatNode(i);
h->prevAdr->nextAdr = temp;
temp->nextAdr = h;
temp->prevAdr = h->prevAdr;
h->prevAdr=temp;
//h=temp//这里注意出错,不能有这句
}
}
//**********************************
//功能:在双链表特定位置插入节点
//参数:P_LinkNode pList 【输入】已知的双链表的头。
//参数:int InsertElem 【输入】要插入的节点元素。
//返回值类型:
//******************************
void InsertNode(P_LinkNode h,int InsertElem) {
P_LinkNode p, q = NULL;
p = h->nextAdr;
while (p != h) {
if (1 == p->Data){
P_LinkNode hNew = CreatNode(InsertElem);
hNew->prevAdr = p;
hNew->nextAdr = p->nextAdr;
p->nextAdr->prevAdr = hNew;
p->nextAdr = hNew;
}
q = p->nextAdr;
p = q;
}
}
//**********************************
//功能:在双链表特定位置删除节点
//参数:P_LinkNode pList 【输入】已知的双链表的头。
//返回值类型:
//******************************
void DeleteNode(P_LinkNode h, int InsertElem) {
P_LinkNode p, q,t = NULL;
p = h->nextAdr;
while (p != h) {
if (InsertElem == p->Data) {
t = p;//专门指向将要被删除释放的节点内存
p->prevAdr->nextAdr= p->nextAdr;
p->nextAdr->prevAdr= p->prevAdr;
q = p->nextAdr;
p = q;
delete(t); t = NULL;
Nodecount--;//节点个数减少
}
else {
q = p->nextAdr;
p = q;
}
}
}
//**********************************
//功能:正向输出所有节点元素
//参数:P_LinkNode pList 【输入】已知的链表头
//返回值类型:
//******************************
void PrintfList(P_LinkNode pList) {
P_LinkNode p, q = NULL;
p = pList->nextAdr;
while (p!= pList) {
cout << p->Data << endl;
q = p->nextAdr;
p = q;
}
}
//**********************************
//功能:反向输出所有节点元素
//参数:P_LinkNode pList 【输入】已知的链表头
//返回值类型:
//******************************
void PrintfList2(P_LinkNode pList) {
P_LinkNode p, q = NULL;
p = pList->prevAdr;
while (p != pList) {
cout << p->Data << endl;
q = p->prevAdr;
p = q;
}
}
//**********************************
//功能:释放链表
//参数:P_LinkNode pList 【输入】已知的链表头
//返回值类型:
//******************************
void ClearList(P_LinkNode pList) {
P_LinkNode p, q = NULL;
p = pList->nextAdr;
while (p!=pList) {
q = p->nextAdr;
delete p;
p = q;
}
pList->nextAdr = pList;
pList->prevAdr = pList;
}
int main()
{
P_LinkNode List = NULL;//这是要建立的链表头
P_LinkNode temp = NULL;//这是要动态建立的节点
P_LinkNode h = NULL;//操作时的链表节点
List = InitNode();//初始化头结点
h = List;//拷贝头结点(是为了后续的操作保留最初的头结点List)
CreatNodeToList(h);
cout << "双链表元素个数:" << Nodecount << endl;
cout << "正向输出:" << endl;
PrintfList(h);
cout << "反向输出:" << endl;
PrintfList(h);
cout << "===========" << endl<<endl;
InsertNode(h, 3);
cout << "插入后 双链表元素个数:" << Nodecount << endl;
cout << "正向输出:" << endl;
PrintfList(h);
cout << "反向输出:" << endl;
PrintfList(h);
cout << "===========" << endl<<endl;
DeleteNode(h,3);
cout << "删除后 双链表元素个数:" << Nodecount << endl;
cout << "正向输出:" << endl;
PrintfList(h);
cout << "反向输出:" << endl;
PrintfList2(h);
cout << "===========" << endl << endl;
ClearList(List);
system("pause");
return 0;
}
C写 环形双链表
最新推荐文章于 2024-05-05 16:51:47 发布