• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

C++顺序表操作代码示范

OC/C/C++ 水墨上仙 1641次浏览

C++顺序表操作代码演示

/*
*建立一个顺序表,插入n个元素并输出
*Author :CplusHua PurpleHua
*Date:2012-10-06
*/
#include<iostream>
#include "malloc.h"
#include <stdio.h>
#define ElemType int //宏定义
#define LIST_INT_SIZE 10 //改为1,改用ListInsert增加空间
using namespace std;
//定义一个顺序表
struct  SqList{
	ElemType * elem;
	int length;
	int listsize;
}L={NULL,0,0};
//返回状态定义
//这里修改了课本里的宏定义,全部在一个enum中定义完毕,
//让所有的函数返回一个枚举类型的结果
enum Status
{
	OK,FAILED,EMPTY,NOTINIT,OVERFLOW1//OVERFLOW在visual studio无法使用,改为OVERFLOW1
};
//初始化一个顺序表,成功返回OK,n是申请空间的大小
Status InitList_Sq(SqList &L,int n=LIST_INT_SIZE)
{
	if(L.elem) free(L.elem);//如果已经建立顺序表,则释放重新建立
	if(0==n)return FAILED;
	L.elem=(ElemType *)malloc(n*sizeof(ElemType));//为指针申请空间
	if(!L.elem) exit(OVERFLOW1);
	L.length=0;
	L.listsize=n;
	return OK;
}
//在线性表第i个元素之前插入一个元素
Status ListInsert_Sq(SqList &L,int i,ElemType e)
{//如果LIST_INT_SIZE设置为100,则在此加入判断,L.lisesize>100时增加空间
	if(L.length<=0||i<=0)return FAILED;//空表,返回失败
	if(!L.elem) return NOTINIT;//顺序表未初始化
	if(i>L.length) return OVERFLOW1;//溢出,返回溢出(输入越界)
	if(L.length>=L.listsize)
	{
		//每插入一个元素重新申请增加空间
		ElemType *newbase=(ElemType *)realloc(L.elem,(L.listsize+1)*sizeof(ElemType));
		L.elem=newbase;
		L.listsize++;
	}
	int *p,*q;
	p=L.elem+L.length;//最后一个位置
	q=L.elem+i-1;//要插入元素的位置
	for(;p>q;p--)
		*p=*(p-1);
	*q=e;
	L.length++;
return OK;
}
//删除顺序表中的元素
Status ListDelete_Sq(SqList &L,int i,ElemType *e=0)
{
	if(L.length<0||i>L.length||i<=0) return FAILED;
	if(!L.elem) return NOTINIT;//顺序表未初始化
	if(0==L.length) return EMPTY;
	int *p;
	p=L.elem+i-1;//定位到要删除的元素位置
	if(e)
		*e=*p;//返回要删除元素的值
	for(;p<=L.elem+L.length;p++)
	{
		*p=*(p+1);
	}
	L.length--;
	return OK;
 
}
//要输入元素的线性表L,要输入的元素个数n
Status ListInput_Sq(SqList &L,int n)
{
	int *p=L.elem;
	for(int i=0;i<n;i++)
	{
		cin>>*(p++);
		L.length++;
	}
	return OK;
}
//顺序输出顺序表中的元素
Status ListOutput_Sq(SqList &L)
{
	if(!L.elem) return NOTINIT;//顺序表未初始化
	int *p;
	p=L.elem;
	cout<<"顺序表中的元素为:";
	for(int i=0;i<L.length;i++)
	{
		cout<<*(p++)<<" ";
	}
	cout<<endl;
	return OK;
}
//查找最大元素
Status ListMax_Sq(SqList &L,ElemType *e)
{
	if(!L.elem) return NOTINIT;//顺序表未初始化
	int max;
	int *p;
	p=L.elem;
	max=*p;
	for(int i=0;i<L.length;i++)
	{
		if(max<*p)
			max=*p;
		p++;//最后溢出了会怎样?
	}
	*e=max;
	return OK;
}
//升序排序
Status ListSort_Sq(SqList &L)
{
	if(!L.elem) return NOTINIT;//顺序表未初始化
	int tmp;
	int i,j;
	int *p;
	p=L.elem;
	for(i=0;i<L.length-1;i++)
	{
		for(j=0;j<L.length-i-1;j++)
		{
			if(*(p+j)>*(p+j+1))
			{
				tmp=*(p+j);
				*(p+j)=*(p+j+1);
				*(p+j+1)=tmp;
			}
		}
	}
	return OK;
}
//逆序(使用一个暂存空间)
Status ListRevorder_Sq(SqList &L)
{
	if(!L.elem) return NOTINIT;//顺序表未初始化
	int tmp;
	int *p;
	p=L.elem;
	for(int i=0;i<L.length/2;i++)
	{
		tmp=*(p+i);
		*(p+i)=*(p+L.length-i-1);
		*(p+L.length-i-1)=tmp;
	}
	return OK;
}
//逆序(不使用暂存空间)
Status ListRevorder1_Sq(SqList &L)
{
	if(!L.elem) return NOTINIT;//顺序表未初始化
	int *p;
	p=L.elem;
	for(int i=0;i<L.length/2;i++)
	{
		*(p+i)=(*(p+L.length-i-1))^(*(p+i));
		*(p+L.length-i-1)=(*(p+L.length-i-1))^(*(p+i));
		*(p+i)=(*(p+L.length-i-1))^(*(p+i));
	}
	return OK;
}
//主函数
int main()
{
	int opt;
   // SqList L;
   // L.elem=NULL;//初始化
	int i,res,e,n;
	n=0;
	while(1)
	{
 
		if(n)
		{
			while(getchar()!='\n'&&getchar()!=' ');
			while(getchar()!='\n'&&getchar()!=' ');
		}
		cout<<"************请输入您要进行的操作的编号************"<<endl<<endl;
		cout<<"1.建立一个顺序表,输入n个数字元素并输出"<<endl;
		cout<<"2.查找线性表中的最大元素并输出"<<endl;
		cout<<"3.在线性表的第i个元素前插入一个正整数x"<<endl;
		cout<<"4.删除线性表中的第j个元素"<<endl;
		cout<<"5.将线性表中的元素按升序排列"<<endl;
		cout<<"6.将线性表中的元素就地逆序(只允许用一个暂存单元)"<<endl;
		cout<<"7.将线性表中的元素就地逆序(不使用暂存单元)"<<endl;
		cout<<"8.退出"<<endl<<endl;
		cout<<"***************************************************"<<endl;
		cin>>opt;
		switch (opt)
		{
			case 1:
			cout<<"***************请输入要输入元素的个数**************"<<endl;
			cin>>n;
			InitList_Sq(L,n);//建立顺序表
			cout<<"*****************请输入线性表元素******************"<<endl;
			ListInput_Sq(L,n);//进入输入元素的函数
			ListOutput_Sq(L);//输出顺序表中的元素
			break;
			case 2:
			if(!L.elem)
			{
				cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
				break;
			}
			ListMax_Sq(L,&e);
			cout<<"最大元素为:"<<e<<endl;
			break;
			case 3:
			if(!L.elem)
			{
				cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
				break;
			}
			cout<<"请分别输入要插入的元素和要插入元素的位置"<<endl;
			cout<<"元素:";
			cin>>e;
			cout<<"位置:";
			cin>>i;
			ListInsert_Sq(L,i,e);
			ListOutput_Sq(L);//输出顺序表中的元素
			break;
			case 4:
			if(!L.elem)
			{
				cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
				break;
			}
			cout<<"请输入要删除的元素的位置"<<endl;
 
			cin>>i;//位置
			ListDelete_Sq(L,i,&res);
			cout<<"删除的元素为:"<<res<<endl;
			ListOutput_Sq(L);//输出顺序表中的元素
			break;
			case 5:
			if(!L.elem)
			{
				cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
				break;
			}
			ListSort_Sq(L);//升序排序
			ListOutput_Sq(L);//输出顺序表中的元素
			break;
			case 6:
			if(!L.elem)
			{
				cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
				break;
			}
			ListRevorder_Sq(L);//使用一个暂存空间逆序
			ListOutput_Sq(L);//输出顺序表中的元素
			break;
			case 7:
			if(!L.elem)
			{
				cout<<"顺序表未初始化,请初始化顺序表!"<<endl<<endl;
				break;
			}
			ListRevorder1_Sq(L);//不使用暂存空间逆序
			ListOutput_Sq(L);//输出顺序表中的元素
			break;
			case 8:
				return 0;
			default:
				cout<<"ERROR"<<endl;
		}
	}
	return 0;
}


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明C++顺序表操作代码示范
喜欢 (0)
加载中……