线性表
个人信息:就读于燕大本科软件工程专业 目前大三;
本人博客:google搜索“cqs_2012”即可;
个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;
博客时间:2014-5-15;
编程语言:C++ ;
编程坏境:Windows 7 专业版 x64;
编程工具:vs2008;
制图工具:office 2010 powerpoint;
硬件信息:7G-3 笔记本;
线性表分为链表和顺序表
链表按有无头结点分为有头结点链表和无头结点链表,按是否循环分为循环链表和非循环链表,按是否双向分为单向链表和双向链表
1。不带头结点非循环单链表
2.带头结点非循环单链表(头结点的值域是没有意义的)
3.不带头结点循环单链表
4.带头结点循环单链表(尾节点的下一个节点指向第一个值域有意义的节点)
5.不带头结点非循环双向链表
6.不带头结点循环双向链表
7.带头结点循环双向链表
8.带头结点非循环双向链表
顺序表(地址是连续的)
代码(前几天大二妹子交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;
}