循环单链表

#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;
}

 

posted @ 2021-01-22 15:07  大耿2844  阅读(87)  评论(0)    收藏  举报