線性表的順序儲存實現(1)順序表
阿新 • • 發佈:2022-05-11
靜態分配儲存空間
定義
#include <stdio.h>
#include <stdlib.h> // malloc 、free
//***線性表的 順序儲存-> 順序表的定義***
//靜態分配儲存空間
#define MaxSize 50
typedef struct
{
int data[MaxSize];
int length; //陣列當前元素個數
}SqList;
初始化
void InitList(SqList &L) { L.length = 0; for(int i=0; i<MaxSize; i++) // 可省略 { L.data[i] = 0; } }
增
//***插入操作 bool ListInsert(SqList &L, int i, int e) { if (i < 1 || i > L.length + 1) // 判斷i的範圍是否有效 不可插入無前驅也無後繼的空位置 { return false; } if (L.length >= MaxSize) // 空間已滿無法插入 { return false; } for(int j = L.length; j >= i; j--) // 第i位 及 之後元素後移 { L.data[j] = L.data[j-1]; } L.data[i-1] = e; // 在位置i 放入e L.length++; return true; }
刪
//***刪除操作 bool ListDelete(SqList &L, int i, int &e) // 被刪除元素賦值給e 並返回 { if (i<1 || i>L.length) { return false; } e = L.data[i-1]; for (int j=i; j<L.length; j++) // 第i+1位 及 之後元素前移 { L.data[j-1] = L.data[j]; } L.length--; // 線性表長度減少1 return true; }
查
//***按值查詢
int LocateElem(SqList L, int e)
{
int i;
for(i=0; i<L.length; i++)
{
if(L.data[i] == e)
{
return i + 1; // 返回元素位序
}
}
return 0; // 查詢失敗
}
列印
//***列印順序表
void PrintList(SqList L)
{
printf("the sqlist Length is:%d\n", L.length);
for(int i=0; i<L.length; i++)
{
printf("ID: %d L.data[%d] = %d \n", i+1, i, L.data[i]);
}
puts("\n");
}
動態分配儲存空間
定義
#include <stdio.h>
#include <stdlib.h> // malloc 、free
//***線性表的 順序儲存-> 順序表的定義***
//動態分配儲存空間
#define InitSize 100 // 預設的最大長度
typedef struct
{
int *data; // 指向動態分配陣列的指標
int maxsize; // 順序表最大容量
int length; // 順序表當前長度
}SeqList;
初始化
void InitList(SeqList &L)
{
L.data = (int *)malloc(InitSize*sizeof(int));
L.length = 0;
L.maxsize = InitSize;
}
動態擴充套件空間
void IncreaseSize(SeqList &L, int len) //增加動態陣列長度 每次增加指定長度len
{
int *p = L.data;
L.data = (int *)malloc((L.maxsize+len)*sizeof(int));
for(int i=0; i<L.length; i++)
{
L.data[i] = p[i]; // 將資料複製到新空間
}
L.maxsize = L.maxsize + len; // 順序表最大長度增加 len
free(p); // 釋放原來的記憶體空間
}
增
//***插入操作
bool ListInsert(SeqList &L, int i, int e)
{
if (i < 1 || i > L.length + 1) // 判斷i的範圍是否有效 不可插入無前驅也無後繼的空位置
{
return false;
}
if (L.length >= L.maxsize) // 空間已滿無法插入
{
return false;
}
for(int j = L.length; j >= i; j--) // 第i位 及 之後元素後移
{
L.data[j] = L.data[j-1];
}
L.data[i-1] = e; // 在位置i 放入e
L.length++;
return true;
}
刪
//***刪除操作
bool ListDelete(SeqList &L, int i, int &e) // 被刪除元素賦值給e 並返回
{
if (i<1 || i>L.length)
{
return false;
}
e = L.data[i-1];
for (int j=i; j<L.length; j++) // 第i+1位 及 之後元素前移
{
L.data[j-1] = L.data[j];
}
L.length--; // 線性表長度減少1
return true;
}
查
//***按值查詢
int LocateElem(SqList L, int e)
{
int i;
for(i=0; i<L.length; i++)
{
if(L.data[i] == e)
{
return i + 1; // 返回元素位序
}
}
return 0; // 查詢失敗
}//***按值查詢
int LocateElem(SeqList L, int e)
{
int i;
for(i=0; i<L.length; i++)
{
if(L.data[i] == e)
{
return i + 1; // 返回元素位序
}
}
return 0; // 查詢失敗
}
列印
//***列印順序表
void PrintList(SeqList L)
{
printf("the seqlist Length is:%d\n", L.length);
for(int i=0; i<L.length; i++)
{
printf("ID: %d L.data[%d] = %d \n", i+1, i, L.data[i]);
}
puts("\n");
}