码迷,mamicode.com
首页 > 其他好文 > 详细

数据结构 线性表

时间:2014-06-01 13:00:46      阅读:329      评论:0      收藏:0      [点我收藏+]

标签:线性表

线性表


个人信息:就读于燕大本科软件工程专业 目前大三;

本人博客:google搜索“cqs_2012”即可;

个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;

博客时间:2014-5-15;

编程语言:C++ ;

编程坏境:Windows 7 专业版 x64;

编程工具:vs2008;

制图工具:office 2010 powerpoint;

硬件信息:7G-3 笔记本;



线性表分为链表和顺序表

链表按有无头结点分为有头结点链表和无头结点链表,按是否循环分为循环链表和非循环链表,按是否双向分为单向链表和双向链表

1。不带头结点非循环单链表

bubuko.com,布布扣

2.带头结点非循环单链表(头结点的值域是没有意义的)

bubuko.com,布布扣

3.不带头结点循环单链表

bubuko.com,布布扣

4.带头结点循环单链表(尾节点的下一个节点指向第一个值域有意义的节点)

bubuko.com,布布扣

5.不带头结点非循环双向链表

bubuko.com,布布扣

6.不带头结点循环双向链表

bubuko.com,布布扣

7.带头结点循环双向链表

bubuko.com,布布扣

8.带头结点非循环双向链表

bubuko.com,布布扣

顺序表(地址是连续的)

bubuko.com,布布扣

代码(前几天大二妹子交C++上机作业,把俺要去年的程序,很抱歉了,C++本是大二写学期的课,俺本想三年毕业的,故先修了大二的一部分课程,包括C++,于是把大一写过的C++上机实验代码给她了,当时来时给的实验成绩100分,现在看看以前自己写过的代码虽然风格和规范不太好,但是实现的功能还是不错的,毕竟当时写了一整天呢,当时一把辛酸累呀,今天共享给大家了,思路还行,循环控制的很好,大家可以自己去试一下我的程序,内容包括 自己构建的 双向链表,栈,队列)

#include<iostream>
#include<cmath>
#include<string>
#include<new>
using namespace std;


class Node  //节点类 
{
       
      string s; 
      public:        
             Node *front,*next;
             Node(string n)
             {
                  s=n;    
                  cout<<"已经为节点赋值为"<<n<<endl;
             }
             string get()
             {
               return s;
             }
             void change(string n)
             {
                    s=n;
             }
               
                  
};

Node *operator+(Node *n1,Node &n2)   //    运算符+的重载函数 
{
   n2.next=n1;
   n1->front=&n2;
   n1=&n2;
   return n1; 
}

Node *operator-(Node *n1,Node &n2)   //    运算符-的重载函数 
{ 
   n1->next=&n2;
   n2.front=n1;
   
   return &n2; 
}
    


class List  //链表类 
{
      public:
      Node *Listhead,*Listrear;
      List()
      {
          Listhead=NULL;
          Listrear=NULL;
      }
      Node *GetHead();
     
     Node *GetTail();
      
      void RemoveHead();
      
     void RemoveTail(); 
 
     void AddHead(); 
      
    void AddHead(int n);
  
    void AddTail();
   
      void AddTail(int n);
  
     void Removeall();
   
     void GetNext(string s);
     
     void GetPre(string s);          
               
     void GetAt(int n);          
               
     void SetAt(int n);          
               
     void InsertBefore(int n);          
               
     void InsertAfter(int n);          
      
     void RemoveAt(int n);
     
     int Find(string s);
     
     void FindIndex(int);
     
     void display();
     
     int GetCount();
     
     int IsEmpty();
  
     void Display();
   
};

class Stack:public List
{
     public:
          void Push();
          string  Pop();
          int StackEmpty();
          void DestroyStack();
};

void Stack::DestroyStack()
{
      Removeall();
     cout<<"栈已空"<<endl;
     
}
     

