数据结构编程练习(三)
功能1:完成双向链表的初始化。
功能2:实现双向链表的输入数据功能。
功能3:实现双向链表求表长功能。
功能4:删除双向链表中第i个元素结点,需返回第i个是否存在的状态,并返回删除值。
功能5:检查双向链表是否对称,输入多个数据进行验证。
功能6:其他功能请自行编写,验收时讲解给验收老师即可。
新增加功能有:1、在指定位置插入元素;
2、将双链表转化为双循环链表。
代码实现:
#include "iostream"
using namespace std;
struct dnode
{
int data;
dnode *next,*prior;
};
class dlist
{
public:
dlist();
~dlist();
int create_L();
int length();
int del_element(int i);
bool sym_dlist();
int insert(int i,int &x);
void change();
void print();
private:
int count;
dnode *head;
};
dlist::dlist()
{
head=new dnode;
head->next=NULL;
head->prior=NULL;
count=0;
}
dlist::~dlist()
{
dnode *n=head->next,*p;
while(n->next!=head)
{
p=n->next;
delete n;
n=p;
}
}
//双链表的建立
int dlist::create_L()
{
dnode *n=head;
cout<<"请输入双链表的各数据(以负数表示输入结束):";
int m;
cin>>m;
while(m>=0)
{
dnode *p=new dnode;
p->data=m;
n->next=p;
p->prior=n;
n=p;
n->next=NULL;
count++;
cin>>m;
}
return 0;
}
//求表长
int dlist::length()
{
return count;
}
//删除第i个元素
int dlist::del_element(int i)
{
if(i<=0||i>count)
{
cout<<"不在范围"<<endl;
return 0;
}
else
{
dnode *n=head;
while(i--)
n=n->next;
n->prior->next=n->next;
n->next->prior=n->prior;
cout<<n->data<<"已被删除"<<endl;
delete n;
count--;
return 1;
}
}
//检查双链表是否对称
bool dlist::sym_dlist()
{
dnode *n=head;
while(n->next!=NULL)
n=n->next;
dnode *p=head->next;
bool flag=1;
while(n->prior->data!=p->next->data||n->prior->data!=p->data)
{
if(n->data==p->data)
{
n=n->prior;
p=p->next;
}
else
{
flag=0;
break;
}
}
if(flag)
{
cout<<"该双链表对称"<<endl;
return true;
}
else
{
cout<<"该双链表不对称"<<endl;
return false;
}
}
//在第i个位置插入x
int dlist::insert(int i,int &x)
{
if(i<=0||i>count)
{
cout<<"不在范围"<<endl;
return 0;
}
else
{
dnode *n=head;
while(i--)
n=n->next;
dnode *p=new dnode;
p->data=x;
n->prior->next=p;
p->prior=n->prior;
p->next=n;
n->prior=p;
count++;
return 1;
}
}
//将双链表转化为双循环链表
void dlist::change()
{
dnode *n=head;
while(n->next!=NULL)
n=n->next;
n->next=head;
head->prior=n;
cout<<"以转换为双循环链表"<<endl;
}
//输出 双链表/双循环链表
void dlist::print()
{
cout<<"当前双链表为:";
dnode *n=head->next;
int i=count;
while(i--)
{
cout<<n->data<<" ";
n=n->next;
}
cout<<endl;
}
int main()
{
int n,x;
dlist obj1;
obj1.create_L();
obj1.print();
cout<<"双链表的长度为:"<<obj1.length()<<endl;
cout<<"请输入要删除的位置:";
cin>>n;
obj1.del_element(n);
obj1.print();
obj1.sym_dlist();
obj1.print();
cout<<"请输入要插入的位置以及要插入的元素:";
cin>>n>>x;
obj1.insert(n,x);
obj1.print();
obj1.change();
obj1.print();
return 0;
}