欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

定长顺序表的相关操作

程序员文章站 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);
}

小知识:
数据结构:线性表(链表,顺序表),树形结构(二叉树),网状结构
算法:排序,查找,动态内存管理
数据存储方式:顺序存储(逻辑相邻,物理也相邻),链式存储(逻辑存储,物理不一定相邻)

相关标签: 基于c的数据结构