c言語実現シーケンスチェーンテーブル
18172 ワード
注意事項:要素個数を変更するとlenth が更新される要素を追加する場合、表が であるかどうかを確認します.挿入、削除時に位置が合法かどうかを検査する .はアドレスを取る記号でできるだけ使うことができて、コードは簡潔です ライブラリ関数reallocの使い方 原理分析:SqList構造体変数は1つのポインタの頭部を提供するだけで、残りの操作はすべて関数によって完成する.
出力:
#include
#include
#include
#define ElemType int
#define List_Init_Size 100
#define List_Increament 10
#define OK 1
typedef struct {
ElemType *elem;//
int lenth;
int listsize;
}SqList;
int InitList_Sq(SqList &L) //
{
L.elem = (ElemType *)malloc(List_Init_Size*(sizeof(ElemType)));
if(!L.elem)exit(-1);
L.lenth = 0;
L.listsize = 0;
return OK;
}
ElemType GetElem_Sq(SqList L,int i){ //
return L.elem[i-1];
}
int ListInsert_Sq(SqList &L,int i,ElemType e){ //
if((i<1)||(i>L.lenth+1)) exit(-1); //
if(L.lenth>=L.listsize){ //
ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize+List_Increament)*sizeof(ElemType));
if(!newbase)exit(-1);
L.elem = newbase;
L.listsize += List_Increament;
}
// ,
ElemType *p = NULL;
for(p = &L.elem[L.lenth-1];p>=&L.elem[i-1];p--) *(p+1) = *p;
L.elem[i-1] = e;
L.lenth++;
return OK;
}
int ListAppend_Sq(SqList &L,ElemType e){ //
if(L.lenth>=L.listsize){ //
ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize+List_Increament)*sizeof(ElemType));
if(!newbase)exit(-1);
L.elem = newbase;
L.listsize +=List_Increament;
}
L.elem[L.lenth] = e;
L.lenth++;
return OK;
}
int ListDelete_Sq(SqList &L,int i,ElemType e){ //
if((i<1)||(i>L.lenth))exit(-1); //
e = L.elem[i-1];
ElemType *p = NULL;
for(p = &L.elem[i];p <= &L.elem[L.lenth-1];p++) *(p-1) = *p;
L.lenth--;
return OK;
}
void ListPrint_Sq(SqList L)
{
for(int i = 0;i<L.lenth;i++)
{
printf(" %d %d
",i+1,L.elem[i]);
}
}
main()
{
SqList L;
ElemType e;
InitList_Sq(L);
ListInsert_Sq(L,1,23);
ListAppend_Sq(L,16);
ListInsert_Sq(L,2,15);
ListDelete_Sq(L,2,e);
ListPrint_Sq(L);
}
出力:
1 23
2 16