用C++写一个双向链表
创写一个双向链表的类和一个结构体,类中包含构造函数、拷贝函数、析构函数、链表的添加数据函数、链表排序函数、输出链表元素函数、删除一结点函数、查找某个结点的函数和修改某个结点数据函数。
类和结构体的.h文件
#ifndef LINK_H
#define LINK_H
struct node
{
int data;
node* prve;
node* next;
};
class Link
{
public:
node* frist;
node* last;
int len;
public:
Link();//构造函数
Link(const Link &t);//拷贝构造函数
~Link(); //析构函数
void add_link(int );//尾插
void print_link();//输出结点数据
void up_link();//升序排序
void find_link(int );//查找第几个结点数据
void dele_link(int);//删除第几个结点数据
void change_link(int,int);//修改第几个结点的数据
};
#endif // __LINK_H__
link.cpp
#include <iostream>
#include "./link.h"
using namespace std;
/** \brief 构造函数
*/
Link:: Link()
{
frist = NULL;
last = NULL;
len = 0;
}
/** \brief 拷贝构造函数
* \param Linkl类创建的对象l
*/
Link::Link(const Link &l)
{
if(l.frist != NULL)
{
node *pch = l.frist;
frist = new node();
frist->data = pch->data;
len++;
pch = pch->next;
node *ph = frist;
while(pch != NULL)
{
ph->next = new node();
len++;
ph->data = pch->data;
pch = pch->next;
}
}
else
{
frist = last = NULL;
len = 0;
}
}
/** \brief 析构函数
*/
Link::~Link()
{
node *p = frist;
while(frist != NULL)
{
frist = frist->next;
delete p;
p = frist;
}
len = 0;
}
/** \brief 尾插法添加元素
* \param data 要添加的结点元素数据
* \return
*/
void Link::add_link(int data)
{
if(frist == NULL)
{
frist = new node();
frist->data = data;
len++;
last = frist;
}
else
{
last->next = new node();
last->next->data = data;
len++;
last->next->prve = last;
last = last->next;
}
}
/** \brief 输出每个结点的数据
* \return
*/
void Link::print_link()
{
node *p;
p = frist;
if(p == NULL)
cout<<"Link is empty" <<endl;
else
{
while(p != last->next)
{
cout<< p->data <<" ";
p = p->next;
}
cout <<endl;
}
}
/** \brief 将结点中的数据进行升序排序
* \return
*/
void Link::up_link()
{
node *p,*q;
int flag;
for(p = frist;p != last->next;p = p->next)
for(q = p->next;q != last->next;q = q->next)
{
if(p->data > q->data)
{
flag = p->data;
p->data = q->data;
q->data = flag;
}
}
}
/** \brief 查找第几个结点的元素
* \param n代表链表中第n个结点
* \return
*/
void Link::find_link(int n)
{
if(n > len)
cout<< "超出链表的长度" <<endl;
node *p;
p = frist;
int i;
for(i = 1;i < n;i++)
{
p = p->next;
}
cout<< p->data <<endl;
}
/** \brief 删除某个结点
* \param n 代表链表的第n个结点
* \return
*/
void Link::dele_link(int n)
{
int i;
node *p,*q;
p = frist;
q = p->next;
for(i = 1;i < n;i++)
{
p = p->next;
q = p->next;
}
p->prve->next = q;
q->prve = p->prve;
delete p;
len--;
}
/** \brief 修改某个结点的数据
* \param n 代表要被修改的链表的第n个结点
* \param data 修改的数据
* \return
*/
void Link::change_link(int n,int data)
{
node *p;
p = frist;
int i;
for(i = 1;i < n;i++)
{
p = p->next;
}
p->data = data;
}
main函数
#include <iostream>
#include "./link.h"
#define end 0
using namespace std;
int main()
{
Link h;
int x;
int n,m,k,j;
cout<<"插入结点元素:"<<endl;
while(1)
{
cin>>x;
if(x == end)
break;
h.add_link(x);
}
h.up_link();
cout<<"输出链表中的元素:"<<endl;
h.print_link();
cout<<"链表长度:"<<h.len<<endl;
cout<<"输入要查找的结点:"<<endl;
cin>>n;
h.find_link(n);
cout<<"输入要删除的结点:"<<endl;
cin>>m;
h.dele_link(m);
h.print_link();
cout<<"链表长度:"<<h.len<<endl;
cout<<"输入要修改的结点:"<<endl;
cin>>k;
cin>>j;
h.change_link(k,j);
h.print_link();
return 0;
}