順序表基本操作的代碼實現
初始化
靜態分配方式
#include <stdio.h>
#define MaxSize 10 //定義最大長度
typedef struct{
int data[MaxSize]; //存放數據元素
int length; //當前長度
}SqList; //順序表的類型定義
/**
* 初始化函數
*
* @param L 順序表指針
*/
void InitList(SqList &L){
for(int i=0; i<MaxSize; i++)
L.data[i]=0; //初始化爲0
L.length=0; //初始長度爲0
}
int main(){
SqList L;
InitList(L);
for(int i=0; i<MaxSize; i++)
printf("%d ", L.data[i]);
printf("length=%d", L.length);
return 0;
}
輸出
0 0 0 0 0 0 0 0 0 0 length=0
--------------------------------
Process exited with return value 0
Press any key to continue . . .
動態分配方式
#include <stdio.h>
#include <stdlib.h>
#define InitSize 10 //默認最大長度
typedef struct{
int *data; //指示動態分配數組的指針
int MaxSize; //最大容量
int length; //順序表的當前長度
}SeqList;
/**
* 初始化
*
* @param L 順序表指針
*/
void InitList(SeqList &L){
//用 malloc 函數申請一片連續的存儲空間
L.data=(int *)malloc(InitSize*sizeof(int));
L.length=0;
L.MaxSize=InitSize;
for(int i=0; i<InitSize; i++)
L.data[i]=0; //初始化爲0
}
/**
* 動態增加數組長度
*
* @param L 順序表指針
* @param len 增加的長度
*/
void IncreaseSize(SeqList &L, int 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; //擴大長度
free(p); //釋放原來的內存空間
}
int main(){
SeqList L;
InitList(L);
for(int i=0; i<L.MaxSize; i++)
printf("%d ", L.data[i]);
printf("\n原來size=%d", L.MaxSize);
IncreaseSize(L, 5);
printf("\n當前size=%d\n", L.MaxSize);
return 0;
}
輸出
0 0 0 0 0 0 0 0 0 0
原來size=10
當前size=15
--------------------------------
Process exited with return value 0
Press any key to continue . . .
插入
/**
* 插入
*
* @param L 順序表指針
* @param i 插入的位置,即位序i
* @param e 插入值
* @return 是否插入成功
*/
bool ListInsert(SqList &L, int i, int e){
if(i<1 || i>L.length+1)
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++; //長度加1
return true;
}
操作小記
代碼
#include <stdio.h>
#define MaxSize 10 //定義最大長度
typedef struct{
int data[MaxSize]; //存放數據元素
int length; //當前長度
}SqList; //順序表的類型定義
/**
* 初始化
*
* @param L 順序表指針
*/
void InitList(SqList &L){
for(int i=0; i<MaxSize; i++)
L.data[i]=0; //初始化爲0
L.length=0; //初始長度爲0
}
/**
* 插入
*
* @param L 順序表指針
* @param i 插入的位置,即位序i
* @param e 插入值
* @return 是否插入成功
*/
bool ListInsert(SqList &L, int i, int e){
if(i<1 || i>L.length+1)
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++; //長度加1
return true;
}
int main(){
SqList L;
InitList(L);
ListInsert(L, 1, 3);
ListInsert(L, 1, 2);
for(int i=0; i<MaxSize; i++)
printf("%d ", L.data[i]);
return 0;
}
效果:
2 3 0 0 0 0 0 0 0 0
--------------------------------
Process exited with return value 0
Press any key to continue . . .
刪除
/**
* 刪除
*
* @param L 順序表指針
* @param i 輸出的位置,即位序i
* @param e 刪除的值
* @return 是否插入成功
*/
bool ListDelete(SqList &L, int i, int &e){
if(i<1 || i>L.length)
return false;
e=L.data[i-1]; //將被刪除的元素賦值給e
for(int j=i; j<L.length; j++) //將第i個位置後的元素前移
L.data[j-1]=L.data[j];
L.length--; //線性表長度減1
return true;
}
操作小記
代碼
#include <stdio.h>
#define MaxSize 10 //定義最大長度
typedef struct{
int data[MaxSize]; //存放數據元素
int length; //當前長度
}SqList; //順序表的類型定義
/**
* 初始化
*
* @param L 順序表指針
*/
void InitList(SqList &L){
for(int i=0; i<MaxSize; i++)
L.data[i]=0; //初始化爲0
L.length=0; //初始長度爲0
}
/**
* 插入
*
* @param L 順序表指針
* @param i 插入的位置,即位序i
* @param e 插入值
* @return 是否插入成功
*/
bool ListInsert(SqList &L, int i, int e){
if(i<1 || i>L.length+1)
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++; //長度加1
return true;
}
/**
* 刪除
*
* @param L 順序表指針
* @param i 輸出的位置,即位序i
* @param e 刪除的值
* @return 是否插入成功
*/
bool ListDelete(SqList &L, int i, int &e){
if(i<1 || i>L.length)
return false;
e=L.data[i-1]; //將被刪除的元素賦值給e
for(int j=i; j<L.length; j++) //將第i個位置後的元素前移
L.data[j-1]=L.data[j];
L.length--; //線性表長度減1
return true;
}
int main(){
SqList L;
InitList(L);
ListInsert(L, 1, 3);
ListInsert(L, 1, 2);
for(int i=0; i<MaxSize; i++)
printf("%d ", L.data[i]);
int e=-1;
ListDelete(L, 1, e);
printf("\nres=%d\n", e);
for(int i=0; i<MaxSize; i++)
printf("%d ", L.data[i]);
return 0;
}
效果
2 3 0 0 0 0 0 0 0 0
res=2
3 3 0 0 0 0 0 0 0 0
--------------------------------
Process exited with return value 0
Press any key to continue . . .
查找
按位查找
/**
* 按位查找
*
* @param L 順序表指針
* @param i 位序i
* @return 該位置的值
*/
int GetElem(SqList L, int i){
return L.data[i-1];
}
操作小記
代碼
#include <stdio.h>
#define MaxSize 10 //定義最大長度
typedef struct{
int data[MaxSize]; //存放數據元素
int length; //當前長度
}SqList; //順序表的類型定義
/**
* 初始化
*
* @param L 順序表指針
*/
void InitList(SqList &L){
for(int i=0; i<MaxSize; i++)
L.data[i]=0; //初始化爲0
L.length=0; //初始長度爲0
}
/**
* 插入
*
* @param L 順序表指針
* @param i 插入的位置,即位序i
* @param e 插入值
* @return 是否插入成功
*/
bool ListInsert(SqList &L, int i, int e){
if(i<1 || i>L.length+1)
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++; //長度加1
return true;
}
/**
* 按位查找
*
* @param L 順序表指針
* @param i 位序i
* @return 該位置的值
*/
int GetElem(SqList L, int i){
return L.data[i-1];
}
int main(){
SqList L;
InitList(L);
ListInsert(L, 1, 3);
ListInsert(L, 1, 2);
for(int i=0; i<MaxSize; i++)
printf("%d ", L.data[i]);
printf("\n第一個值爲:%d", GetElem(L, 1));
return 0;
}
效果
2 3 0 0 0 0 0 0 0 0
第一個值爲:2
--------------------------------
Process exited with return value 0
Press any key to continue . . .
按值查找
/**
* 按值查找
*
* @param L 順序表指針
* @param e 獲取的值
* @return 該值的位序
*/
int LocateElem(SqList L, int e){
for(int i=0; i<L.length; i++)
if(L.data[i]==e)
return i+1; //數組下標爲i的元素值等於e,返回其位序i+1
return 0; //退出循環,說明查找失敗
}
操作小記
代碼
#include <stdio.h>
#define MaxSize 10 //定義最大長度
typedef struct{
int data[MaxSize]; //存放數據元素
int length; //當前長度
}SqList; //順序表的類型定義
/**
* 初始化
*
* @param L 順序表指針
*/
void InitList(SqList &L){
for(int i=0; i<MaxSize; i++)
L.data[i]=0; //初始化爲0
L.length=0; //初始長度爲0
}
/**
* 插入
*
* @param L 順序表指針
* @param i 插入的位置,即位序i
* @param e 插入值
* @return 是否插入成功
*/
bool ListInsert(SqList &L, int i, int e){
if(i<1 || i>L.length+1)
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++; //長度加1
return true;
}
/**
* 按值查找
*
* @param L 順序表指針
* @param e 獲取的值
* @return 該值的位序
*/
int LocateElem(SqList L, int e){
for(int i=0; i<L.length; i++)
if(L.data[i]==e)
return i+1; //數組下標爲i的元素值等於e,返回其位序i+1
return 0; //退出循環,說明查找失敗
}
int main(){
SqList L;
InitList(L);
ListInsert(L, 1, 3);
ListInsert(L, 1, 2);
for(int i=0; i<MaxSize; i++)
printf("%d ", L.data[i]);
printf("\n元素值爲3的位序:%d", LocateElem(L, 3));
return 0;
}
效果
2 3 0 0 0 0 0 0 0 0
元素值爲3的位序:2
--------------------------------
Process exited with return value 0
Press any key to continue . . .