class Queue:public List
{
     public:
     void EnQueue();
     string DeQueue();
     int QueueEmpty(); 
     void DestroyQueue();
         
};

void Queue::DestroyQueue()
{
     Removeall();
     cout<<"队列已空"<<endl; 
}



void Queue::EnQueue()
{
     AddTail();
     cout<<Listrear->get()<<"进队"<<endl;
}

string Queue::DeQueue()
{
      string ss;ss=Listhead->get(); 
     cout<<ss<<"出队"<<endl;
     RemoveHead();
     return ss;
} 
     
int Queue::QueueEmpty() 
{
   if(IsEmpty())
      {
      cout<<"队空"<<endl;
      return 1;
      } 
   else
      {
               cout<<"队不空"<<endl;
               return 0;
      }
}          
 
     
     


void Stack::Push()
{
      AddHead();
      cout<<Listhead->get()<<"进桟"<<endl; 
}

string Stack::Pop()
{
     string ss;ss=Listhead->get(); 
     cout<<ss<<"出桟"<<endl;
     RemoveHead();
     return ss;    
}  

int Stack::StackEmpty()
{
      if(IsEmpty())
      {
      cout<<"栈空"<<endl;
      return 1;
      } 
      else
      {
               cout<<"栈不空"<<endl;
               return 0;
      } 
     
}        
          
          

 Node *List::GetHead()//返回头指针 
      {
         if(Listhead==NULL)
         {
            cout<<"链表已空"<<endl;
            //      return NULL;
         } 
          else  return Listhead;
      }

 Node *List::GetTail()//    返回尾指针 
      {
               if(Listrear==NULL)
               {
                 cout<<"链表已空"<<endl;
            //      return NULL;
                } 
               else return Listrear;
      }

void List::RemoveHead()//  删除头结点 
      {
          if (Listhead==NULL&&Listrear==NULL)
          cout<<"链表已空"<<endl;
         else
         {
               Node *p,*p2;
             p=Listhead;
             if(p->next==NULL)
             {
                    delete p;
                    cout<<"头节点已经删除"<<endl;
                    Listhead=NULL;Listrear=NULL;
              }
              else
              {
                    
                    
             Listhead=p->next;
             p2=p->next;
             p2->front=NULL;
             
             delete p;
             cout<<"头节点已经删除"<<endl;}
          }          
      }

void List::RemoveTail()  //  删除尾节点 
      {
               if (Listhead==NULL&&Listrear==NULL)
         cout<<"链表已空"<<endl;
         else
         {
            Node *p;
            p=Listrear;
            Listrear=p->front;
            Listrear->next=NULL;
            delete p;
            cout<<"尾节点已经删除"<<endl;
          } 
      } 

void List::AddHead()//  增加头结点 
      {
                
               string c;
               cout<<"请输入这个节点的元素(字符串格式)"<<endl;
               cin>>c;
               cout<<endl;
               Node *p;p=new Node(c);
               p->front=p->next=NULL; 
                if (Listhead==NULL&&Listrear==NULL)
                Listhead=Listrear=p;
                else
               Listhead=Listhead+(*p);
          
      } 

      void List::AddHead(int n)//   void AddHead()的重载函数 
      {
         int i;
         for(i=0;i<n;i++)
         {
           string c;
           cout<<"请输入这个节点的元素(字符串格式)"<<endl;
           cin>>c;
           cout<<endl;
           Node *p;p=new Node(c);
           p->front=p->next=NULL;
           if (Listhead==NULL)
            Listhead=Listrear=p;
          else
           Listhead=Listhead+(*p);
         }
      } 

