1. 程式人生 > 實用技巧 >基於C++的順序表的使用

基於C++的順序表的使用

標頭檔案的程式碼展示:

#ifndef header_h
#define header_h

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

#define  ok 1
#define error 0
#define overflow -2
#define list_init_size 100
#define listincrement 10

typedef int status;  //將status定義為int型的型別,用來表示函式的返回值型別
typedef int elemtype;   //將elemtype定義為int型的型別,用來表示順序表的指標型別

typedef struct {    //結構體
    elemtype* elem; //指標,用來存放順序表
    int length;     //整型變數,用來表示順序表的長度
    int listsize;   //整型變數,用來表示順序表的容量
}sqlist;

status initlist_sq(sqlist& l);//建立順序連結串列
status listinsert_sq(sqlist& l, int i, elemtype e);//順序表的插入
status listdelete_sq(sqlist& l, int i, elemtype& e);//刪除第i個位置的資料
void print(sqlist l);//輸出順序表
status destorylist(sqlist& l);//刪除順序表
status clearlist(sqlist& l);//清空順序表中的元素
status listempty(sqlist l);//判斷順序表是否為空
status listlength(sqlist l);//返回順序表的長度
status getelem(sqlist l, int i, elemtype& e); //獲得第i個位置的元素
status loateelem(sqlist l, elemtype e);//查詢與e元素的位置
void zhuye();//選擇頁面的輸出

#endif

  

  主函式的程式碼展示:

#include "header.h"
int main()
{
    int i, j, n, m;
    sqlist la;
    int f;
    initlist_sq(la);
    while (1) {
        cout << "請選擇你要需要的功能!" << endl;
        zhuye();
        cin >> f;
        system("cls");
        switch (f) {
        case 1:
            printf("請輸入la順序表的長度:");
            cin >> m;
            printf("輸入la順序表資料:");
            for (i = 1; i <= m; i++)
            {
                cin >> j;
                listinsert_sq(la, i, j);
            }

            cout << "順序表la:";
            print(la);
            break;
        case 2:
            print(la);
            break;
        case 3:
            cout << "輸入要插入的元素值:";
            cin >> i;
            cout << "輸入要插入的位置:";
            cin >> j;
            listinsert_sq(la, j, i);
            cout << "輸出插入元素後的順序表la:";
            print(la);
            break;
        case 4:
            cout << "輸入刪除元素的位置:";
            cin >> i;
            listdelete_sq(la, i, j);
            cout << "刪除元素的值為" << j;
            cout << "\n刪除元素後的la:";
            print(la);
            break;

        case 5:
            cout << "順序表的長度:" << listlength(la) << endl;
            break;

        case 6:
            cout << "\n輸入查詢的元素:";
            cin >> i;
            if (!loateelem(la, i))
                cout << "\n順序表la中沒有查詢元素" << i << endl;
            else
                cout << "\n元素" << i << "在順序表la中的位置為" << loateelem(la, i) << endl;
            break;

        case 7:
            cout << "\n輸入要獲取的元素的位置:";
            cin >> i;
            if (!getelem(la, i, n))
                cout << "\n輸入位置不合法" << endl;
            else
                cout << "\n要獲取的第" << i << "個元素" << "為" << n << endl;
            break;
        case 8:
            if (clearlist(la))
                cout << "\n順序表la已經清空";
            cout << "\n順序表la的長度為" << listlength(la) << endl;;
            if (destorylist(la))
                cout << "\n順序表la被銷燬" << endl;
            return 0;
            break;

        }
        system("pause");
        system("cls");
    }
    return 0;
}

  

  函式功能的程式碼分析:

#include "header.h"

status initlist_sq(sqlist& l) //建立順序連結串列
{ 
    /*********begin1**********/
    l.elem = new elemtype[list_init_size];//建立順序連結串列
    if (!l.elem) exit(overflow);        //判斷順序表是否建立成功
    l.length = 0;                       //初始化順序表長度
    l.listsize = list_init_size;        //初始化順序表容量
    return ok;                        
    /********end1************/
}




