リニアテーブルのシーケンスストレージC++コード実装

5966 ワード

線形表の概念について、などの関連説明は『大話データ構造』第3章の内容を参照してください.
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