线性表的基本实现与操作

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

你可能感兴趣的:(线性表的基本实现与操作)