本次實現了一個順序表,該順序表具有如下功能:
(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;
}