このブログ投稿は、Yan Weimin氏の著書「DataStructure」からのものです。今日実験2があるのを見て、すぐに書いてブログで共有しました。コードはClionコンパイラで完全に実行可能です。完全なトピックは次のとおりです。
記事ディレクトリ
トピックの複製
線形テーブル順序(少なくともアルゴリズム2.3、2.4、2.5)で表されるすべての操作を設計および検証するメインプログラムを作成し、値が最小より大きく最大より小さいすべての要素を削除するアルゴリズムを設計します。
トピック分析
- 2.3は線形テーブル挿入です
- 2.4は線形テーブルの削除です
- 2.5は線形テーブルルックアップです
- 私が自分で設計したのは削除機能です(2つの方法があります)
2.3線形テーブルの挿入
線形テーブル挿入は、値を逆方向に移動するプロセスです。本に従って書き込む必要があります。
Status ListInsert_Sq(SqList &L,int i,ElementType e){
if(i<1 || i>L.length+1) {
return ERROR;
}
if(L.length >= L.listsize){
ElementType * newbase = (ElementType *) realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElementType));
if(!newbase) exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
ElementType *q = &(L.elem[i-1]);
for(ElementType *p = &(L.elem[L.length-1]);p>=q;--p){
*(p+1) = *p;
}
*q = e;
++L.length;
return OK;
}
後ろから前にトラバースするだけです。
2.3線形テーブルの削除
前から後ろに削除
Status ListDelete_Sq(SqList &L,int i,ElementType &e){
if((i<1)|| (i>L.length)) return ERROR;
int* p = &(L.elem[i-1]);
e = *p;
int* q = L.elem + L.length - 1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
return OK;
}
2.5線形テーブルルックアップ
この値を直接見つけてください。最初から最後までトラバースするだけです。
Status compare(ElementType a,ElementType b){
return a==b?0:1;
}
int LocateElem_Sq(SqList L,ElementType e,Status (*compare)(ElementType,ElementType)){
int i = 1;
int* p = L.elem;
while(i<=L.length && !(*compare)(*p++,e)){
++i;
}
if(i<=L.length) return i;
else return 0;
}
2.6範囲を削除する独自の関数を設計する
この質問では、最初に通常のO(n ^ 2)複雑度を使用して計算し、次にそれを時空間のO(n)複雑度に置き換えたため、これら2つのアルゴリズムが1つずつ与えられます。2つ目はわかりやすいと思います。
Status Delete_minToMax(SqList &L,ElementType min,ElementType max){
while(1){
int flag = true;
int i;
for(i =0;i<L.length;i++){
if(L.elem[i]>min && L.elem[i]<max){
flag = false;
break;
}
}
for(int j= i+1;j<L.length;j++){
L.elem[j-1] = L.elem[j];
}
if(flag) break;
else L.length--;
}
return TRUE;
}
Status Delete_minToMax2(SqList &L,ElementType min,ElementType max){
SqList L_cp;
InitList_Sq(L_cp);
for(int i=0;i<L.length;i++){
if(L.elem[i]>min && L.elem[i]<max) continue;
L_cp.elem[L_cp.length++] = L.elem[i];
}
L.length = 0;
for(int i=0;i<L_cp.length;i++){
L.elem[L.length++] = L_cp.elem[i];
}
return TRUE;
}
2.7まとめ
トピックは全体として難しくありません。主な理由は、L.lengthを削除および減算するタイミングなど、いくつかの小さな詳細を個別に処理する必要があるためです。これらはすべて事前に考えられているので、質問はより速くなります。
完全なコード
#include<iostream>
#define ERROR -1
#define OVERFLOW -1
#define TRUE 1
#define OK 1
#define LISTINCREMENT 10
#define LIST_INIT_SIZE 100
typedef int Status;
typedef int ElementType;
using namespace std;
typedef struct{
ElementType *elem;
int listsize;
int length = 0;
}SqList;
//2.3
Status ListInsert_Sq(SqList &L,int i,ElementType e){
if(i<1 || i>L.length+1) {
return ERROR;
}
if(L.length >= L.listsize){
ElementType * newbase = (ElementType *) realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElementType));
if(!newbase) exit(OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
ElementType *q = &(L.elem[i-1]);
for(ElementType *p = &(L.elem[L.length-1]);p>=q;--p){
*(p+1) = *p;
}
*q = e;
++L.length;
return OK;
}
Status ListDelete_Sq(SqList &L,int i,ElementType &e){
if((i<1)|| (i>L.length)) return ERROR;
int* p = &(L.elem[i-1]);
e = *p;
int* q = L.elem + L.length - 1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
return OK;
}
Status compare(ElementType a,ElementType b){
return a==b?0:1;
}
int LocateElem_Sq(SqList L,ElementType e,Status (*compare)(ElementType,ElementType)){
int i = 1;
int* p = L.elem;
while(i<=L.length && !(*compare)(*p++,e)){
++i;
}
if(i<=L.length) return i;
else return 0;
}
Status InitList_Sq(SqList &L){
L.elem = (ElementType *)malloc(LIST_INIT_SIZE*sizeof(ElementType));
if(!L.elem) exit(OVERFLOW);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return OK;
}
//并设计一个算法删除所有值大于min而且小于max的元素。
/*Status Delete_minToMax(SqList &L,ElementType min,ElementType max){
while(1){
int flag = true;
int i;
for(i =0;i<L.length;i++){
if(L.elem[i]>min && L.elem[i]<max){
flag = false;
break;
}
}
for(int j= i+1;j<L.length;j++){
L.elem[j-1] = L.elem[j];
}
if(flag) break;
else L.length--;
}
return TRUE;
}*/
Status Delete_minToMax2(SqList &L,ElementType min,ElementType max){
SqList L_cp;
InitList_Sq(L_cp);
for(int i=0;i<L.length;i++){
if(L.elem[i]>min && L.elem[i]<max) continue;
L_cp.elem[L_cp.length++] = L.elem[i];
}
L.length = 0;
for(int i=0;i<L_cp.length;i++){
L.elem[L.length++] = L_cp.elem[i];
}
return TRUE;
}
int main(){
//test1:
SqList L;
int flag = InitList_Sq(L);
flag = ListInsert_Sq(L,1,1);
flag = ListInsert_Sq(L,1,2);
flag = ListInsert_Sq(L,1,3);
flag = ListInsert_Sq(L,1,4);
flag = ListInsert_Sq(L,1,5);
flag = ListInsert_Sq(L,1,6);
cout << "test1:" << endl;
for(int i=0;i<L.length;i++){
cout << L.elem[i] << " ";
}
cout << endl;
//test2:
int x;
flag = ListDelete_Sq(L,2,x);
cout << "test2:";
cout << endl << "Delete Element:" << x << endl;
for(int i=0;i<L.length;i++){
cout << L.elem[i] << " ";
}
//test3: find == 4
cout << endl << "test3: find4:" << endl;
int pos;
pos = LocateElem_Sq(L,4,compare);
cout << L.elem[pos] << endl;
//test4:delete 2 - 5
cout << "test4:" << endl <<"(2,5)Delete before:" << endl;
for(int i=0;i<L.length;i++){
cout << L.elem[i] << " ";
}
cout << endl << "after Deleted :" << endl;
/*flag = Delete_minToMax(L,2,5);*/
flag = Delete_minToMax2(L,2,5);
for(int i=0;i<L.length;i++){
cout << L.elem[i] << " ";
}
return 0;
}