#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
#define MAXSIZE 100
typedef struct
{
ElemType *elem;
int lenth;
}Sqlist;
typedef struct Lnode
{
ElemType data;
Lnode *next;
}*Linklist;
Status InitList_Sq(Sqlist &L)//有序表的初始化
{
L.elem=new ElemType[MAXSIZE];
if(!L.elem)
exit(OVERFLOW);
L.lenth=0;
return OK;
}
void InputList_Sq(Sqlist &L)//顺序表输入数据
{
int n;
cout<<"请输入要输入的元素个数:";
cin>>n;
cout<<"请输入每个元素的值:";
for(int i=0;i<n;i++)
cin>>L.elem[i];
L.lenth=n;
cout<<"输入成功!"<<endl<<endl;
}
Status LocateElem_Sq(Sqlist L,ElemType e)//顺序表的查找
{
for(int i=0;i<L.lenth;i++)
if(L.elem[i]==e)
return i+1;
return 0;
}
bool InsertList_Sq(Sqlist &L,ElemType e,int i)//顺序表的插入
{
if(i<1||i>L.lenth)
return ERROR;
for(int j=L.lenth;j>=i;j--)
L.elem[j]=L.elem[j-1];
L.elem[i-1]=e;
L.lenth++;
return OK;
}
bool DeleteList_Sq(Sqlist &L,int i,ElemType &e)//顺序表的删除
{
if(i<1||i>L.lenth)
return ERROR;
e=L.elem[i-1];
for(int j=i-1;j<L.lenth;j++)
L.elem[j]=L.elem[j+1];
L.lenth--;
return OK;
}
Status Init(Linklist &l)//链表的初始化
{
l=new Lnode;
l->next=NULL;
return OK;
}
void InputLink(Linklist &l)//链表的输入数据
{
Lnode *p,*r;
int n;
cout<<"请输入要输入的元素个数:";
cin>>n;
cout<<"请输入每个元素的值:";
p=l->next;
r=l;
for(int i=0;i<n;i++)
{
p=new Lnode;
cin>>p->data;
p->next=NULL;
r->next=p;
r=p;
}
}
Status find(Linklist &l,int n)//链表的查找
{
int i=n;
Lnode *p=l;
while(i--&&p)
p=p->next;
if(p)
cout<<"第"<<n<<"位数是"<<p->data<<endl<<endl;
else
cout<<"查找失败!"<<endl<<endl;
}
Status Insertlink(Linklist &l,int i,ElemType n)//链表的插入
{
Lnode *p;
p=l;
if(i<1)
return ERROR;
i--;
while((i--)&&p)
p=p->next;
if(!p)
return ERROR;
Lnode *r;
r=new Lnode; //为什么没有这句会执行不下去??不是已经把r定义为指向Lnode类型的指针了嘛???
r->data=n;
r->next=p->next;
p->next=r;
return OK;
}
Status Delete(Linklist &l,int i,ElemType &e)//链表的删除
{
Lnode *p=l,*r;
i--;
while(i--&&p)
p=p->next;
if(!p)
return ERROR;
else
{
e=p->next->data;
r=p->next;
p->next=r->next;
delete r;
return OK;
}
}
void convert(Linklist &l)//链表的原地逆置
{
Lnode *p,*r;
r=l->next;
l->next=NULL;//重点易忽略处
while(r)
{
p=r->next;
r->next=l->next;
l->next=r;
r=p;
}
}
void output(Linklist &l)//链表的输出
{
Lnode *p;
p=l->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl<<endl;
}
void output1(Sqlist L)//顺序表的输出
{
for(int i=0;i<L.lenth;i++)
cout<<L.elem[i]<<" ";
cout<<endl<<endl;
}
int main()
{
Sqlist L;
Lnode *l;
ElemType n,i,e,temp;
int choose;
cout<<"******************线性表的基本操作与实现******************"<<endl;
cout<<" 1.创建顺序表"<<endl;
cout<<" 2.顺序表输入数据"<<endl;
cout<<" 3.顺序表查找"<<endl;
cout<<" 4.顺序表插入"<<endl;
cout<<" 5.顺序表删除"<<endl;
cout<<" 6.顺序表输出"<<endl;
cout<<" 7.创建链表"<<endl;
cout<<" 8.链表输入数据"<<endl;
cout<<" 9.链表查找"<<endl;
cout<<" 10.链表插入"<<endl;
cout<<" 11.链表删除"<<endl;
cout<<" 12.链表的原地逆置"<<endl;
cout<<" 13.链表的输出"<<endl;
cout<<" 0.退出"<<endl;
cout<<"************************我是分界线************************"<<endl<<endl;
choose=-1;
while(choose)
{
cout<<"请输入你的选择:";
cin>>choose;
switch(choose)
{
case 0:break;
case 1:
if(InitList_Sq(L))
cout<<"创建顺序表成功!"<<endl<<endl;
else
cout<<"创建顺序表失败!"<<endl<<endl;
break;
case 2:
InputList_Sq(L);
break;
case 3:
cout<<"输入要查找的数:";
cin>>e;
temp=LocateElem_Sq(L,e);
if(temp)
cout<<e<<"是第"<<temp<<"位数"<<endl<<endl;
else
cout<<"查找失败!没有这样的数 "<<endl<<endl;
break;
case 4:
cout<<"请输入要插入的数据及其位置:";
cin>>e>>i;
if(InsertList_Sq(L,e,i))
cout<<"插入成功!"<<endl<<endl;
else
cout<<"插入失败!"<<endl<<endl;
break;
case 5:
cout<<"请输入要删除的数的位置:";
cin>>i;
if(DeleteList_Sq(L,i,e))
cout<<"删除成功,你删除的数是"<<e<<endl<<endl;
else
cout<<"删除失败!"<<endl<<endl;
break;
case 6:
cout<<"此时的顺序表中的数据为:";
output1(L);
break;
case 7:
if(Init(l))
cout<<"创建链表成功!"<<endl<<endl;
break;
case 8:
InputLink(l);
cout<<"输入数据成功!"<<endl<<endl;
break;
case 9:
cout<<"请输入要查找的数据的位置:";
cin>>n;
find(l,n);
break;
case 10:
cout<<"请输入要插入的元素的位置及值:";
cin>>i>>n;
if(Insertlink(l,i,n))
cout<<"插入成功!"<<endl<<endl;
else
cout<<"插入失败!"<<endl<<endl;
break;
case 11:
cout<<"请输入要删除的元素的位置:";
cin>>i;
if(Delete(l,i,e))
cout<<"删除成功,删除的元素是"<<e<<endl<<endl;
else
cout<<"删除失败!"<<endl<<endl;
break;
case 12:
convert(l);
cout<<"逆置成功!"<<endl<<endl;
break;
case 13:
cout<<"此时的链表中的数据为:"<<endl;
output(l);
break;
default:
cout<<"无效输入!"<<endl<<endl;
break;
}
}
return 0;
}
线性表的基本实现与操作
最新推荐文章于 2022-09-05 15:41:36 发布
