1. 程式人生 > >資料結構-定長順序表

資料結構-定長順序表

        順序表是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組地址連續的儲存單元依次儲存資料元素的線性結構。線性表採用順序儲存的方式儲存就稱之為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地址連續的儲存單元中。

用定長順序表來實現基本操作程式碼如下:

SeqList.cpp:

#include<stdio.h>
#include"SeqList.h"
#include<assert.h>

//初始化
void InitList(PSeqList pl)
{
    assert(pl != NULL);
    if (pl == NULL)                               //判空
    {
        return;
    }
    pl->cursize = 0;                             //初始化長度為0
}

//插入
int InsertPos(PSeqList pl, int pos, ELEM_TYPE val)
{
    if (pl == NULL)                  //判空
    {
        return -1;
    }
                                                                                            // pos < 0 結構不存在;pos>pl->cursize 位置超出長度;判滿
    if(pos <0 || pos >pl->cursize || IsFull(pl))
    {
        return -1;
    }
    for (int i = pl->cursize - 1; i >= pos; i--)
    {
        pl->elem[i + 1] = pl->elem[i];                                    //將資料往後挪
    }
    pl->elem[pos] = val;                                                       //插入值
    pl->cursize++;                                                                //長度相應邊長
    return 1;
}

//按位置刪除
int DeletePos(PSeqList pl, int pos)
{
    if (pos < 0 || pos >pl->cursize)                                  //判斷刪除是否合法
    {
        return -1;
    }
    for (int i = pos + 1; i <= pl->cursize; i++)                //將pos之後的資料往前挪
    {
        pl->elem[i - 1] = pl->elem[i];                               //資料遷移
    }
    pl->cursize--;                                                            //相應的長度減小
    return 1;
}

//按元素刪除
int DeleteKey(PSeqList pl, ELEM_TYPE KEY)
{
    if (pl == NULL)
    {
        return 0;
    }
    //int i = 0;
    //for (i; pl->elem[i] != KEY; i++)                    //找到KEY的位置
    //{
    //    if (i == pl->cursize - 1)
    //    {
    //        return -1;
    //    }
    //}
    int index = Search(pl, KEY);                      //利用Search函式找到該元素的位置
    if (index < 0)
    {
        return -1;
    }
    for (int j = index; j < pl->cursize; j++)
    {
        if (pl->elem[j] == KEY)
        {
            DeletePos(pl, j);
            j--;
        }
    }
    return 1;
}

//查詢元素位置
int Search(PSeqList pl, ELEM_TYPE KEY)
{
    int rt = -1;
    if (pl != NULL)
    {
        for (int i = 0; i < pl->cursize; i++)
        {
            if (KEY == pl->elem[i])
            {
                rt = i;
                break;
            }
        }
    }
    return rt;
}

//判斷結構是否滿
bool IsFull(PSeqList pl)
{
    return pl->cursize == Arrary_SIZE;
}
//顯示函式
void Show(PSeqList pl)
{
    for (int i = 0; i < pl->cursize; i++)
    {
        printf("%d", pl->elem[i]);
    }
    printf("\n");
}
void Clear(PSeqList pl)
{
    pl->cursize = 0;
}
void Destory(PSeqList pl)
{
    Clear(pl);
}

標頭檔案SeqList.h:

#define Arrary_SIZE 5
typedef int ELEM_TYPE;
typedef struct SeqList
{
    ELEM_TYPE elem[Arrary_SIZE];
    int cursize;
}SeqList,*PSeqList;

void InitList(PSeqList pl);
int InsertPos(PSeqList pl, int pos, ELEM_TYPE val);
int DeletePos(PSeqList pl, int pos);
int DeleteKey(PSeqList pl, ELEM_TYPE KEY);
int Search(PSeqList pl, ELEM_TYPE KEY);
bool IsFull(PSeqList pl);
void Show(PSeqList pl);
void Clear(PSeqList pl);
void Destory(PSeqList pl);
 

主函式main():(包含一些基本操作)

#include<stdio.h>
#include<stdlib.h>
#include"SeqList.h"

int main()
{
    SeqList sl;
    InitList(&sl);
    for (int i = 0; i < 4; i++)
    {
        InsertPos(&sl, i, 5);
    }
    Show(&sl);
    InsertPos(&sl, 2, 8);
    Show(&sl);
    DeletePos(&sl,4);
    Show(&sl);
    DeleteKey(&sl, 5);
    Show(&sl);

    for (int i = 0; i < 6; ++i)
    {
        int rt = InsertPos(&sl, i, i + 1);
        printf("rt %d:%d\n", i + 1, rt);
    }
    Show(&sl);
    DeletePos(&sl, 2);
    int rt1 = InsertPos(&sl, 0, 4);
    printf("rt %d:%d\n", 7, rt1);
    Show(&sl);
    DeleteKey(&sl, 4);
    Show(&sl);
    Clear(&sl);
    int rt2 = InsertPos(&sl, 1, 10);
    printf("rt %d:%d\n", 8, rt2);
    int rt3 = InsertPos(&sl, 0, 20);
    printf("rt %d:%d\n", 9, rt3);
    int rt4 = InsertPos(&sl, 0, 30);
    printf("rt %d:%d\n", 10, rt4);
    Show(&sl);
    Destory(&sl);
    system("pause");
}