顺序存储结构的常见操作,使用c语言实现
1、定义
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define true 1
#define false 0
#define MaxSize 10 //定义顺序表的最大长度
typedef int bool;
typedef int ElemType ;
//定义顺序表结构
typedef struct _SeqList{
ElemType *data;//指示动态分配数组的指针
int size;// 顺序表的有效个数
}SeqList;
2、初始化
/**
* 功能:初始化链表
* 返回值:如果成功,则返回链表的地址,如果失败退出
*/
SeqList* InitList_Sq(){
SeqList *pList=NULL;
pList=(SeqList*)malloc(sizeof(SeqList));
if(!pList){
printf("分配内存空间失败!");
exit(0);
}
pList->data=(ElemType*)malloc(sizeof(ElemType)*MaxSize);
if(pList->data==NULL){
printf("pList->data动态内存分配失败!\n");
pList=NULL;
free(pList);
exit(0);
}
pList->size=0;
printf("初始化成功\n");
return pList;
}
3、判断空表
/**
* 功能:判断链表是否是空表
* 参数:链表地址
* 返回值:true 是 false 否
*/
bool IsEmpty_Sq(SeqList *pList){
if(pList==NULL){
printf("错误:链表未初始化!");
exit(0);
}
if(pList->size==0){
return true;
}
return false;
}
4、判断是否已经满
/**
* 功能:判断链表是否是已满
* 参数:链表地址
* 返回值:true 是 false 否
*/
bool IsFull_Sq(SeqList *pList){
if(pList==NULL){
printf("错误:链表未初始化!");
exit(0);
}
if(pList->size==MaxSize){
printf("链表空间已满\n");
return true;
}
return false;
}
5、顺序表长度
/**
* 功能:获取链表长度
* 参数:链表地址
* 返回值:链表长度
*/
int Length_Sq(SeqList *pList){
if(pList==NULL){
printf("错误:链表未初始化!");
exit(0);
}
return pList->size;
}
6、插入操作
image.png
/**
* 功能:向链表插入数据元素 前置条件:链表已初始化,1<=index<=pList->size+1
* 参数:链表地址 下标 插入的元素
* 返回值:链表长度
*/
bool Insert_Sq(SeqList *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("数组下标越界\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++;//链表有效个数加1
return true;
}
7、删除操作
image.png
/**
* 功能:向链表删除数据元素 前置条件:链表已初始化,1<=index<=pList->size
* 参数:链表地址 下标 删除的元素
* 返回值:true 成功 false 失败
*/
bool Delete_Sq(SeqList *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("数组下标越界\n");
return false;
}
printf("删除的元素为%d\n",pList->data[index-1]);
*pVal=pList->data[index-1];
//执行删除 index位置之后的向前移动一个位置
for(int i=index-1;i<pList->size;i++){
pList->data[i]=pList->data[i+1];
}
pList->size--;//链表有效个数减1
return true;
}
8、查找元素
/**
* 功能:查找元素,返回下标
* 参数:链表地址 元素
* 返回值: 下标 -1 为查找不到
*/
int Search_Sq(SeqList *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、获取下标的元素
/**
* 功能:获取某个下标的元素
* 参数:链表地址 下标
* 返回值: 元素
*/
int getElem(SeqList *pList,int index,ElemType *e){
//前置条件
if(pList==NULL){
printf("错误:链表未初始化!\n");
return false;
}
if(IsEmpty_Sq(pList)){
printf("错误:链表为空,不能删除!\n");
return false;
}
if(index<1||index>pList->size){
printf("数组下标越界\n");
return false;
}
return pList->data[index-1];
}
10、遍历
/**
* 功能:遍历链表
* 参数:链表地址
*/
void Show_Sq(SeqList *pList){
//前置条件
if(pList==NULL){
printf("错误:链表未初始化!\n");
return;
}
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");
}
网友评论