順序表增強

本次實現了一個順序表,該順序表具有如下功能:

(1)初始化一個空順序表,初始順序表長度可自定義;

(2)查找某個元素在順序表中第一次出現的位置,如果不存在返回0;

(3)查找某個元素在順序表中出現的次數;

(4)求當前順序表的長度;

(5)在順序表L中的第i個位置前插入新元素e;

(6)在順序線性表L中刪除第i個元素,e返回其值;

(7)獲取順序表指定位置的元素值;

(8)給順序表指定位置元素賦值.

#include <iostream>
#include <cstdio>
#include <cstdlib>  //若在CodeBlocks中如果使用malloc(),realloc(),需要包含該頭文件
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -1

#define List_INIT_SPACE 100  //存儲控件初始分配量
#define List_INC_SPACE 50    //存儲控件分配增量


typedef int ElementType;     //指定順序表中數據類型
typedef struct {
    ElementType *elem;
    int length;
    int listsize;
}List;

#pragma mark - 1.初始化一個空順序表,初始順序表長度爲100
/****--------------------------------------------------------****/
//函數名: ListInit(List &L)
//參數:  (傳入) List L, 順序表結構體 L, 存儲線性表相關消息(&相當於傳入 L 的地址)
//返回值: int 型,返回1標識創建成功,0表示失敗
//功能: 初始化一個空順序表
/****--------------------------------------------------------****/

int listInit(List &L)
{
    //在內存中分配空間
    //L.elem = (ElementType*)malloc(List_INIT_SPACE * sizeof(ElementType));
    L.elem = new ElementType[List_INIT_SPACE];
    //存儲分配失敗
    if (!L.elem) {
        exit(OVERFLOW);
    }
    
    //構造一個空的線性表 L
    L.length = 0;
    //初始存儲容量
    L.listsize = List_INIT_SPACE;
    return OK;
}

#pragma mark - 2.查找某個元素在順序表中第一次出現的位置,如果不存在返回0
/****--------------------------------------------------------****/
//函數名: locateElem(List L, ElementType e)
//參數:   (傳入)List L,順序表
//       (傳入)ElementType e,定位元素
//返回值: int型,返回定位元素位置,0表示失敗
//功能: 在順序表中定位元素
/****--------------------------------------------------------****/

int listLocateElem(List L, int e)
{
    int i = 0;
    //定義線性表指針
    int *p = L.elem;
    //查找元素e
    while (i < L.length && *p != e) {
        i++;
        p++;
    }
    if (i <= L.length) {
        return i;
    }else {
        return ERROR;
    }
}


#pragma mark - 3.查找某個元素在順序表中出現的次數
/****--------------------------------------------------------****/
//函數名: listExistTimes(List L, ElementType e)
//參數:   (傳入)List L,順序表
//       (傳入)ElementType e,需要查找的元素
//返回值: int型,返回定位元素在順序表中出現的次數,0表示不存在
//功能: 在順序表中定位元素
/****--------------------------------------------------------****/

int listExistTimes(List L, int e)
{
    int i = 0;
    int sum = 0;
    //定義線性表指針
    int *p = L.elem;
    //查找元素e
    while (i < L.length) {
        p = &L.elem[i];
        if ( *p == e) {
            sum++;
        }
        i++;
        p++;
    }
    return sum;
}

#pragma mark - 4.求當前順序表的長度
/* 求順序表的長度*/
int listGetLength(List L)
{
    return L.length;
}


#pragma mark - 5.在順序表L中的第i個位置前插入新元素e
/****--------------------------------------------------------****/
//函數名: listInsert(List &L, int i, ElementType e)
//參數:  (傳入) List &L  順序表
//      (傳入) int i 插入位置
//      (傳入)ElementType e 插入元素
//返回值: 1表示成功, 0表示操作失敗
//功能:  在順序表L中的第i個位置前插入新元素e
//備註:  i的合法取值爲0 <= i <= 線性表的長度
/****--------------------------------------------------------****/
int listInsert(List &L, int i, ElementType e)
{
    //判斷位置是否合法
    if (i < 0 || i > L.length) {
        cout << "i的值不合法!" << endl;
        return 0;
    }
    
    //超出空間進行再分配
    if (L.length >= L.listsize) {
        int *newSpace;
        newSpace = (ElementType*) realloc(L.elem, (L.listsize + List_INC_SPACE) * sizeof(ElementType));
        //存儲空間分配失敗
        if (!newSpace) {
            exit(OVERFLOW);
        }
        //新基址
        L.elem = newSpace;
        //增加存儲容量
        L.listsize = L.listsize + List_INC_SPACE;
    }
    //定義指向線性表位置i和尾的指針
    int *p, *q;
    //q指針指向插入位置i
    q = &(L.elem[i]);
    for (p = &(L.elem[L.length - 1]); p >= q; p--) {
        *(p + 1) = *p;   //插入元素之後的元素右移
    }
    *q = e;              //把元素e放在位置i處
    L.length++;          //線性表長度增加1
    return OK;
}

