一、题目
编写一个程序sqlist.cpp,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型ElemType为char),并在此基础上设计一个主程序exp2-1.cpp完成如下功能:
(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
二、代码实现(C语言):
/**
编写一个程序sqlist.cpp,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型ElemType为char),并在此基础上设计一个主程序exp2-1.cpp完成如下功能:
(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
**/
#include<stdio.h>
#include<stdlib.h>
#define MAXLEN 100
#define LIST_INCREASE 10 //线性表存储空间的动态分配增量
typedef struct{
char *list; //线性表的存储空间的基地址
int length; //线性表的当前长度
int maxsize; //线性表当前分配的存储容量
}List_Sq;
// 顺序表的生成
List_Sq CreatList_S(){
//构造一个空的线性表L
List_Sq L;
L.list=(char *) malloc(MAXLEN*sizeof(char));
L.length=0; //初始化表的长度为0
L.maxsize=MAXLEN; //初始化表的存储容量
printf("顺序表L初始化完成\n");
return L; //初始化成功
}
//顺序表的插入
void ListInsert_S (List_Sq &L, int i, char e){
char *q;
char *p;
if(i<1 || i>L.length+1) printf("i为无效值,插入失败\n"); //若i为无效值,返回错误
q = &(L.list[i-1]); // 插入位置
for(p =&(L.list[L.length - 1]); p>=q; --p)
*(p+1) = *p; //将插入元素位置之后的元素依次后移一个位置
*q=e; //插入元素e
++ L.length; //线性表长度增加1
printf("%c插入成功\n",e);
}
//输出顺序表L中的元素
void ListPrint_S (List_Sq &L){
for (int i=0;i<L.length;i++){
printf("%c ",L.list[i]);
}
printf("\n");
}
//输出顺序表的长度
void ListLengthPrint_S (List_Sq &L){
printf("%d\n",L.length);
}
//判断顺序表是否为空
void ListIsEmpty(List_Sq &L){
if(L.length==0){
printf("顺序表为空\n");
}else{
printf("顺序表不为空\n");
}
}
//返回线性表中第i个元素值
void GetElem_S (List_Sq &L, int i){
char e;
if(i<1 || i>L.length){
printf("i为无效值");//若i为无效值,返回错误
}else{
e = L.list[i-1]; //通过参数e返回第i个元素值
printf("%c\n",e);
}
}
//在线性表中查找满足条件的元素
int LocateElem_S (List_Sq &L, char e){
int index = -1;
for(int i=0;i<L.length;i++){
if (L.list[i] == e){
index = i+1;
break;
}
}
return index;
}
//删除顺序表L的第i个元素
void ListDelete_S (List_Sq &L, int i){
char e;
char *q;
char *p;
if(i<1 || i>L.length) printf("i为无效值,删除失败\n"); //若i为无效值,返回错误
else{
p=&(L.list[i-1]); //被删元素的位置
e=*p; //通过e返回被删除的元素的值
q=L.list+ L.length-1; //线性表的最后一个元素的位置
for(++p; p<=q; ++p ) *(p-1) =*p; //被删除元素之后的元素依次前移
--L.length; //线性表长度减少1
printf("第%d个元素删除成功\n",i);//删除操作成功
}
}
//释放顺序表
void DestroyList(List_Sq &L) {//销毁线性表
if (L.list) { // 检查是否为空
delete[] L.list; // 删除分配的内存
L.list = NULL; // 基地址设为空
}
L.length = 0; // 表长设为0
L.maxsize = 0; // 表空间设为0
printf("顺序表L释放成功\n");
}
int main(){
//(1)初始化顺序表L
printf("(1)初始化顺序表L:");
List_Sq L = CreatList_S();
//(2)依次插入a,b,c,d,e元素
printf("(2)依次插入a,b,c,d,e元素:\n");
ListInsert_S (L, 1, 'a');
ListInsert_S (L, 2, 'b');
ListInsert_S (L, 3, 'c');
ListInsert_S (L, 4, 'd');
ListInsert_S (L, 5, 'e');
//(3)输出顺序表L
printf("(3)输出顺序表L:");
ListPrint_S(L);
//(4)输出顺序表L长度
printf("(4)输出顺序表L长度:");
ListLengthPrint_S(L);
//(5)判断顺序表L是否为空
printf("(5)判断顺序表L是否为空:");
ListIsEmpty(L);
//(6)输出顺序表L的第3个元素
printf("(6)输出顺序表L的第3个元素:");
GetElem_S(L,3);
//(7)输出元素a的位置
int index = 0;
printf("(7)输出元素a的位置:");
index = LocateElem_S(L,'a');
printf("元素a的位置为:%d\n",index);
//(8)在第4个元素位置上插入f元素
printf("(8)在第4个元素位置上插入f元素:");
ListInsert_S (L, 4, 'f');
//(9)输出顺序表L
printf("(9)输出顺序表L:");
ListPrint_S(L);
//(10)删除顺序表L的第3个元素
printf("(10)删除顺序表L的第3个元素:");
ListDelete_S(L,3);
//(11)输出顺序表L
printf("(11)输出顺序表L:");
ListPrint_S(L);
//(12)释放顺序表L
printf("(12)释放顺序表L:");
DestroyList(L);
return 0;
}