问题:
分析双向链表的创建,插入,删除,展示等基本操作
分析:
双向循环链表主要是在判断是否结束的时候,不是判断为NULL 了,而是判断是否是头结点了
在初始化的时候,需要把next指针和prior指针都指向本身
插入时候,分析:
删除的时候,分析:
得到链表中i位置的地址:(这里可以用到插入,删除那里,可以得到i位置的p)
Node* get_node(Node *&p,int i){
Node *l=p->next;
int j=1;
while(l!=p&&j<i){
l=l->next;
j++;
}
if(l==p||j>i){
return NULL;
}else{
return l;
}
}
创建双向循环链表:
代码:
#include <iostream>
using namespace std;
typedef struct Node{
int data;
struct Node *next;
struct Node *prior;
};
void create_list(Node *&l){
Node *p=l,*s;
p->next=l;
p->prior=l;
int n;
cin>>n;
while(n!=-1){
s=new Node;
s->data=n;
p->next=s;
s->prior=p;
p=s;
cin>>n;
}
p->next=l;
l->prior=p;
cout<<"创建完毕"<<endl;
}
//得到i位置的p基值
Node* get_node(Node *&l,int i){
Node *p=l->next;
int j=1;
while(p!=l&&j<i){
j++;
p=p->next;
}
if(p==l||j>i){
return NULL;
}else{
return p;
}
}
//插入i位置元素e
int insert_list(Node *&l,int i,int e){
Node *p;
if(!(p=get_node(l,i))){
return 0;
}
Node *s=new Node;
s->data=e;
s->prior=p->prior;
p->prior->next=s;
s->next=p;
p->prior=s;
cout<<"插入完毕"<<endl;
return 1;
}
//删除i位置的元素
int del_list(Node *&l,int i){
Node *p;
if(!(p=get_node(l,i))){
return 0;
}
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
cout<<"删除成功"<<endl;
return 1;
}
//得到i位置的元素
int get_list(Node *&l,int i){
Node *p;
if(!(p=get_node(l,i))){
return 0;
}
cout<<p->data<<endl;
}
void show_list(Node *&l){
Node *p=l->next;
while(p!=l){
cout<<p->data<<" ";
p=p->next;
}
cout<<"展示链表"<<endl;
}
void len_list(Node *&l){
Node *p=l->next;
int sum=0;
while(p!=l){
sum++;
p=p->next;
}
cout<<"链表长度:"<<sum<<endl;
}
int main()
{
Node *p=new Node;
//创建双向循环链表
create_list(p);
//插入i位置元素e
int i,e;
cin>>i>>e;
insert_list(p,i,e);
//得到i位置的元素
get_list(p,i);
//删除i位置的元素
del_list(p,i);
//遍历链表元素
show_list(p);
//链表长度
len_list(p);
return 0;
}
结果: