C写 环形双链表

/
//双向链表
//参考: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值