リニアテーブルのシーケンスストレージC++コード実装
5966 ワード
線形表の概念について、などの関連説明は『大話データ構造』第3章の内容を参照してください.
1コンセプト
線形表
線形表には2つの記憶構造があり、順序記憶構造とチェーン記憶構造があり、線形表に対する操作には、初期化、判空、クリア、要素の検索(戻り要素と戻り要素の位置)、挿入、削除、線形表の長さなどが含まれている.
2コード
コードは3つのファイルに分けられ、1つのヘッダファイル、2つのcppファイル、
ヘッダファイル
不適切な点をご指摘ください.
転載先:https://www.cnblogs.com/MisterXu/p/11173044.html
1コンセプト
線形表
list
:ゼロまたは複数のデータの有限シーケンス.ひょうたんは食べたことがあるでしょう.それは線形表に相当し、サンザシごとに線形表のデータに相当します.(これはリニア・テーブルのシーケンス・ストレージ構造に似ています)線形表には2つの記憶構造があり、順序記憶構造とチェーン記憶構造があり、線形表に対する操作には、初期化、判空、クリア、要素の検索(戻り要素と戻り要素の位置)、挿入、削除、線形表の長さなどが含まれている.
2コード
コードは3つのファイルに分けられ、1つのヘッダファイル、2つのcppファイル、
sqlist.h
ヘッダファイル、線形テーブル順序記憶構造、関数の宣言、マクロ定義などを実現し、そのうちの1つのsqlist.cpp
ファイルは線形テーブルに対する操作を実現し、もう1つのsqlist_main.cpp
ファイルはテスト機能を実現する. 以下のコードはvs 2013で親測で有効であるヘッダファイル
sqlist.h
#ifndef _SQLIST_H
#define _SQLIST_H
#define MAXSIZE 10
#define LISTINSREMENT 2
#define OK 1
#define ERROR 0
#define FALSE 0
#define TRUE 1
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *elem;
int length;//
int listsize;// ( sizeof(ElemType) )
}Sqlist;
Status InitList(Sqlist* L);
Status DestroyList(Sqlist* L);
Status ListEmpty(Sqlist L);
Status CleanList(Sqlist* L);
int ListLength(Sqlist L);
Status ListInsert(Sqlist* L, int i, ElemType e);
Status ListDelete(Sqlist* L, int i, ElemType* e);
Status GetElem(Sqlist* L, int i, ElemType *e);
Status LocateElem(Sqlist L, ElemType e);
#endif
sqlist.cpp
ファイル#include "sqlist.h"
#include
#include
using namespace std;
/*init sqlist*/
Status InitList(Sqlist* L)
{
(*L).elem = (ElemType*)malloc(MAXSIZE * sizeof(ElemType));
assert(NULL != (*L).elem);
(*L).length = 0;
(*L).listsize = MAXSIZE;
return OK;
}
//destroy list
Status DestroyList(Sqlist* L)
{
free((*L).elem);
(*L).elem = NULL;
(*L).length = 0;
(*L).listsize = 0;
return OK;
}
//list is empty return true
Status ListEmpty(Sqlist L)
{
if (0 == L.length)
return TRUE;
else
return FALSE;
}
//clean list
// :
Status CleanList(Sqlist* L)
{
if (NULL != (*L).elem)
{
(*L).length = 0;
return OK;
}
else
return ERROR;
}
//return list length
int ListLength(Sqlist L)
{
if (NULL != L.elem)
{
return L.length;
}
else
return ERROR;
}
//insert elem
// :
//1 i
//2 , ,
//3 , i
// i , 1
Status ListInsert(Sqlist* L, int i, ElemType e)
{
ElemType *newbase = NULL, *p = NULL, *q = NULL;
if (NULL != (*L).elem)//
{
assert(!(i < 1 || i >(*L).length + 1));// i
if ((*L).listsize <= (*L).length)//
{
newbase = (ElemType*)realloc((*L).elem, (((*L).listsize + LISTINSREMENT) * sizeof(ElemType)));
assert(NULL != newbase);
(*L).elem = newbase;
(*L).listsize += LISTINSREMENT;
}
q = (*L).elem + i - 1;//
for (p = (*L).elem + (*L).length - 1; p >= q; p--)// i
{
*(p + 1) = *p;
}
*q = e;
(*L).length++;
return OK;
}
else
return ERROR;
}
//delete elem
// :
//i
// i
Status ListDelete(Sqlist* L, int i, ElemType* e)
{
ElemType *p = NULL;
if (NULL != (*L).elem)
{
assert(!(i < 1 || i >(*L).length));
p = (*L).elem + i - 1;
*e = *p;
for (p; p < (*L).elem + (*L).length - 1; p++)
{
*p = *(p + 1);
}
(*L).length--;
return OK;
}
else
return ERROR;
}
//get elem
// :
// i
// i
Status GetElem(Sqlist* L, int i, ElemType *e)
{
ElemType *p = NULL;
if (NULL != (*L).elem)
{
assert(!(i<1 || i>(*L).length));
p = (*L).elem + i - 1;
*e = *p;
return OK;
}
else
return ERROR;
}
//find elem
// :
// i
//
Status LocateElem(Sqlist L, ElemType e)
{
int i = 1;
if (NULL != L.elem)
{
while (i <= L.length && !(*L.elem++ == e))
i++;
return i;
/*for (i = 0; i < L.length; i++)
{
if (e == L.elem[i])
break;
}
if(i+1 <= L.length )
return i+1;
else
return ERROR;
,
*/
}
else
return ERROR;
}
sqlist_main.cpp
ファイル#include "sqlist.h"
#include
#include
using namespace std;
int main()
{
Sqlist SL;
Status ret;
int i = 0;
ElemType e;
ret = InitList(&SL);
cout << "init success,ret is: " << ret << endl;
ret = ListEmpty(SL);
cout << "return 1 is empty, ret is: " << ret << endl;
ret = CleanList(&SL);
cout << "return 1 mean clean success, ret is: " << ret << endl;
for (i = 1; i < 10; i++)
{
ret = ListInsert(&SL, i, i);// 9
//cout << ret << endl;
}
ret = ListDelete(&SL, 2, &e);
cout << "delete success return 1, ret is " << ret << "e is: " << e << endl;
for (i = 0; i < SL.length; i++)//
{
cout << SL.elem[i] << endl;
}
ret = ListLength(SL);
cout << "SL length is: " << ret << endl;
ret = GetElem(&SL, 3, &e);
cout << "get success return 1, ret is " << ret << "e is: " << e << endl;
ret = LocateElem(SL, 4);
cout << "e loctation is: " << ret << endl;
ret = DestroyList(&SL);
cout << "destroy success, ret is: " << ret << endl;
system("pause");
return 0;
}
不適切な点をご指摘ください.
転載先:https://www.cnblogs.com/MisterXu/p/11173044.html