数据结构——c++顺序表

数据结构——c++顺序表

  • 顺序表菜单

顺序表菜单

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINTCREMENT 10
using namespace std;

typedef struct{
	int *elem;
	int length;
	int listsize;
}SqList;

int success=0;			 
void CreatArray(SqList *L);//初始化 
void DestroyArray(SqList *L);//销毁 
void ClearArray(SqList &L);//清空 
int ArrayEmpty(SqList *L);//判断是否为空 
int ArrayLength(SqList *L);//长度 
int GetElem(SqList *L,int i,int &n);//指定位置元素 
int LocateElem(SqList *L,int e);//元素位置 
int FormerElem(SqList *L,int e,int &f);//前驱 
int LaterElem(SqList *L,int e,int &l);//后继 
void ArrayInsert(SqList *L,int i,int e);//插入元素 
void ArrayDelete(SqList *L,int i);//删除元素 
void ArrayCout(SqList *L);// 输出 
int IfEmptyList(SqList *L);//是否空表 
void CreatArray1(SqList *L);
void MergeArray(SqList *L1,SqList *L2,SqList*L3); //合并 

int main()
{
	int choose;
	SqList L;
	SqList L1,L2,L3;
	CreatArray1(&L1);
	ArrayInsert(&L1,1,2);ArrayInsert(&L1,2,3);ArrayInsert(&L1,3,4);ArrayInsert(&L1,4,5);
	CreatArray1(&L2);
	ArrayInsert(&L2,1,1);ArrayInsert(&L2,2,4);ArrayInsert(&L2,3,6);ArrayInsert(&L2,4,7);ArrayInsert(&L2,5,8);ArrayInsert(&L2,6,9);
	CreatArray1(&L3);
	while(1)
	{
		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<<"请输入操作代码:";
		cin>>choose; 
		
	switch(choose)
	{
	case 0:
		{
			return 0;
		}
	case 1:
	{
		CreatArray(&L); 
		break;
	}
	case 2:
	{
		if(success==0)
		{
			cout<<"请先进行初始化!!!"<<endl;
			break;
		}
		DestroyArray(&L);
		
		break;
	}
	case 3:
	{
		if(success==0)
		{
			cout<<"请先进行初始化!!!"<<endl;
			break;
		}
		ClearArray(L);
		break;
	}
	case 4:
	{
		if(success==0)
		{
		cout<<"请先进行初始化!!!"<<endl;
		break;
		}
		int b;
		b=IfEmptyList(&L);
		if(b==0)
		{
			cout<<"此表为空表!"<<endl;
		}
		else
		{
			cout<<"此表为非空表!"<<endl;
		}
			break;
		}
		case 5:
		{
			if(success==0)
			{
				cout<<"请先进行初始化!!!"<<endl;
				break;
			}
				int length;
				length= ArrayLength(&L);
				cout<<"线性表的长度为:"<<length<<endl;
				break;
		}
		case 6:
		{
			if(success==0){
				cout<<"请先进行初始化!!!"<<endl;
				break;
			}
				cout<<"请输入指定的位置:";
				int c;
				cin>>c; 
				if(c<1||c>L.length)
	{
		cout<<"Position is incorrect!"<<endl;
		break;
	}
				cout<<"此位置的数为:"<<L.elem[c-1]<<endl;
				break;
		}
		case 7:
		{
			if(success==0)
			{
				cout<<"请先进行初始化!!!"<<endl;
				break;
			}
			int e;
			cout<<"请输入一个表中元素:";
			cin>>e; 
			int d;
			d= LocateElem(&L,e); 
			if(d==0)
			{
				break;
			} 
			cout<<"此元素的位置为:"<<d<<endl;
			break;
		}
		case 8:
		{
			if(success==0)
			{
				cout<<"请先进行初始化!!!"<<endl;
				break;
			}
				cout<<"请输入要查找前驱的元素:";
				int d1;
				cin>>d1; 
				int f;
				FormerElem(&L,d1,f);
				cout<<"此元素的前驱为:"<<f<<endl;
				break;
		}
		case 9:
		{
			if(success==0)
			{
				cout<<"请先进行初始化!!!"<<endl;
				break;
			}
			cout<<"请输入要查找后继的元素:";
			int d3;
			cin>>d3; 
			int l;
			LaterElem(&L,d3,l);
			cout<<"此元素的后继为:"<<l<<endl;
			break;
		}
		case 10:
		{
			if(success==0)
			{
				cout<<"请先进行初始化!!!"<<endl;
				break;
			}
			int d5,d6;
			cout<<"请输入要插入的位置:";
			cin>>d5;
			cout<<"请输入要插入的数:";
			cin>>d6; 
			ArrayInsert(&L,d5,d6);
			break;
		}
		case 11:
		{
			if(success==0)
			{
				cout<<"请先进行初始化!!!"<<endl;
				break;
			}
				int d7;
				cout<<"请输入要删除的位置:";
				cin>>d7;
				ArrayDelete(&L,d7);
				break;
		}
		case 12:
		{
			if(success==0)
			{
				cout<<"请先进行初始化!!!"<<endl;
				break;
			}
			ArrayCout(&L); 
			break;
		}
		case 13:
		{
			MergeArray(&L1,&L2,&L3);
			ArrayCout(&L3);			
			break;
		}
	}
}
}

