双链表的建立、求长、定位、插入、删除、输出和释放

<span style="font-size:18px;">#include<iostream>
using namespace std;
typedef struct node
{
	int data;
	struct node *next, *prior;
}Node,*Dlist;

//创建爽链表,循环的,呈现环状
Dlist creatDlist()
{
	int num;
	Node *head, *p1, *p2;
	head = new Node;
	p1 = p2 = head->prior = head->next=head;
	cin >> num;
	while (-1 != num)
	{
		//新建结点,用于存储新输入的数值
		p1 = new Node;
		p1->data = num;
		//设置一个p2用于存储新输入数据的上一个结点,这样连接起来
		p2->next = p1;
		p1->next = head;
		p1->prior = p2;
		head->prior = p1;
		p2 = p1;//这次改变p2的地址,令他为新插入结点的地址,这样下一次循环中使用
		cin >> num;

	}
	//返回建立链表的表头地址
	return head;
}

//这次获取霜链表的长度信息
int getDlistlength(Dlist p) //输入链表的首地址,进行查找链表的长度
{
	int length = 0;
	Node* head = p;    //将表头的地址存储起来,建立一个链表的起点
	while (head != p->next)//循环条件,如果结点的next不是指向头结点,表示没有到链表的尾部
	{
		p = p->next;
		length++;
	}
	return length;
}
//查看某一个位置的表头地址
Node* getDlistloaction(Dlist p, int location)
{
	Node* head = p;
	int i;
	for (i = 0; head != p->next && i < location; i++)
	{
		p = p->next;
	}
	return p;
}
//在链表的某一个位置插入一个数据
void insertnode(Dlist p, int location, int element)
{
	Node* q = getDlistloaction(p, location - 1);
	Node* s = new Node;
	s->data = element;
	s->next = q->next;
	s->prior = q;
	q->next->prior = s;
	q->next = s;                     //使新插入的节点和该位置结点的前后连接起来
}

//删除某一个位置的节点
void delnode(Dlist p, int location)
{
	Node* q = getDlistloaction(p, location);
	q->prior->next = q->next;
	q->next->prior = q->prior;
	delete q;
}

//打印链表中的数据
void printDlist(Dlist p)
{
	Node* head = p;
	while (p->next != head)
	{
		cout << p->data << endl;
		p = p->next;
	}
}

//释放链表的存储空间 ,运用递归的方法进行删除空间,
void release(Dlist p)
{
	Node* head = p;
	if (head == p->next)    //这是到链表尾部的状况,,就是递归栈的底部,,
	{
		delete p;
	}
	else
	{
		release(p->next); //用递归方法,递归到链表的尾部,像是建立一个栈,从栈低进行删除结点的空间,
		delete p;
	}
}

int main()
{
	Dlist head = creatDlist();
	printDlist(head);//输入链表的首地址就行了
	int location = 3;
	int element = 30;
	insertnode(head, location, element);
	printDlist(head);
	location = 2;
	delnode(head, location);
	printDlist(head);
	cout << getDlistlength(head) << endl;
	/*release(head)*/;
	system("pause");
	return 0;
}</span>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值