目的:领会顺序表存储结构和掌握顺序表中各种基本运算算法设计。
内容:编写一个.cpp的程序,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型为 Elemtype char),并在此基础上设计一个主程序,完成如下功能:
(1)初始化顺序表L。
(2)依次插入a,b,c,d,e元素。
(3)输出顺序表L。
(4)输出顺序表L的长度。
(5)判断顺序表L是否为空。
(6)输出顺序表L的第3个元素。
(7)输出元素a的位置。
(8)在第4个元素位置上插入f元素。
(9)输出顺序表L。
(10)删除顺序表L的第3个元素。
(11)输出顺序表L。
(12)释放顺序表L。
code:
#include
#include
#include
#define Maxsize 100
typedef char Elemtype;
typedef struct{
Elemtype data[Maxsize];//存放顺序表元素
int length;//存放顺序表的长度
}Sqlist;//声明顺序表的类型
//整体建立顺序表
void CreatSqlist(Sqlist* &L,Elemtype a[],int n){
int i;
L=(Sqlist *)malloc(sizeof(Sqlist));
for(i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
}
//初始化线性表
void InitSqlist(Sqlist* &L){
L=(Sqlist *)malloc(sizeof(Sqlist));//分配存放线性表的空间
L->length=0;
}
//销毁线性表
void DestroySqlist(Sqlist* &L){
free(L);
}
//判断顺序表是否为空表
bool SqlistEmpty(Sqlist*L){
return (L->length==0);
}
/* TODO (#1#): SqSqlist */
//求线性表的长度
int Sqlistlength(Sqlist*L){
return(L->length);
}
//输出线性表
void DispSqlist(Sqlist*L){
int i;
for(i=0;i<L->length;i++)
printf("%c",L->data[i]);
printf("\n");
}
//求线性表中第i个元素值
bool GetElem(Sqlist*L,int i,Elemtype &e){
if(i<1||i>L->length)
return false;
e=L->data[i-1];
return true;
}
//查找第一个值域为e的元素序号
int Locate(Sqlist*L,Elemtype e){
int i=0;
while(i<L->length&&L->data[i]!=e)
i++;
if(i>=L->length)
return 0;
else
return i+1;
}
//插入第i个元素
bool SqlistInsert(Sqlist*&L,int i,Elemtype e){
int j;
if(i<1||i>L->length-1)
return false;
i--; //将顺序表位序转换为data[]下标
for(j=L->length;j>i;j--){//将data[i]及后面元素后移一个位置
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;//顺序表长度增1
return true;
}
}
//删除第i个元素
bool SqlistDelete(Sqlist*&L,int i,Elemtype &e){
int j;
if(i<1||i>L->length){
return false;
}
i--; //将顺序表位序转换为data[]下标
e=L->data[i];
for(j=i;j<L->length-1;j++){
L->data[j]=L->data[j+1];
L->length--;
}
return true;
}
int main(){
Sqlist *L;
char a[5]={0};
Elemtype e;
printf("顺序表的基本运算如下:\n");
printf("(1)初始化顺序表L\n");
InitSqlist(L);
CreatSqlist(L,a,5);
printf("(2)依次插入a,b,c,d,e元素\n");
SqlistInsert(L,1,'a');
SqlistInsert(L,2,'b');
SqlistInsert(L,3,'c');
SqlistInsert(L,4,'d');
SqlistInsert(L,5,'e');
printf("(3)输出顺序表L:"); DispSqlist(L);
printf("(4)输出顺序表L的长度%d\n",Sqlistlength(L));
printf("(5)判断顺序表L为%s\n",SqlistEmpty(L)?"空":"非空");
GetElem(L,3,e);
printf("(6)输出顺序表L的第3个元素%c\n",e);
printf("(7)输出元素a的位置为%d\n",Locate(L,'a'));
printf("(8)在第4个元素位置上插入f元素\n");
SqlistInsert(L,4,'f');
printf("(9)输出顺序表L:"); DispSqlist(L);
printf("(10)删除顺序表L的第3个元素\n");
SqlistDelete(L,3,e);
printf("(11)输出顺序表L:"); DispSqlist(L);
printf("(12)释放顺序表L\n");
DestroySqlist(L);
return 0;
}
附加code:
#include
#include
#define ERROR 0
#define TRUE 1
#define MAXSIZE 30 /*初始分配的顺序表长度*/
typedef int ElemType; /*定义表元素的类型*/
typedef struct {
ElemType elem[MAXSIZE]; /*存储空间的基地址*/
int length; /*顺序表的当前长度*/
}SeqList;
int Init_SeqList(SeqList *L); /*初始化顺序表*/
int Create_SeqList(SeqList *L,int n); /*创建顺序表*/
int Insert_SeqList(SeqList *L,int i,ElemType x);/*顺序表的插入操作*/
int Traverse_SeqList(SeqList *L); /*顺序表的遍历*/
int Delete_SeqList(SeqList *L,int i); /*顺序表的删除操作*/
int Locate_SeqList(SeqList *L,ElemType e); /*查找值为e的元素*/
int Init_SeqList(SeqList *L){
L=(SeqList *)malloc(sizeof(SeqList));
L->length=0; /*空表长度为0 *///填空
}/*InitList*/
int Create_SeqList(SeqList *L,int n){
ElemType x;
ElemType elem[MAXSIZE];
int i;
for(i=1; i<=n;i++){
printf("Please Input data %d: ",i);
scanf("%d",&x);
elem[i]=x;
if(!Insert_SeqList( L,i,x))
return ERROR;
}
return TRUE;
}/*CreateList*/
/*输出顺序表中的元素*/
int Traverse_SeqList(SeqList *L){//遍历
int i;
for(i=0;i<L->length;i++)
printf("%-7d",L->elem[i]);//填空
printf("\n");
}/*TraverseList*/
int Insert_SeqList(SeqList *L,ElemType x,int i){
int j;
if(i<1||i>L->length+1) //填空
return ERROR;
i--;
for(j=L->length;j>i;j--)
{
L->elem[j]= L->elem[j-1];
}
L->elem[i]=x;
L->length++;
return TRUE;
}/*ListInsert*/
/*在顺序表中删除第i个元素*/
int Delete_SeqList(SeqList *L,int i,ElemType e){
int j;
if(i<1||i>L->length)
return ERROR;
i--;
e=L->elem[i];
for(j=i+1;j<=L->length;j++)
L->elem[j-1]=L->elem[j];
L->length--;
return TRUE;
}
/*在顺序表中查找指定值元素,返回其序号*/
int Locate_SeqList(SeqList *L,ElemType e){
int i=1;
while (i<=L->length && L->elem[i]!=e)//填空
i++;
if (i==L->length+1) return ERROR;//填空
else return i;//填空
}
int main(){
SeqList *sl;
int n,m,k,o;
int x;
printf("**************************************************\n");
printf(" 顺 序 表 常 用 算 法\n");
printf("**************************************************\n\n");
sl=(SeqList *)malloc(sizeof(SeqList));
printf("1、初始化线性表:设置表长为0\n");
Init_SeqList(sl);
printf("顺序表初始化成功……\n\n");
printf("2、创建顺序表:\n");
do{
printf("请输入顺序表长度(n>=0):");
scanf("%d",&n); /*输入顺序表的元素个数*/
}while (n<0);
Create_SeqList(sl,n);
printf("顺序表创建成功……\n\n"); ;
printf("3、遍历顺序表:\n"); /*依次访问顺序表中所有元素*/
Traverse_SeqList(sl);
printf("4、顺序表的插入操作:\n");
printf("请输入待插入的数据及其位序(location,data):");
scanf("%d%d",&m,&k);
Insert_SeqList(sl,m,k);
printf("插入操作执行成功……\n操作结果:");
Traverse_SeqList(sl);
printf("5、顺序表的删除操作:\n");
printf("请输入待删除的数据(location,data):");
scanf("%d%d",&o,&x);
Delete_SeqList(sl,o,x);
printf("删除操作执行成功......\n操作结果:");
Traverse_SeqList(sl);
return 0;
}