void List::AddTail()
      {
         string c;
         cout<<"请输入这个节点的元素(字符串格式)"<<endl;
         cin>>c;
         cout<<endl;
         Node *p;p=new Node(c);
          p->front=p->next=NULL;
            if (Listhead==NULL&&Listrear==NULL)
            Listhead=Listrear=p;
            else 
         Listrear=Listrear-(*p);
      }

   void List::AddTail(int n)// void AddTail()的重载函数 
      {
          int i;
         for(i=0;i<n;i++)
         {
             string c;
             cout<<"请输入这个节点的元素(字符串格式)"<<endl;
           cin>>c;
           cout<<endl;
           Node *p;p=new Node(c);
            p->front=p->next=NULL;
              if (Listhead==NULL)
            Listhead=Listrear=p;
            else 
            Listrear=Listrear-(*p);
          }
      }

    void List::Removeall()
      {
         if (Listhead==NULL&&Listrear==NULL)
         cout<<"链表已空"<<endl;
         else
         {
            Node *p1,*p2;p1=Listhead;
            for(;p1!=NULL;)
            {
               p2=p1->next;
               delete p1;
               p1=p2;
            }
            Listhead=NULL;Listrear=NULL;
            cout<<"链表全部清空"<<endl;
         }
      }

  void List::GetNext(string s)
      {
         if (Listhead==NULL&&Listrear==NULL)
         cout<<"链表已空"<<endl;
         else
         {
            Node *p1,*p2;p1=Listhead;
            for(;p1!=NULL;)
            {
               p2=p1->next;
               if(s==p1->get())  if(p2==NULL)
                                   { cout<<"下一个元素为空"<<endl;
                                    break;}
                                 else {cout<<"下一个元素为"<<p2->get()<<endl;
                                       break;}
                                     
               else
               p1=p2;
            }
            if(p1==NULL)cout<<"你刚才输入的字符串不存在"<<endl;
         }
      }

   void List::GetPre(string s)
      {
          if (Listhead==NULL&&Listrear==NULL)
         cout<<"链表已空"<<endl;
         else
         {
            Node *p1,*p2;p1=Listrear;
            for(;p1!=NULL;)
            {
               p2=p1->front;
               if(s==p1->get())  if(p2==NULL)
                                   { cout<<"前一个元素为空"<<endl;
                                    break;}
                                 else {cout<<"前一个元素为"<<p2->get()<<endl;
                                       break;}
                                     
               else
               p1=p2;
            }
            if(p1==NULL)cout<<"你刚才输入的字符串不存在"<<endl; 
         }
      } 

 void List::GetAt(int n)
      {
          if (Listhead==NULL&&Listrear==NULL)
         cout<<"链表已空"<<endl;
         else
         {
            Node *p1,*p2;p1=Listhead;int i;
            for(i=1;i<n;i++)
              p1=p1->next;
              cout<<p1->get();
         }
      }

    void List::SetAt(int n)
      {
           if (Listhead==NULL&&Listrear==NULL)
         cout<<"链表已空"<<endl;
         else
         {
            Node *p1,*p2;p1=Listhead;int i;
            for(i=1;i<n;i++)
              p1=p1->next;
              cout<<"请输入元素"<<endl;
              string s;cin>>s; 
              p1->change(s);
             cout<<"插入成功"<<endl; 
         }
      } 

   void List::InsertBefore(int n)
      {
          
           if (Listhead==NULL&&Listrear==NULL)
         cout<<"链表已空"<<endl;
         else
         {
            Node *p1,*p2;p1=Listhead;int i;
            for(i=1;i<n;i++)
              p1=p1->next;
              cout<<"请输入元素"<<endl; 
              string s;cin>>s;
             p2=new Node(s) ;
             p2->next=p1;
             p2->front=p1->front;
             p1->front->next=p2;
             p1->front=p2;
             cout<<"插入成功"<<endl; 
         } 
     }

   void List::InsertAfter(int n)
     {
            
            if (Listhead==NULL&&Listrear==NULL)
              cout<<"链表已空"<<endl;
            else
           {
             Node *p1,*p2;p1=Listhead;int i;
               for(i=1;i<n+1;i++)
               p1=p1->next;
                 cout<<"请输入元素"<<endl; 
                 string s;cin>>s;
               p2=new Node(s) ;
               p2->next=p1;
               p2->front=p1->front;
              p1->front->next=p2;
              p1->front=p2;
              cout<<"插入成功"<<endl;
           } 
      }

 void List::RemoveAt(int n)
      {
          if (Listhead==NULL&&Listrear==NULL)
         cout<<"链表已空"<<endl;
         else
         {
            Node *p1,*p2;p1=Listhead;int i;
            for(i=1;i<n;i++)
              p1=p1->next;
              p1->front->next=p1->next;
              p1->next->front=p1->front;
              cout<<p1->get()<<"已经删除"<<endl; 
              delete p1;
          }
     }