void CreatArray(SqList *L)//申请100个单元,length=0 
{
	L->elem =(int *)malloc(LIST_INIT_SIZE*sizeof(int));
	if(!L->elem)
	{
		cout<<"Failed to initialize!"<<endl;
	}
	L->length=0;
	L->listsize=LIST_INIT_SIZE;
	cout<<"Succeed in initializing!"<<endl;
	success=1; 
	
}

void DestroyArray(SqList *L){

		free(L->elem);//释放指向空间 
		L->elem=NULL;//使指针指向为0 
		L->length=0;
		L->listsize=0;
	if(!L->elem)
	{
		cout<<"Destroyed successfully!"<<endl;
		success=0; 
	}
}

void ClearArray(SqList &L)//清空线性表 
{

	L.length=0;
	cout<<"Cleared succeessfully!"<<endl;
	success=0;
}

int ArrayEmpty(SqList *L)//判断线性表是否为空 
{
	if(L->length==0)
	{
		return 0;
	}
	else
	{
		return 1;
	}
}

int IfEmptyList(SqList *L)
{

	if(L->length>0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

int ArrayLength(SqList *L)
{
		return L->length;	
}

int GetElem(SqList *L,int i,int &n)
{
	if(i<1||i>L->length)
	{
		cout<<"Position is incorrect!"<<endl;
		return 0;
	}
	else
	{
		n=L->elem[i-1];
		return 1;
	}
}

int LocateElem(SqList *L,int e)
{
	for(int i=0;i<L->length;i++)
	{
		if(e==L->elem[i])
		{
			return (i+1);
		}


	}
	cout<<"Element does not exist"<<endl;
	return 0;
}

int FormerElem(SqList *L,int e,int &f)
{
	int a=LocateElem(L,e);
		if(a==0)
		{
			cout<<"Location does not exist!"<<endl;
		}
		else if(a==1)
		{
			cout<<"Had no previous value!"<<endl;
		}
		else if(a>1&&a<=L->length)
		{
			f=L->elem[a-2];
			return 0;
		}
}

int LaterElem(SqList *L,int e,int &l)
{
	int a=LocateElem(L,e);
	if(a==0)
	{
		cout<<"Location does not exist!"<<endl;
	}
	else if(a==L->length)
	{
		cout<<"Had no later data!"<<endl;
	}
	else if(a>=1&&a<L->length)
	{
		l=L->elem[a];
		return 1;
	}
}

void ArrayInsert(SqList *L,int i,int e){
	if(!L->elem)
	{
		cout<<"List does not exist!"<<endl;
		return;
	}
	else
	{
		if(i<1||i>L->length+1)
		{
			cout<<"Wrong insertion position!"<<endl; 
		}
		else
		{
			for(int j=L->length-1;j>=i-1;j--)
			{
				L->elem[j+1]=L->elem[j];
			}
			L->elem[i-1]=e;
			L->length++;
		}
	}
} 

void ArrayDelete(SqList *L,int i)
{
	int a= ArrayEmpty(L);
	if(a==0)
	{
		cout<<"List does not exist!"<<endl;
	}
	else
	{
		int b=IfEmptyList(L);
		if(b==0)
		{
			cout<<"Empty list!"<<endl;
		}
	}
	if(i<1||i>L->length)
	{
		cout<<"Incorrect deletion position!"<<endl; 
	}
	else
	{
		for(int j=i-1;j<L->length;j++)
		{
			L->elem[j]=L->elem[j+1];
		}
			L->elem[L->length]=0;
			L->length--;
	}	
}

void ArrayCout(SqList *L)
{
	int a=ArrayEmpty(L);
	if(a==0)
	{
		cout<<"List does not exist!"<<endl;
	}
	else
	{
		for(int i=0;i<(L->length);i++)
		{
			cout<<L->elem[i]<<" ";
		}
		cout<<endl;
	}	
}

void MergeArray(SqList *L1,SqList *L2,SqList *L3)
{
	int i=1,j=1,k=0;
			int p,q;
	int L1_len=ArrayLength(L1); 
	int L2_len=ArrayLength(L2); 
	while((i<=L1_len)&&(j<=L2_len))
	{

		int L1_data=GetElem(L1,i,p);
		int L2_data=GetElem(L2,j,q);
		if(p<=q)
		{
			ArrayInsert(L3,++k,p);
			i++;
		}
		else
		{
			ArrayInsert(L3,++k,q);
			j++;
		}
	}
	while(i<=L1_len)
	{
		int L1_data=GetElem(L1,i++,p);
		ArrayInsert(L3,++k,p);
	}
	while(j<=L2_len)
	{
		int L2_data=GetElem(L2,j++,q);
		ArrayInsert(L3,++k,q);	
	}
}

void CreatArray1(SqList *L)
{
	L->elem=(int *)malloc(LIST_INIT_SIZE*sizeof(int));
	L->length=0;
	L->listsize=LIST_INIT_SIZE;
}

特别注意:
仅供参考学习,转载请附上原文链接
分享学习心得,如有侵权,望联系本人处理
还在读大学的程序员,项目经验少,如有纰漏,感谢指正
需要源代码请联系本人
谢谢配合

如果这篇文章对您有帮助,小小的点个赞,算是给小学弟的鼓励吧!谢谢大佬!!/呱呱.jpg

你可能感兴趣的:(数据结构,顺序表,数据结构,c++顺序表)