顺序表的存储结构如下:
typedef struct
{
ElemType *elem;
int length;
int listsize;
}SqList;
顺序表的初始化如下:
void InitList_Sq(SqList &L)
{
//构造一个空的线性表L
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
//LIST_INIT_SIZE表示顺序表所能容纳元素的个数
if(!L.elem)
{
exit(1); //存储分配失败
}
L.length = 0; //空表长度为0
L.listsize = LIST_INIT_SIZE; //初始存储容量
}
创建顺序表如下:根据提示输入要创建的顺序表的元素个数,再根据提示输入每个元素的值。
void Creat_Sq(SqList &L)
{
int i,n;
cout<<"请输入顺序表的元素个数:";
cin>>n;
for(i=0;i<n;i++)
{
cout<<"请输入第 "<<(i+1)<<" 个元素:";
cin>>L.elem[i];
L.length++;
}
}
输出顺序表中的元素:
void Show_Sq(SqList L)
{
for(int i=0;i<L.length;i++)
{
cout<<L.elem[i]<<" ";
}
cout<<endl;
}
向顺序表的指定位置插入元素:
void ListInsert_Sq(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1)
{
cout<<"i值不合法"<<endl;
}
if(L.length>=L.listsize)
{
newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
q = &(L.elem[i-1]);
for(p = &(L.elem[L.length-1]);p>=q;--p)
{
*(p+1) = *p;
}
*q = e;
++L.length;
}
删除顺序表指定位置元素:
void ListDel_Sq(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1)
{
cout<<"i值不合法"<<endl;
}
q = &(L.elem[L.length-1]);
for(p=&(L.elem[i-1]);p<=q;p++)
{
*p=*(p+1);
}
e=*q;
--L.length;
}
更新顺序表指定位置元素的值:
void ListUpdate_Sq(SqList &L,int i,ElemType e)
{
if(i<1||i>L.length+1)
{
cout<<"i值不合法"<<endl;
}
L.elem[i-1] = e;
}
完整版代码如下:注意函数返回值有做修改
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef int ElemType;
typedef int Status;
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
ElemType * newbase,*p,*q;
//顺序表的结构描述
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
//顺序表的初始化
Status InitList_Sq(SqList &L){
//构造一个空的线性表L
L.elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW); //存储分配失败
L.length = 0; //空表长度为0
L.listsize = LIST_INIT_SIZE; //初始存储容量
return OK;
}//InitList_Sq
//顺序表的建立
void Creat_Sq(SqList &L){
int i,n;
cout<<"请输入顺序表的元素个数:";
cin>>n;
for(i=0;i<n;i++){
cout<<"请输入第 "<<(i+1)<<" 个元素:";
cin>>L.elem[i];
L.length++;
}
}
//顺序表的显示
void Show_Sq(SqList L){
for(int i=0;i<L.length;i++){
cout<<L.elem[i]<<" ";
}
cout<<endl;
}
//顺序表的插入
Status ListInsert_Sq(SqList &L,int i,ElemType e){
if(i<1||i>L.length+1){
cout<<"i值不合法"<<endl;
return ERROR;
}
if(L.length>=L.listsize){
newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
q = &(L.elem[i-1]);
for(p = &(L.elem[L.length-1]);p>=q;--p){
*(p+1) = *p;
}
*q = e;
++L.length;
return OK;
}
//顺序表的删除
Status ListDel_Sq(SqList &L,int i,ElemType e){
if(i<1||i>L.length+1){
cout<<"i值不合法"<<endl;
return ERROR;
}
q = &(L.elem[L.length-1]);
for(p=&(L.elem[i-1]);p<=q;p++){
*p=*(p+1);
}
e=*q;
--L.length;
return OK;
}
//顺序表的修改
Status ListUpdate_Sq(SqList &L,int i,ElemType e){
if(i<1||i>L.length+1){
cout<<"i值不合法"<<endl;
return ERROR;
}
L.elem[i-1] = e;
return OK;
}
int ListLocate_Sq(SqList L, ElemType e)
{
int a = -1;//给a赋初值,无论查找的数据在第几个,都不可能是第-1个,所以赋值-1
for(int i = 0;i <= L.length -1;i++)
{
if(L.elem[i] == e)
{
a = i;
break;
}
}//for循环进行查找
if(a >= 0&&a <= L.length -1)
return a + 1;//如果a的值满足要求,则返回a
else
return ERROR;//如果a不满足,则返回错误。
}
int GetElem_Sq(SqList L,int i)
{ if(i>L.length||i<=0)
cout<<"输入非法"<<endl;
else
return L.elem[i-1];
}
int Length_Sq(SqList L)
{
return L.length;
}
bool Empty_Sq(SqList L)
{
if(L.length==0)
return true;
else
return false;
}
int main()
{
SqList L;
InitList_Sq(L);
Creat_Sq(L);
Show_Sq(L);
int num=0,i;
ElemType e;
bool flag = true;
while(flag){
cout<<"1.插入 "<<"2.删除 "<<"3.修改 "<<"4.返回指定元素所在的位置"<<"5.返回指定位置元素的值"<<"6.返回顺序表的长度"<<"7.判断线性表是否为空"<<endl;
cout<<"请输入要执行操作的序号:";
cin>>num;
if(num>=1&&num<=7){
flag=false;
}else{
cout<<"输入非法"<<endl;
}
}
switch(num){
case 1 :
{
cout<<"请输入要插入的位置:";
cin>>i;
cout<<"请输入要插入的数:";
cin>>e;
ListInsert_Sq(L,i,e);
}break;
case 2 :
{
cout<<"请输入要删除的位置:";
cin>>i;
ListDel_Sq(L,i,e);
}break;
case 3 :
{
cout<<"请输入要修改的位置:";
cin>>i;
cout<<"请输入修改成的数:";
cin>>e;
ListUpdate_Sq(L,i,e);
}break;
case 4 :
{
cout<<"请输入元素值:";
cin>>i;
cout<<ListLocate_Sq(L,i)<<endl;
}break;
case 5 :
{
cout<<"请输入位置值:";
cin>>i;
cout<< GetElem_Sq(L,i)<<endl;
}break;
case 6 :
{
cout<<Length_Sq(L)<<endl;
}break;
case 7 :
{
cout<<Empty_Sq(L)<<endl;
}break;
}
Show_Sq(L);
return 0;
}