int List::Find(string s)
      {
                
         if (Listhead==NULL&&Listrear==NULL)
         {cout<<"链表已空"<<endl;return 0;}
         else
         {
            Node *p1,*p2;p1=Listhead;int i=1;
            for(;p1!=NULL;i++)
               {
                    p2=p1->next;
                    if(s==p1->get())
                    {
                      cout<<"你要查找的元素在链表中的位置是第"<<i<<endl;
                      return 1;
                    }
                    p1=p2;
               }
            if (p1==NULL)
            return 0;
          } 
     }

 void List::FindIndex(int n)
     {
          if (Listhead==NULL&&Listrear==NULL)
           cout<<"链表已空"<<endl;
          else
          {
               Node *p1,*p2;p1=Listhead;int i;
               for(i=1;i<n;i++)
                p1=p1->next;
                cout<<p1->get()<<endl;
          }
     }



     int List::GetCount()
     {             
         if (Listhead==NULL&&Listrear==NULL)
         {cout<<"链表已空"<<endl;return 0;}
         else
         {
            Node *p1,*p2;p1=Listhead;int i=0;
            for(;p1!=NULL;i++)
               {
                    p2=p1->next;
                    p1=p2;
               }
               cout<<"链表总长度为"<<i<<endl;return 1;
          }
     }

   int List::IsEmpty()
     {
           if (Listhead==NULL&&Listrear==NULL)
         {cout<<"链表已空"<<endl;return 1;}
         else 
         {cout<<"链表不空"<<endl;return 0;}
     } 

  void List::Display()
     {
          if (Listhead==NULL&&Listrear==NULL)
         cout<<"链表已空"<<endl;
         else 
         {
               Node *p1,*p2;p1=Listhead;
            for(;p1!=NULL;)
               {
                    p2=p1->next;
                    cout<<p1->get()<<endl;
                    p1=p2;
               }
          }
     }

int m()
{
   int m1;
   cout<<"请输入你想插入头结点的个数"<<endl;
   cin>>m1;
   return m1;
}
string s1()
{
   string s;
   cout<<"请输入你查找依据的字符串"<<endl; 
   cin>>s;
   return s;
} 

int Locate1()
{
   int n;
   cout<<"请输入你要查找的元素在链表中的序号"<<endl;
   cin>>n;
   return n;
} 

int Locate2()
{
   int n;
   cout<<"请输入你要删除的元素在链表中的序号"<<endl;
   cin>>n;
   return n;
}

int Locate3()
{
   int n;
   cout<<"请输入你要插入的元素在链表中哪个节点前,请输入序号"<<endl;
   cin>>n;
   return n;
} 

int Locate4()
{
   int n;
   cout<<"请输入你要插入的元素在链表中哪个节点后,请输入序号"<<endl;
   cin>>n;
   return n;
} 