status listinsert_sq(sqlist& l, int i, elemtype e)//順序表的插入
{
    /*********begin2**********/
    elemtype* q, * p, * s;                    //定義一個整型指標,用來存放順序表
    if (i<1 || i>l.length + 1) return 0;    //判斷插入的位置是否超出了順序表的有效資料長度
    if (l.length >= list_init_size) {       //如果容量已滿,則執行以下括號內的步驟
        s = (elemtype*)realloc(l.elem, (l.listsize + 10) * sizeof(elemtype));
        //建立一個新的順序表(容量比原來多10),並將原來的資料複製給新的順序表
        if (!s) exit(-2);                   //判斷是否建立成功
        l.elem = s;                         //將原來的順序表替換為新的順序表
        l.listsize += 10;                   //將順序表的容量在原來的基礎上加10
    }
    q = &(l.elem[i - 1]);                   //將順序表中第i個位置(即順序表中的下標為i-1)的地址賦給q
    for (p = &(l.elem[l.length - 1]); p >= q; --p)
        *(p + 1) = *p;
   //將第i個之後的位置後移
    *q = e;                                 //將q中的資料替換成e
    ++l.length;                             //將長度加一
    return 1;

    /********end2************/

}



status listdelete_sq(sqlist& l, int i, elemtype& e)//刪除第i個位置的資料
{
    /*********begin3**********/
    if (i<1 || i>l.length) return 0;//判斷插入的位置是否超出了順序表的有效資料長度
    elemtype* q, * p;               //定義一個整型指標
    q = &(l.elem[i - 1]);           //將順序表中第i個位置(即順序表中的下標為i-1)的地址賦給q
    e = *q;                         //將第i個位置的值給e
    p = l.elem + l.length - 1;      //將p指標指到順序表的尾部
    for (++q; p >= q; ++q)          
        *(q - 1) = *q;
    //將第i個之後的資料前移
    --l.length;                     //長度減一
    return 1;
    /********end3************/

}

void print(sqlist l) {                  //輸出順序表
    int i;                                 //定義一個變數,用來表示順序表的下標
    for (i = 0; i < l.length - 1; i++)      //從下標為0開始,一直到下標為長度減一
        cout << l.elem[i] << ' ';           //輸出資料,並帶上空格
    cout << l.elem[i]<<endl;                      //最後一個不輸出空格
}

status destorylist(sqlist& l)//刪除順序表
{
    free(l.elem);           //刪除l.elem指標
    return ok;
}

status clearlist(sqlist& l)//清空順序表中的元素
{
    l.length = 0;           //直接賦值為0即可
    return ok;
}

status listempty(sqlist l)//判斷順序表是否為空
{
    if (l.length == 0)  
        return 1;
    else
        return 0;
    //如果為空,則返回1,否則返回0
}

status listlength(sqlist l) //返回順序表的長度
{
    return l.length;
}
status getelem(sqlist l, int i, elemtype& e)    //獲得第i個位置的元素
{
    /*********begin4**********/
    if (i<1 || i>l.length) return 0;//判斷插入的位置是否超出了順序表的有效資料長度
    e = l.elem[i - 1];              //將順序表中第i個位置(即順序表中的下標為i-1)的元素賦給e
    return 1;

    /********end4************/
}

status loateelem(sqlist l, elemtype e)  //查詢與e元素的位置
{
    /*********begin5**********/
    for (int i = 0; i < l.length; i++)
        if (l.elem[i] == e) return i + 1; 
    return 0;

    /********end5************/
}

void zhuye()//選擇頁面的輸出
{
    cout << "輸入1:在順序表中新增資料" << endl;
    cout << "輸入2:檢視順序表的所有元素" << endl;
    cout << "輸入3:在順序表中插入資料" << endl;
    cout << "輸入4:在順序表中刪除資料" << endl;
    cout << "輸入5:檢視順序表的長度" << endl;
    cout << "輸入6:通過元素查詢順序表中的資料" << endl;
    cout << "輸入7:通過位置檢視順序表中的資料" << endl;
    cout << "輸入8:推出" << endl;
    cout << "請輸入:";
}