线性表的顺序储存及运算实现-------------顺序表

//////////////////////////////////////////////////////////////////////////////// //线性表的顺序储存及运算实现————-顺序表 #include <iostream> //#include <stdlib> using namespace std; #define MAXSIZE 100 #define N 30 #define M 40 //若是其他的数据类型,直接修改这里就可以了 typedef int DataType ; ///////////////////////////////////////////////////////////////////////////////// //顺序表的定义 typedef struct node { DataType data[MAXSIZE]; int length; //顺序表最后一个单元,表示数据长度 } SeqList ; //定义指针,实现信息的回送 typedef SeqList* PSeqList; ///////////////////////////////////////////////////////////////////////////////// //顺序表基本运算的实现 //——————————————————————————– //顺序表的初始化 PSeqList Init_SeqList() { //返回一个指向顺序表的指针,指针为NULL表示分配空间失败 PSeqList SeqListPoint=new SeqList; //若分配成功,设置空表,否则返回NULL if(SeqListPoint) { SeqListPoint->length=0; return SeqListPoint; } else { cout<<“分配空间失败!”<<endl; return NULL; } } PSeqList Init_SeqList(DataType dataArray[],int dataArraySize) { //返回一个指向顺序表的指针,指针为NULL表示分配空间失败 PSeqList SeqListPoint=new SeqList; //若分配成功,设置空表,否则返回NULL if(SeqListPoint) { if(dataArraySize>MAXSIZE) { cout<<“填充顺序表数据大于最大存放数据,无法完成填充!”<<endl; return NULL; } for(int i=0;i<dataArraySize;i++) { SeqListPoint->data[i]=dataArray[i]; } SeqListPoint->length=dataArraySize; return SeqListPoint; } else { cout<<“分配空间失败!”<<endl; return NULL; } } //顺序表的销毁 bool Destory_SeqList(PSeqList* SeqListPoint) { //要销毁顺序表指针的地址,无返回值 if(*SeqListPoint) { delete(*SeqListPoint); //*SeqListPoint=NULL; return true; } else return false; } //求顺序表的长度 int Length_SeqList(PSeqList SeqListPoint) { //入口参数:顺序表指针,返回表长,-1表示表不存在 if(SeqListPoint) { return (SeqListPoint->length); } else { cout<<“表不存在!”<<endl; return -1; } } //输出顺序表数据元素 void PrintData_SeqList(PSeqList SeqListPoint) { //入口参数:顺序表指针 if(!SeqListPoint) { cout<<“表不存在!”<<endl; return ; } if(SeqListPoint->length==0) { cout<<“表中无元素!”<<endl; return ; } for(int i=0;i<SeqListPoint->length;i++) { cout<<SeqListPoint->data[i]<<” “; } cout<<endl; return ; } //顺序表的检索(查找)操作 int Location_SeqList(PSeqList SeqListPoint ,DataType dataX) { //入口参数:要查找的顺序表指针,检索的数据,返回值:-1(表不存在),0(失败) int i; if(!SeqListPoint) { cout<<“表不存在!”<<endl; return -1; } else { for(i=0;i<SeqListPoint->length;i++) { if(SeqListPoint->data[i]==dataX) { return (i+1); } } if(i==SeqListPoint->length) { cout<<“查找失败!”<<endl; } return 0; } } //顺序表的插入操作 int InsertData_SeqList(PSeqList SeqListPoint,int i , DataType dataX) { //入口参数:顺序表指针,插入位置,插入的元素。返回标志1成功,0插入位置不合法,-1溢出,-2表示表不存在 if(!SeqListPoint) { cout<<“表不存在”<<endl; return -2; } if( i<=0 || i >MAXSIZE) { cout<<“插入位置不合法!”<<endl; return 0; } for(int j=SeqListPoint->length-1;j>=i-1;j–) { SeqListPoint->data[j+1]=SeqListPoint->data[j]; // 注意:一定不能是j++,而必须是j+1 } SeqListPoint->data[i-1]=dataX; SeqListPoint->length++; if(SeqListPoint->length>MAXSIZE) { cout<<“表满,溢出!”<<endl; return -1; } return 1; } //顺序表的删除运算 int Del_SeqList(PSeqList SeqListPoint,int i) { //入口参数:顺序表指针,删除元素的位置。返回参数:1成功,0删除位置不合法,-1表不存在 if(!SeqListPoint) { cout<<“表不存在!”<<endl; return -1; } if(i<0||i>SeqListPoint->length) { cout<<“删除位置不合法!”<<endl; return 0; } for(int j=i-1;j<=SeqListPoint->length-1;j++) { SeqListPoint->data[j]=SeqListPoint->data[j+1]; // 注意:一定不能是j++,而必须是j+1 } SeqListPoint->length–; return 1; } //对顺序表数据元素降序排列 int SortDec_SeqList(PSeqList SeqListPoint) { //入口参数:顺序表指针,成功返回1,表不存在返回-1。 if(!SeqListPoint) { cout<<“表不存在!”<<endl; return -1; } //用选择法排序 for(int i=0;i<SeqListPoint->length-1;i++) { DataType Temp; DataType MAX=SeqListPoint->data[i]; int iMAX=i; for(int j=i+1;j<SeqListPoint->length;j++) { if(SeqListPoint->data[j]>MAX) { MAX=SeqListPoint->data[j]; iMAX=j; } } Temp=SeqListPoint->data[iMAX]; SeqListPoint->data[iMAX]=SeqListPoint->data[i]; SeqListPoint->data[i]=Temp; } return 1; } //对顺序表数据元素升序排列 int SortInc_SeqList(PSeqList SeqListPoint) { //入口参数:顺序表指针,成功返回1,表不存在返回-1。 if(!SeqListPoint) { cout<<“表不存在!”<<endl; return -1; } //用选择法排序 for(int i=0;i<SeqListPoint->length-1;i++) { DataType Temp; DataType MIN=SeqListPoint->data[i]; int iMIN=i; for(int j=i+1;j<SeqListPoint->length;j++) { if(SeqListPoint->data[j]<MIN) { MIN=SeqListPoint->data[j]; iMIN=j; } } Temp=SeqListPoint->data[iMIN]; SeqListPoint->data[iMIN]=SeqListPoint->data[i]; SeqListPoint->data[i]=Temp; } return 1; } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //顺序表应用举例 //——————————————————————————————- // 1、 将一线性表逆置,有一线性表的顺序表示(a1,a2,a3,…..an),设计一算法将该线性表逆置为逆线性表(an,an-1,….a3,a2,a1),要求用 // 最小辅助空间 int Reverse_SeqList(PSeqList SeqListPoint) { //入口参数:一顺序表指针。返回值:1成功,-1表不存在,0为空表 if(!SeqListPoint) { cout<<“表不存在!”<<endl; return -1; } if(SeqListPoint->length==0) { cout<<“为空表!”<<endl; return 0; } for(int i=0;i<=(SeqListPoint->length/2);i++) //注意不是length+1/2; { DataType Temp; Temp=SeqListPoint->data[i]; SeqListPoint->data[i]=SeqListPoint->data[SeqListPoint->length-1-i]; //注意是length-1-i SeqListPoint->data[SeqListPoint->length-i-1]=Temp; } return 1; } // 2. 有顺序表A和B,其元素均按从小到大升序排列,编写一算法将他们合并成一个表C,要求C的元素也是从小到大排列 int Merge_SeqList(PSeqList SeqListPointA,PSeqList SeqListPointB,PSeqList SeqListPointC) { //入口参数:顺序表A,B,C指针。返回值,-1A或B表不存在,-2C溢出,1成功 //算法思想:依次扫描AB,并比较它们的大小,将他们较小值赋值给C if(!SeqListPointA || !SeqListPointB) { cout<<“A或B表不存在!”<<endl; return -1; } if(SeqListPointA->length+SeqListPointB->length>MAXSIZE) { cout<<“溢出!”<<endl; return -2; } SortInc_SeqList(SeqListPointA); SortInc_SeqList(SeqListPointB); //应想对他们进行升序排列 int i=0,j=0,k=0; //循环比较 while(i<=SeqListPointA->length-1&&j<=SeqListPointB->length-1) { if(SeqListPointA->data[i] < SeqListPointB->data[j]) { SeqListPointC->data[k++]=SeqListPointA->data[i++]; } else { SeqListPointC->data[k++]=SeqListPointB->data[j++]; } } //将余下的部分直接赋值给表C while(i<SeqListPointA->length) { SeqListPointC->data[k++]=SeqListPointA->data[i++]; } while(j<SeqListPointB->length) { SeqListPointC->data[k++]=SeqListPointB->data[j++]; } //k的值即为表长 SeqListPointC->length=k; return 1; } // 3. 约瑟夫问题:设由n个人围坐在一个圆桌周围,现从第S个人开始从1报数,数到m的人出列,然后从出来的下一个从新开始从1报数,数到m的人 //在出列。。。。。如此反复,直到所有的人都出列,求出出列的次序。 要求用顺序表求解。 //=========================================================================================================================

点赞