最常用最简单的数据结构,分为顺序表(定长的顺序表和不定长的顺序表)和链表
数组: 存数据,取数据,求长度
顺序表:存数据,读数据,增加数据,删除数据
为了记录顺序表的有效长度,可以定义一个整形的变量记录有效长度
顺序表的常见操作:
#pragma once
typedef struct SQList//定长顺序表
{
int elem[10];
int length;
}SQList,*PSQList;//typedef把变量提升为类型,PSQList == SQList*
void InitSqlist(PSQList ps);//初始化的声明
bool Insert(PSQList ps, int pos, int val);//插入数据,在ps顺序表的pos位置插入val
bool IsEmpty(PSQList ps);//判断是否为空
int Search(PSQList ps, int key);//查找,在ps查找第一个key值,返回下标,没有返回-1
bool DelPos(PSQList ps, int pos);//删除,pos位置的值
bool DelVal(PSQList ps, int val);//删除,第一个val值
int GetPrio(PSQList ps, int key);//返回key的前驱下标,如果不存在返回-1
int GetNext(PSQList ps, int key);//返回key的后继下标,如果不存在返回-1
void Show(PSQList ps);//输出
void Clear(PSQList ps);//清空
以上是.h文件,其中第一排#pragma once是自动出现的,这是防止头文件被重复引用,例如:c.h用了a.h和b.h,b.h用了a.h,主要防这种隐式引用
.h文件放定义与声明
实现:
#include "1sqlist.h"
#include<assert.h>
#include<stdio.h>
void InitSqlist(PSQList ps)//初始化的声明
{
assert(ps != NULL);//断言快速定位错误
ps->length = 0;
}
bool Insert(PSQList ps, int pos, int val)//插入数据,在ps顺序表的pos位置插入val
{
assert(ps != NULL);
if (ps->length == 10)//满了
return false;
if (pos < 0 || pos>ps->length)
return false;
for (int i = ps->length-1; i > pos; i--)
{
ps->elem[i+1] = ps->elem[i];
}
ps->elem[pos] = val;
ps->length++;
return true;
}
bool IsEmpty(PSQList ps)//判断是否为空
{
if (ps->length == 0)
return true;
return false;
}
int Search(PSQList ps, int key)//查找,在ps查找第一个key值,返回下标,没有返回-1
{
assert(ps != NULL);
if (ps == NULL)
{
return -1;
}
for (int i = 0; i < ps->length; i++)
{
if (ps->elem[i] == key)
return i;
}
return -1;
}
bool DelPos(PSQList ps, int pos)//删除,pos位置的值
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
if (pos<0 || pos>ps->length)
return false;
for (int i = pos; i < ps->length-1; i++)
{
ps->elem[i] = ps->elem[i+1];
}
ps->length--;
return true;
}
bool DelVal(PSQList ps, int val)//删除,第一个val值
{
assert(ps != NULL);
if (ps == NULL)
{
return false;
}
int i = Search(ps, val);
for (i; i < ps->length - 1; i++)
{
ps->elem[i] = ps->elem[i + 1];
}
ps->length--;
}
int GetPrio(PSQList ps, int key)//返回key的前驱下标,如果不存在返回-1
{
int i = Search(ps, key);
if (i < 1)
return -1;
else
return i - 1;
}
int GetNext(PSQList ps, int key)//返回key的后继下标,如果不存在返回-1
{
int i = Search(ps, key);
if (i <0||i==ps->length-1)
return -1;
else
return i + 1;
}
void Show(PSQList ps)//输出
{
assert(ps != NULL);
if (ps == NULL)
{
return;
}
for (int i = 0; i < ps->length; i++)
{
printf("%d ", ps->elem[i]);
}
printf("\n");
}
void Clear(PSQList ps)//清空
{
ps->length = 0;
}
void Destroy(PSQList ps)//销毁整个内存
{
Clear(ps);
}