順序表の記憶構造を理解し、順序表における各種基本演算アルゴリズムの設計をマスターする
シーケンステーブルの各種基本操作とテーブル全体の構築アルゴリズムを実現します(シーケンステーブルの要素型ElemTypeがcharであるものとします)
プログラム要件:
1. シーケンステーブル L を初期化します。
2. A、B、C、D、E 要素を順番に挿入します。
3. シーケンステーブル L を出力します。
4. シーケンステーブル L の長さを決定します。
5. シーケンスリスト L が空リストかどうかを判定します。
6. ユーザの入力位置に従って、対応するシーケンスリスト L の要素を出力します。
7. ユーザーが入力した要素に従って、対応するシーケンス テーブル内の L 要素の位置を出力します。
ユーザが入力した位置および要素に従って、新しい要素をシーケンステーブルLに挿入する。
9. シーケンステーブルLを出力します。
ユーザが入力した位置に従って、シーケンステーブルL内の対応する要素を削除する; 10.
シーケンステーブルLを出力する; 11.
リリースシーケンステーブルL;12.
-------------------------------------------------- -------------------------------------------------- ---------------
知らせ:
1. ElemType eとElemType &eの違い
2. 論理シリアル番号と物理シリアル番号の変換に注意してください
-------------------------------------------------- --------------------------------------------
線形テーブルの構造タイプを定義します
#include <iostream.h>
#define MaxSize 100
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
} SqList; //定义线性表结构体类型
1. 線形テーブル関数の初期化
//初始化线性表
void InitList(SqList *&L) //引用型指针
{
L= new SqList; /*分配存放线性表的空间*/
L->length=0;
}
2. 線形テーブル関数を作成する
//建立线性表
void CreateList(SqList *&L,ElemType a[],int n)
{
for (int i=0;i<n;i++)
L->data[i]=a[i];
L->length=n;
}
3. 線形テーブル関数を破壊する
//销毁线性表
void DestroyList(SqList *&L)
{
delete L;
}
4. 線形テーブルが空のテーブル関数であるかどうかを判断します。
線形テーブルが空のテーブルの場合は true を返します
線形テーブルが空のテーブルでない場合は false を返します
//判定是否为空表
bool ListEmpty(SqList *L)
{
return(L->length==0);
}
5. 線形テーブルの長さ関数を求める
//求线性表的长度
int ListLength(SqList *L)
{
return(L->length);
}
6. 出力線形テーブル関数
void DispList(SqList *L)
{
if (ListEmpty(L))
return;
for (int i=0;i<L->length;i++)
cout<<L->data[i]<<" ";
cout<<endl;
}
7. データ要素の値を見つける
このとき、i は論理シーケンス番号です。
i-1経由で物理シリアル番号に変換
//求某个数据元素值
bool GetElem(SqList *L,int i,ElemType &e)
{
if (i<1 || i>L->length)
return false;
e=L->data[i-1];
return true;
}
8. 要素値による検索
//按元素值查找
int LocateElem(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;
}
9. データ要素の挿入
//插入数据元素
bool ListInsert(SqList *&L,int i,ElemType e)
{
if (i<1 || i>L->length+1)
return false;
i--; /*将顺序表逻辑位序转化为elem下标即物理位序*/
for (int j=L->length;j>i;j--)/*将data[i]及后面元素后移一个位置*/
L->data[j]=L->data[j-1];
L->data[i]=e; //将新元素插入该位置
L->length++; /*顺序表长度增1*/
return true;
}
10. データ要素の削除
//删除数据元素
bool ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if (i<1 || i>L->length)
return false;
i--; /*将顺序表逻辑位序转化为elem下标即物理位序*/
e=L->data[i];
for (j=i;j<L->length-1;j++) L->data[j]=L->data[j+1];
/*将data[i]之后的元素前移一个位置*/
L->length--; /*顺序表长度减1*/
return true;
}
-------------------------------------------------- --------------------------------------------
メイン機能
ListInsert 関数または CreateList 関数を使用してテーブルを作成できます。
void main()
{
SqList *L1;
cout<<"1.初始化顺序表:"<<endl;InitList(L1);
cout<<"\n2.尾插法建表:"<<endl;
ElemType a[5]={'A','B','C','D','E'};
for(int i=0;i<5;i++)
if(!ListInsert(L1,i+1,a[i]))
cout<<"插入失败!";
cout<<"\n3.顺序表的元素为:";
DispList(L1);
cout<<"\n4.该顺序表的长度为:"<<ListLength(L1)<<endl;
cout<<"\n5.该顺序表";
if(ListEmpty(L1))
cout<<"为空!"<<endl;
else
cout<<"不为空!"<<endl;
cout<<"\n6.取元素";
ElemType temp;cout<<"请输入取的位置:";int k;cin>>k;
if(GetElem(L1,k,temp))
cout<<"取值成功,该顺序表的第"<<k<<"个元素的值为:"<<temp<<endl;
else
cout<<"取值失败,你输入的位置"<<k<<"越界:"<<endl;
cout<<"\n7.查找元素:"<<endl<<"请输入查找元素的值:";cin>>temp;
if(LocateElem(L1,temp))
cout<<"输出元素'"<<temp<<"'的位置为:"<<LocateElem(L1,temp)<<endl;
else
cout<<"元素'"<<temp<<"'不存在."<<endl;
cout<<"\n8.在顺序表指定位置插入元素 :"<<endl;
cout<<"请输入插入的位置:";cin>>k;
cout<<"请输入插入元素的值:";cin>>temp;
if(ListInsert(L1,k,temp))
cout<<"插入成功"<<endl;
else
cout<<"插入失败!"<<endl;
cout<<"\n9.输出顺序表"<<endl;
DispList(L1);
cout<<"\n10.删除顺序表指定位置的元素"<<endl;
cout<<"请输入删除的位置:";cin>>k;
if(ListDelete(L1,k,temp))
cout<<"删除成功,删除的元素为:"<<temp<<endl;
else
cout<<"删除失败!"<<endl;
cout<<"\n11.输出顺序表"<<endl;
DispList(L1);
cout<<"\n12.释放顺序表"<<endl;
DestroyList(L1);
}