int Repeat1()
{   
    
    
    int a;
    cout<<"如果你想构造一个双向链表,并进行相关操作,请输入1,否则输入0"<<endl;
    cin>>a;
    cout<<endl;
    
    if(a)
    {
           List *L1;
          
         L1=new List;string s; 
         cout<<"第一个节点的元素初始化为"<<endl;cin>>s;
         Node* p=new Node (s);
         L1->Listhead=L1->Listrear=p;p->front=p->next=NULL; 

         int i=1;
         while(i)
         {
  	         cout<<"如果你想进行以下操作,请输入其前边的标号"<<endl;
  	         cout<<"0.不进行任何操作"<<endl; 
	          cout<<"1.得到链表头结点指针"<<endl;
	          cout<<"2.得到链表尾节点指针"<<endl;
	          cout<<"3.删除头结点"<<endl;
	           cout<<"4.删除尾节点"<<endl;
	       cout<<"5.增加头结点"<<endl;
     	  cout<<"6.增加n个头结点"<<endl;	  
     	  cout<<"7.增加尾节点"<<endl;
     	  cout<<"8.增加n个尾节点"<<endl;
     	  cout<<"9.删除所有节点"<<endl;
	      cout<<"10.得到前一个节点的元素 "<<endl;
	      cout<<"11.得到下一个节点的元素"<<endl;
	      cout<<"12.得到一个给定位置的元素"<<endl;
	     cout<<"13.在一个给定的位置插入元素"<<endl;
	     cout<<"14.删除一个给定位置的元素 "<<endl;
	      cout<<"15.在一个给定的位置前插入一个元素"<<endl;
	     cout<<"16.在一个给定的位置后插入一个元素 "<<endl;
	      cout<<"17.在链表中查找你给出的元素的位置"<<endl;
           cout<<"18.给定位置,输出他的元素"<<endl;
           cout<<"19.返回这个链表元素的个数"<<endl;
           cout<<"20.判断这个链表是否为空"<<endl;
           cout<<"21.输出链表"<<endl; 
           cin>>i;
           cout<<endl;
      
          switch(i)
                     {
                        case 0:break;
                            case 1:cout<<L1->GetHead()<<endl; break;       //得到链表头结点指针         
                            case 2:cout<<L1->GetTail()<<endl; break;       //得到链表尾节点指针 
                             case 3:L1->RemoveHead();break;     //删除头结点 
                          case 4: L1->RemoveTail(); break;     //删除尾节点 
                           case 5: L1->AddHead();break;       //增加头结点 
                           case 6:L1->AddHead(m());break;         //增加N个头结点 
                          case 7: L1->AddTail();break;       //增加尾节点 
                           case 8:L1->AddTail(m());break;       //增加n个尾节点 
                            case 9:L1->Removeall();break;       //删除所有节点
                          case 10:L1->GetPre(s1());break;        //得到前一个节点的元素 
                          case 11:L1->GetNext(s1());break;         //得到下一个节点的元素
                          case 12:L1->GetAt(Locate1());  break;       //得到一个给定位置的元素 
                          case 13:L1->SetAt(Locate1()); break;      //在一个给定的位置插入元素
                          case 14:L1->RemoveAt(Locate2());break;     //删除一个给定位置的元素 
                          case 15:L1->InsertBefore(Locate3());break;  //在一个给定的位置前插入一个元素 
                          case 16:L1->InsertAfter(Locate4()); break;  //在一个给定的位置后插入一个元素 
                          case 17:L1->Find(s1()); break;    //找到参数元素的位置 
                          case 18:L1->FindIndex(Locate1());break; //给定位置,输出他的元素             
                          case 19:L1->GetCount(); break;   //返回这个链表元素的个数 
                          case 20:L1->IsEmpty();break;  //判断这个链表是否为空 
                          case 21:L1->Display();break;      //输出链表 
      
                    } 
          cout<<"如果你想继续对这个链表进行操作,请输入1,否则输入0"<<endl; 
          cin>>i;
     }
                                 
      L1->Removeall();    
     }
     
     int n;
     cout<<"如果你想继续使用另一个链表,请输入1,否则输入0"<<endl;
	cin>>n;
	cout<<endl;
	if(n)Repeat1();
	else return 0; 
}
 