#pragma mark - 6.在順序線性表L中刪除第i個元素,用e返回其值
/****--------------------------------------------------------****/
//函數名: ListDelete(List &L, int i, ElementType &e)
//參數:  (傳入)List &L   順序表
//      (傳入)int i        刪除位置
//      (傳出)ElementType &e  刪除元素
//返回值: 1表示成功, 0表示失敗
//功能:在順序線性表L中刪除第i個元素,用e返回其值
//備註: i的合法取值爲 0 <= i < 線性表長度( 0 <= i < L.length)
/****--------------------------------------------------------****/

int listDelete(List &L, int i, ElementType &e)
{
    //判斷位置是否合法
    if (i < 0 || i > L.length - 1) {
        cout << "i的值不合法" << endl;
        return 0;
    }
    int *p, *q;    //定義指向線性表位置i和尾的指針
    p = &(L.elem[i]);  //p爲被刪除元素的位置
    e = *p;
    q = L.elem + L.length - 1;   //q指針指向線性表最有一個元素
    for (; p < q; p++) {
        *p = *(p + 1);           //被刪除元素之後的元素左移
    }
    L.length--;
    return OK;
}

#pragma mark - 7.獲取順序表指定位置的元素值
/****--------------------------------------------------------****/
//函數名: listGetValue(List &L, int n)
//參數:  (傳入) List &L  順序表
//      (傳入) int n 要獲取元素的位置下標
//返回值: 要獲取的元素
//功能: 獲取順序表指定位置的元素值
//備註:  i的合法取值爲0<= i < 線性表的長度
/****--------------------------------------------------------****/
ElementType listGetSpecifiedValue(List &L, int n)
{
    //定義線性表指針
    ElementType *p = &(L.elem[n]);

    //獲取指定位置元素的值
    return *p;
}

#pragma mark - 8.給順序表指定位置元素賦值
/****--------------------------------------------------------****/
//函數名: listAssignValue(List &L,int i, int value)
//參數:  (傳入) List &L  順序表
//      (傳入) int i 賦值位置下標
//      (傳入) int value 指定位置要賦予的值
//功能: 給順序表指定位置元素賦值
//備註:  i的合法取值爲0<= i < 線性表的長度
/****--------------------------------------------------------****/
void listAssignValue(List &L, int i, ElementType value)
{
    //定義線性表指針
    ElementType *p = &(L.elem[i]);
    *p = value;
    
}

#pragma mark - 主函數
/****------------------------測試程序----------------------------****/
int main(int argc, const char * argv[]) {
    List R;  //實參定義
    int flag;
    //爲了判斷調用成功與否,可以檢查flag的值,或者見插入操作的調用方法
    //if(flag == 1) cout << "成功";
    //else cout << "失敗";
    flag = listInit(R);
    
    //調用方法
    //向順序表中插入0~9,共10個數
    for (int i = 0; i < 10; i++) {
        listInsert(R, i, i);
    }
    //輸出順序表中的所有元素
    for (int i = 0; i < R.length; i++) {
        cout << listGetSpecifiedValue(R, i) << " ";
    }
    cout << endl;
    
    //在順序表表頭插入元素34
    listInsert(R, 0, 34);
    //輸出順序表中的所有元素
    for (int i = 0; i < R.length; i++) {
        cout << listGetSpecifiedValue(R, i) << " ";
    }
    cout << endl;
    //在順序表表尾插入元素345
    listInsert(R, R.length, 345);
    //輸出順序表中的所有元素
    for (int i = 0; i < R.length; i++) {
        cout << listGetSpecifiedValue(R, i) << " ";
    }
    
    cout << endl;
    //在順序表表尾插入元素345
    listInsert(R, R.length, 345);
    //輸出順序表中的所有元素
    for (int i = 0; i < R.length; i++) {
        cout << listGetSpecifiedValue(R, i) << " ";
    }
    
    cout << endl;
    //輸出345在順序表中出現的次數.
    cout << listExistTimes(R, 345) << endl;
    int x;
    
    //刪除第0個元素
    listDelete(R, 0, x);
    //輸出順序表中的所有元素
    for (int i = 0; i < R.length; i++) {
        cout << listGetSpecifiedValue(R, i) << " ";
    }
    cout << endl;
    //刪除順序表最有一個元素
    listDelete(R, R.length-1, x);
    //輸出順序表中的所有元素
    for (int i = 0; i < R.length; i++) {
        cout << listGetSpecifiedValue(R, i) << " ";
    }
    cout << endl;
    
    return 0;
}


發佈了78 篇原創文章 · 獲贊 12 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章