【データ構造】順次リニアテーブルC言語を記憶して実現する
4400 ワード
*ファイル名:順次保存する線形表
*基本操作:
*InitList(&L)/空の線形表Lを作成します.
*DestoryList(&L)//リニアテーブルの削除
*ClearList(&L)//リニアテーブルを空のテーブルにリセットする
*ListEmpty(L)//リニアテーブルの空き操作
*ListLength(L)//Lの要素の個数を返します.
*GetElem(L,i,&e)/検索してi番目の要素に戻ります.
*Locateelem(L,e,compre()//リニアテーブルで最初にcompreを満たす要素
*PriorElem(L,curcuue,&preue)//若cur_eは、線形表の要素であり、最初ではない場合はpre_を用いる.eその前駆に戻る
*NextElem(L,curcuue,&nextcuue)//若cur_eは、線形表の要素であり、最後ではない場合、pre_を用いる.eその後継を返します
*ListInsert(&L,i,e)//i番目の要素の前(i-2)に新しい要素eを挿入します.
*ListDelete(&L,i,&e)//Lのi番目の要素を削除し、eで値を返します.
*ListTraverse(L,visit()//各要素をvisit()で巡回
*次の二つの操作は、本で線形表に適用した例です.
*ユニオン(&La,Lb)//LbのうちLaに属さない要素をLaに挿入する
*MergeList(La,Lb,&Lc)//LaとLbが秩序よく並べられていて、彼らをLcに帰して秩序よく並べられていると仮定する.
*特徴:
*シーケンス構造の線形表は、ある位置の要素に直接アクセスできます.
*ただし、メモリ容量が足りないとメモリの再割り当てが必要ですので、面倒です.
*基本操作:
*InitList(&L)/空の線形表Lを作成します.
*DestoryList(&L)//リニアテーブルの削除
*ClearList(&L)//リニアテーブルを空のテーブルにリセットする
*ListEmpty(L)//リニアテーブルの空き操作
*ListLength(L)//Lの要素の個数を返します.
*GetElem(L,i,&e)/検索してi番目の要素に戻ります.
*Locateelem(L,e,compre()//リニアテーブルで最初にcompreを満たす要素
*PriorElem(L,curcuue,&preue)//若cur_eは、線形表の要素であり、最初ではない場合はpre_を用いる.eその前駆に戻る
*NextElem(L,curcuue,&nextcuue)//若cur_eは、線形表の要素であり、最後ではない場合、pre_を用いる.eその後継を返します
*ListInsert(&L,i,e)//i番目の要素の前(i-2)に新しい要素eを挿入します.
*ListDelete(&L,i,&e)//Lのi番目の要素を削除し、eで値を返します.
*ListTraverse(L,visit()//各要素をvisit()で巡回
*次の二つの操作は、本で線形表に適用した例です.
*ユニオン(&La,Lb)//LbのうちLaに属さない要素をLaに挿入する
*MergeList(La,Lb,&Lc)//LaとLbが秩序よく並べられていて、彼らをLcに帰して秩序よく並べられていると仮定する.
*特徴:
*シーケンス構造の線形表は、ある位置の要素に直接アクセスできます.
*ただし、メモリ容量が足りないとメモリの再割り当てが必要ですので、面倒です.
#include
#include
#include
typedef int ElemType; //
typedef int Status; // , 1, 0
#define OK 1
#define FAILED 0
#define TRUE 1
#define FALSE 0
#define LIST_INIT_SIZE 100 //
#define LIST_INC 10 //
typedef struct {
ElemType *elem; //
int length; // ( )
int listsize; //
}List, *L;
//
Status InitList(List &L){
L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
if(!L.elem){
printf("malloc failed
");
return FAILED;
}
L.length = 0; //
L.listsize = LIST_INIT_SIZE; //
return OK;
}//InitList
//
Status DestoryList(List &L){
free(&L);
return OK;
}//DestoryList
//
// 0
Status ClearList(List &L){
for(int idx = 0; idx < L.length; idx++){
L.elem[idx] = 0;
}
return OK;
}
//
Status ListEmpty(List L){
if(L.length == 0){
return TRUE; //
} else if(L.length == 1){
return FALSE; //
}
}
// L
int ListLength(List L){
return L.length;
}
// i
ElemType GetElem(List L, int i){
if(L.length < i){
printf("Get error
");
return -1;
}
return L.elem[i];
}
// e ,
// -1
int LocateElem(List L, ElemType e){
if(ListEmpty(L) == TRUE){
//
printf("the list is empty
");
return -1;
}
for(int idx = 0; idx= L.length){ //
printf("e has no next in ths list
");
} else {
return (idx+1);
}
}
}
printf("can not find next of e
");
return -1;
}
//
// i , i i
Status ListInsert(List &L, ElemType e, int i){
if(i > L.length){ // ,
printf("insert error
");
return FAILED;
}
if(L.length >= L.listsize){ // ,
ElemType* newBase = (ElemType *)realloc(L.elem, (L.listsize+LIST_INC)*sizeof(ElemType));
if(!newBase){
printf("realloc failed
");
return FAILED;
}
L.elem = newBase;
L.listsize += LIST_INC;
}
if(i == L.length){ // ,
L.elem[i] = e;
return OK;
}
for(int idx = L.length-1; idx>=i; idx--){
L.elem[idx] = L.elem[idx+1];
}
L.elem[i] = e;
L.length++;
return OK;
}
// i , e
//
Status ListDelete(List &L, int i, ElemType &e){
if(i >= L.length){
printf("there is no such elem
");
return FAILED;
}
e = L.elem[i];
for(int idx = i+1; idx