順序存儲結構的常見操作棚瘟,使用c語言實現(xiàn)
1、定義
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define true 1
#define false 0
#define MaxSize 50 //定義順序表的最大長度
typedef int bool;
typedef int ElemType ;
//定義順序表結構
typedef struct _SqList{
ElemType data [MaxSize];// 順序表的元素
int size;// 順序表的有效個數(shù)
}SqList;
2喜最、初始化
/**
* 功能:初始化鏈表
* 返回值:如果成功偎蘸,則返回鏈表的地址,如果失敗退出
*/
SqList* InitList_Sq(){
SqList *pList=NULL;
pList=(SqList*)malloc(sizeof(SqList));
if(!pList){
printf("分配內存空間失斔材凇迷雪!");
exit(0);
}
pList->size=0;
printf("初始化成功\n");
return pList;
}
3、判斷空表
/**
* 功能:判斷鏈表是否是空表
* 參數(shù):鏈表地址
* 返回值:true 是 false 否
*/
bool IsEmpty_Sq(SqList *pList){
if(pList==NULL){
printf("錯誤:鏈表未初始化虫蝶!");
exit(0);
}
if(pList->size==0){
return true;
}
return false;
}
4章咧、判斷是否已經滿
/**
* 功能:判斷鏈表是否是已滿
* 參數(shù):鏈表地址
* 返回值:true 是 false 否
*/
bool IsFull_Sq(SqList *pList){
if(pList==NULL){
printf("錯誤:鏈表未初始化!");
exit(0);
}
if(pList->size==MaxSize){
return true;
}
return false;
}
5能真、順序表長度
/**
* 功能:獲取鏈表長度
* 參數(shù):鏈表地址
* 返回值:鏈表長度
*/
int Length_Sq(SqList *pList){
if(pList==NULL){
printf("錯誤:鏈表未初始化赁严!");
exit(0);
}
return pList->size;
}
6、插入操作
/**
* 功能:向鏈表插入數(shù)據(jù)元素 前置條件:鏈表已初始化粉铐,1<=index<=pList->size+1
* 參數(shù):鏈表地址 下標 插入的元素
* 返回值:鏈表長度
*/
bool Insert_Sq(SqList *pList,int index, ElemType e){
//前置條件
if(pList==NULL){
printf("錯誤:鏈表未初始化疼约!\n");
return false;
}
if(IsFull_Sq(pList)){
return false;
}
if(index<1||index>pList->size+1){
printf("數(shù)組下標越界\n");
return false;
}
//開始插入
if(!IsEmpty_Sq(pList)){//空表只能插到1的位置
if(index<pList->size+1){//將要插入的元素位置往后的元素往后移動 往最后面添加一個元素無需移動
for(int i=pList->size-1;i>=index-1;i--){
pList->data[i+1]=pList->data[i];
}
}
}
pList->data[index-1]=e;
pList->size++;//鏈表有效個數(shù)加1
return true;
}
7、刪除操作
/**
* 功能:向鏈表刪除數(shù)據(jù)元素 前置條件:鏈表已初始化蝙泼,1<=index<=pList->size
* 參數(shù):鏈表地址 下標 刪除的元素
* 返回值:true 成功 false 失敗
*/
bool Delete_Sq(SqList *pList,int index, ElemType *pVal){
//前置條件
if(pList==NULL){
printf("錯誤:鏈表未初始化程剥!\n");
return false;
}
if(IsEmpty_Sq(pList)){
printf("錯誤:鏈表為空,不能刪除汤踏!\n");
return false;
}
if(index<1||index>pList->size){
printf("數(shù)組下標越界\n");
return false;
}
//開始刪除
*pVal=pList->data[index-1];
//執(zhí)行刪除 index位置之后的向前移動一個位置
for(int i=index-1;i<pList->size;i++){
pList->data[i]=pList->data[i+1];
}
pList->size--;//鏈表有效個數(shù)加1
return true;
}
8织鲸、查找元素
/**
* 功能:獲取某個元素的下標
* 參數(shù):鏈表地址 元素
* 返回值: 下標 -1 為查找不到
*/
int Search_Sq(SqList *pList,ElemType e){
//前置條件
if(pList==NULL){
printf("錯誤:鏈表未初始化舔腾!\n");
return -1;
}
if(IsEmpty_Sq(pList)){
return -1;
}
for(int i=0;i<pList->size;i++){
if(e==pList->data[i]){
return i;
}
}
return -1;
}
9、獲取下標的元素
/**
* 功能:遍歷鏈表
* 參數(shù):鏈表地址 下標
* 返回值: 元素
*/
int getElem(SqList *pList,int index){
//前置條件
if(pList==NULL){
printf("錯誤:鏈表未初始化昙沦!\n");
return false;
}
if(IsEmpty_Sq(pList)){
printf("錯誤:鏈表為空琢唾,不能刪除!\n");
return false;
}
if(index<1||index>pList->size){
printf("數(shù)組下標越界\n");
return false;
}
return pList->data[index-1];
}
10盾饮、遍歷
/**
* 功能:遍歷鏈表
* 參數(shù):鏈表地址
*/
void Show_Sq(SqList *pList){
//前置條件
if(pList==NULL){
printf("錯誤:鏈表未初始化采桃!\n");
}
bool flag=true;
printf("[");
for(int i=0;i<pList->size;i++){
if(flag){
printf("%d",pList->data[i]);
flag=false;
}else{
printf(",%d",pList->data[i]);
}
}
printf("]\n");
}
11、清空線性表
/**
* 功能:清空線性表
* 參數(shù):鏈表地址
*/
void Clear_Sq(SqList *pList){
pList->size=0;
}
12丘损、銷毀線性表
/**
* 功能:銷毀線性表
* 參數(shù):鏈表地址
*/
void Destory_Sq(SqList *pList){
Clear_Sq(pList);
if(pList->data)
free( pList->data);//釋放線性表所占的空間
}