int Repeat2()
{
     
     int a;
    cout<<"如果你想构造一个栈,并进行相关操作,请输入1,否则输入0"<<endl;
    cin>>a;
    cout<<endl;
    
    if(a)
    {
     Stack *S1;
     S1=new Stack;
     cout<<"请输入第一个进桟的元素"<<endl;
     S1->Push();
     
     int i=1;
         while(i)
         {
               cout<<"如果你想进行以下操作,请输入其前边的标号"<<endl;
  	          cout<<"0.不进行任何操作"<<endl;
               cout<<"1.给出元素并进桟"<<endl;
               cout<<"2.从栈中删除一个元素"<<endl;
               cout<<"3.判断栈是否为空"<<endl;
               cout<<"4.清空栈"<<endl;
               cin>>i;
               switch(i)
                {
                         case 0:break;
                         case 1:S1->Push();break;
                         case 2:S1->Pop();break;
                         case 3:S1->StackEmpty();break;
                         case 4:S1->DestroyStack();break;
               }//switch
                      cout<<"如果你想继续对这个栈进行操作,请输入1,否则输入0"<<endl; 
          cin>>i;
        }//while
                                 
      S1->DestroyStack();    
     }//if
     
     int n;
     cout<<"如果你想继续使用另一个栈,请输入1,否则输入0"<<endl;
	cin>>n;
	cout<<endl;
	if(n)Repeat2();
	else return 0; 
                               
} 



int Repeat3()
{
     
     int a;
    cout<<"如果你想构造一个队,并进行相关操作,请输入1,否则输入0"<<endl;
    cin>>a;
    cout<<endl;
    
    if(a)
    {
     Queue *Q1;
     Q1=new Queue;
     cout<<"请输入第一个进队的元素"<<endl;
     Q1->EnQueue();
     
     int i=1;
         while(i)
         {
               cout<<"如果你想进行以下操作,请输入其前边的标号"<<endl;
  	          cout<<"0.不进行任何操作"<<endl;
               cout<<"1.给出元素并进队"<<endl;
               cout<<"2.从队中删除一个元素"<<endl;
               cout<<"3.判断队是否为空"<<endl;
               cout<<"4.清空队"<<endl;
               cin>>i;
               switch(i)
                {
                         case 0:break;
                         case 1:Q1->EnQueue();break;
                         case 2:Q1->DeQueue();break;
                         case 3:Q1->QueueEmpty();break;
                         case 4:Q1->DestroyQueue();break;
               }//switch
                      cout<<"如果你想继续对这个队进行操作,请输入1,否则输入0"<<endl; 
          cin>>i;
        }//while
                                 
      Q1->DestroyQueue();    
     }//if
     
     int n;
     cout<<"如果你想继续使用另一个队,请输入1,否则输入0"<<endl;
	cin>>n;
	cout<<endl;
	if(n)Repeat2();
	else return 0; 
                               
} 


int main()                    //   主函数
{
int Repeat3();
int Repeat2();
	int Repeat1();//声明重复函数
     int j=1;
     while(j)
     {
          
     cout<<"如果你想进行以下操作,请输入其前边的标号"<<endl;
     cout<<"1.对双向链表进行操作"<<endl;
     cout<<"2.对栈进行操作"<<endl;
     cout<<"3.对队列进行操作"<<endl;
     cin>>j;
     switch(j)
          {
          case 1:Repeat1();break;
          case 2:Repeat2();break;
          case 3:Repeat3();break;
           } 
     cout<<"如果你想继续使用本程序,请输入1,否则输入0"<<endl;
     cin>>j;
     }
     
     
	
	system("pause");
 	return 0;
}
            



数据结构 线性表,布布扣,bubuko.com

数据结构 线性表

标签:线性表

原文地址:http://blog.csdn.net/cqs_2012/article/details/27955791

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!