双链表的建立

数据结构编程练习(三)

功能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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值