定长顺序表的相关操作
程序员文章站
2024-03-21 13:14:46
...
创建头文件list.h
#pragma once //防止头文件被重复使用
//头文件:存放数据的定义和函数声明
#define SIZE 10
typedef struct SeqList
{
int elem[SIZE];
int length;//有效数据的个数
}SquList,*PSeqList;
//typedef SeqList * PSeqList;
//初始化
//void InitSeqList(SeqList *plist);
void InitSeqList(PSeqList plist);
//往pos位置插入数据val
bool Insert(PSeqList plist,int val,int pos);
//查找关键字key,找到后返回下标,失败返回-1
int Search(PSeqList plist,int key);
//删除plist中的第一个key
bool DeleteVal(PSeqList plist,int key);
//删除plist中pos位置的值
bool DeletePos(PSeqList plist,int pos);
//将pos位置的值赋值成newValue值
bool SetPos(PSeqList plist,int pos,int newVal);
//显示
void Show(PSeqList plist);
//清空数据
void Clear(PSeqList plist);
//销毁动态内存
void Destroy(PSeqList plist);
创建list.cpp文件
//list.cpp文件:存放函数的实现
#include"list.h"
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//判空
static void DeterNull(PSeqList plist)
{
assert(plist!=NULL);
if(plist==NULL)
{
exit(0);
}
}
//判满
static bool IsFull(PSeqList plist)
{
assert(plist!=NULL);
if(plist==NULL)
{
return false;
}
return plist->length==SIZE;
}
//判空
static bool IsEmpty(PSeqList plist)
{
assert(plist!=NULL);
if(plist==NULL)
{
return false;
}
return plist->length==0;
}
//初始化
void InitSeqList(PSeqList plist)
{
assert(plist!=NULL);
if(plist==NULL)
{
return ;
}
plist->length=0;//有效数据个数置0
}
//往pos位置插入数据val
bool Insert(PSeqList plist,int val,int pos)
{
assert(plist!=NULL);
//数据必须靠左连续存放(当前设计决定)
if(pos<0 || pos>plist->length || IsFull(plist))
{
return false;
}
//移动数据
for(int i=plist->length-1;i>=pos;i--)
{
plist->elem[i+1]=plist->elem[i];
}
//插入数据
plist->elem[pos]=val;
//增加有效数据个数
plist->length++;
return true;
}
//查找关键字key,找到后返回下标,失败返回-1
int Search(PSeqList plist,int key)
{
DeterNull(plist);
//查找key值,找到返回下标
for(int i=0;i<plist->length;i++)
{
if(plist->elem[i]==key)
{
return i;
}
}
return -1;
}
//删除plist中的第一个key,使用search函数
bool DeleteVal(PSeqList plist,int key)
{
int index=Search(plist,key);
DeletePos(plist,index);
plist->length--;
return true;
}
//删除plist中的第一个key,不使用search函数
bool DeleteVal(PSeqList plist,int key)
{
DeterNull(plist);
//若没有数据,则返回false
if(IsEmpty(plist))
{
return false;
}
//删除第一个key,后面的数字依次前移
for(int i=0;i<plist->length-1;i++)
{
if(plist->elem[i]==key)
{
DeletePos(plist,i);
plist->length--;
return true;
}
}
return false;
}
//删除plist中pos位置的值
bool DeletePos(PSeqList plist,int pos)
{
assert(plist!=NULL);
if(pos<0 || pos>=plist->length || IsEmpty(plist))
{
return false;
}
//后面的数据往前移
for(int i=pos;i<plist->length-1;i++)
{
plist->elem[i]=plist->elem[i+1];
}
//有限数据个数-1
plist->length--;
return true;
}
//将pos位置的值赋值成newValue值
bool SetPos(PSeqList plist,int pos,int newVal)
{
DeterNull(plist);
if(pos<0 || pos>=plist->length)
{
return false;
}
plist->elem[pos]=newVal;
return true;
}
//显示
void Show(PSeqList plist)
{
for(int i=0;i<plist->length;i++)
{
printf("%d ",plist->elem[i]);
}
printf("\n");
}
//清空数据
void Clear(PSeqList plist)
{
DeterNull(plist);
plist->length=0;
}
//销毁动态内存
void Destroy(PSeqList plist)
{
Clear(plist);
}
小知识:
数据结构:线性表(链表,顺序表),树形结构(二叉树),网状结构
算法:排序,查找,动态内存管理
数据存储方式:顺序存储(逻辑相邻,物理也相邻),链式存储(逻辑存储,物理不一定相邻)