C写 环形双链表

来源:互联网 发布:淘宝卖家采集器破解版 编辑:程序博客网 时间:2024/06/06 10:20
///////////////////////////////////////////双向链表//参考: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;}

原创粉丝点击