数据结构编程练习(二)
功能1:在构造函数完成带头结点单链表的初始化。
功能2:输入数据,利用尾插法完成链表生成。
功能3:求单链表表长。
功能4:求链表中第i个元素,要求返回第i个元素是否存在的结果,并返回第i个元素值及其结点地址。
功能5:在第i个结点前插入值为x的结点。
功能6:删除链表中第i个元素结点,需返回第i个结点是否存在的状态,并返回删除结点中存储的数据。
功能7:在析构函数中完成链表内存释放,声明一个对象,截图描述并说明其构造函数、析构函数调用顺序及过程。
代码实现:
#include "iostream"
using namespace std;
struct node
{
int data;
node *next;
};
class list
{
public:
list();
~list();
int create_L();
int length();
int get_element(int i);
int insert(int i,int &x);
int del_element(int i);
int print();
private:
int count;
node *head;
};
//单链表的初始化
list::list()
{
head=new node;
head->next=NULL;
count=0;
}
//析构函数释放内存
list::~list()
{
node *n=head;
while(count--)
{
node *p=n->next;
delete n;
n=p;
}
}
//尾插法建立单链表
int list::create_L()
{
int m;
cout<<"请输入所要建立的单链表的长度:";
cin>>m;
cout<<"请输入各元素:";
node *n=head;
while(m--)
{
node *p=new node;
n->next=p;
p->next=NULL;
cin>>p->data;
n=p;
count++;
}
return 0;
}
//求单链表的长度
int list::length()
{
return count;
}
//取第i个位置的元素
int list::get_element(int i)
{
if(i<=0||i>count)
{
cout<<"不在范围"<<endl;
return 0;
}
else
{
node *n=head;
while(i--)
n=n->next;
cout<<"该位置的元素为:"<<n->data<<endl;
return 1;
}
}
//在第i个结点前插入值为x的结点
int list::insert(int i,int &x)
{
if(i<=0||i>count)
{
cout<<"不在范围"<<endl;
return 0;
}
else
{
node *n=head;
i--;
while(i--)
n=n->next;
node *p=new node;
p->data=x;
p->next=n->next;
n->next=p;
count++;
return 1;
}
}
//删除第i个位置元素
int list::del_element(int i)
{
if(i<=0||i>count)
{
cout<<"不在范围"<<endl;
return 0;
}
else
{
node *n=head;
i--;
while(i--)
n=n->next;
cout<<n->next->data<<"已被删除"<<endl;
n->next=n->next->next;
count--;
return 1;
}
}
//输出单链表
int list::print()
{
node *n=head;
cout<<"当前单链表为:";
while(n->next!=NULL)
{
node *p=n->next;
cout<<p->data<<" ";
n=p;
}
cout<<endl;
return 0;
}
int main()
{
list obj1;
int n,x;
obj1.create_L();
obj1.print();
cout<<"单链表的长度为:"<<obj1.length()<<endl;
cout<<"请输入所要查找的位置:";
cin>>n;
obj1.get_element(n);
obj1.print();
cout<<"请输入所要插入的位置以及所要插入的元素:";
cin>>n>>x;
obj1.insert(n,x);
obj1.print();
cout<<"请输入所要删除的位置:";
cin>>n;
obj1.del_element(n);
obj1.print();
return 0;
}