#include<iostream>
using namespace std;
//循环单链表
class point{//结点类
public:
int data;
point *next;
};
class line{//单链表
public:
int length;
point *head;
point *rear;
line();
void show();//输出元素
void creat_line(int n);//创建单链表(头插法和尾插法就不写了 暂时想不到这两种方法有什么意义)
void insert_elem(int i,int n);//插入元素
void delete_elem(int i);//删除元素
void delete_line();//删除单链表
void print_length();//打印单链表长度
void find(int i);//查找单个元素
void merge_line(line &temp_l);//合并两表
};
line::line(){//建立一个空表
head=new point;
rear=new point;
length=0;
head->data=0;
head->next=NULL;
rear->data=0;
rear->next=head;
}
void line::creat_line(int n){//建立一个单链表
if(n<0){
cout<<"输入不合法"<<endl;
return;
}
point *temp,*new_elem;
temp=head;//从头指针开始增加元素
for(int i=0;i<n;i++){
int m=0;
new_elem=new point;
cout<<"请为第"<<i+1<<"个元素赋值:";
cin>>m;
new_elem->data=m;
new_elem->next=rear;
temp->next=new_elem;
temp=new_elem;
length++;
}
}
void line::show(){//遍历输出单链表中的元素
if(head==NULL){
cout<<"此表为一个空表"<<endl;
return;
}
point *temp=head;
while(temp->next != rear){
temp=temp->next;
cout<<temp->data<<" ";
}
}
void line::insert_elem(int i,int n){//把元素值为n的数据插入到第i个元素之前
if(i<0||i>length+1){
cout<<"插入的位置不存在"<<endl;
return;
}
point *temp,*new_elem,*new_elem2;
temp=head;
if(i==length+1){//尾部插入
for(int i1=1;i1<i;i1++){
temp=temp->next;
}
new_elem2=new point;
new_elem2->data=n;
new_elem2->next=temp->next;
temp->next=new_elem2;
length++;
cout<<"插入成功"<<endl;
return;
}
for(int i1=1;i1<i;i1++){//中间插入
temp=temp->next;
}
new_elem=new point;
new_elem->data=n;
new_elem->next=temp->next;
temp->next=new_elem;
length++;
cout<<length<<endl;
}
void line::delete_elem(int i){//删除第i个元素
if(head==NULL){
cout<<"此表已经是空表了"<<endl;
return;
}
if(length<i){
cout<<"不存在第"<<i<<"个元素"<<endl;
return;
}
point *temp,*p;
temp=head;
for(int i1=1;i1<i;i1++){
temp=temp->next;
}
p=temp->next;
temp->next=temp->next->next;
delete p;
p=NULL;
length--;
}
void line::delete_line(){//整表删除
if(head==NULL){
cout<<"此表已经为空表了"<<endl;
return;
}
point *temp1,*tem;
temp1=head->next;
tem=new point;
while(temp1!=rear){
tem=temp1;
temp1=temp1->next;
head->next=temp1;
tem->next=NULL;
delete tem;
}
head->next=rear;
length=0;
cout<<"此表已删除"<<endl;
}
void line::print_length(){
cout<<"表的长度为"<<length<<endl;
}
void line::find(int i){
if(i>length||i<0){
cout<<"查找的元素不存在"<<endl;
return;
}
point *temp;
temp=head;
for(int i1=0;i1<i;i1++){
temp=temp->next;
}
cout<<"查找的元素为:"<<temp->data<<endl;
}
void line::merge_line(line &temp_l){//合并两循环单链表
point *q,*p;
p=this->rear->next;//指针p保存表A的头指针
this->rear->next=temp_l.rear->next;//将表A的尾结点连接到表B的第一个结点上(不是头指针,第一个结点)
q=temp_l.rear->next;//保存表B的头指针 便于释放
temp_l.rear->next=p;//将表B的尾结点连接到表A的头指针上
q->next=NULL;
this->length+=temp_l.length;
delete q;
}
int main(){
//line l;
line lA,lB;
lA.creat_line(4);
lB.creat_line(3);
//l.print_length();
//l.insert_elem(4,100);
//l.insert_elem(6,100);
//l.find(3);
//line lc=lA.merge_line(lB);
//l.delete_elem(5);
// l.delete_line();
// l.print_length();
//l.print_length();
return 0;
}