<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>
双链表的建立、求长、定位、插入、删除、输出和释放
最新推荐文章于 2023-09-18 20:18:37 发布