数据结构是计算机学科的基础,也是算法的基础,要想做一个合格的程序员,学会学懂数据结构是必须的。
在我看来,数据结构中最简单的莫过于线性表的顺序存储结构。
//线性表(顺序存储结构)的基本函数
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20 //存储空间初始化分配量
typedef int Status; //作为函数状态码
typedef int ElemType; //ElemType类型根据实际情况而定,这里假设为int
typedef struct{
ElemType data[MAXSIZE]; //存储数组元素,最大为MAXSIZE
int length; //线性表当前长度
}SqList;
/***************************************************/
void ClearList(SqList *L); //清空链表
int ListEmpty(SqList L); //判断线性表是否为空
Status GetElem(SqList L,int i,ElemType *e); //取出表中的某一个元素
Status ListInsert(SqList *L,int i,ElemType e); //在表中插入一个元素
int LocateElem(SqList L,ElemType e); //查找与给定值相同的元素
Status ListDelete(SqList *L,int i,ElemType *e); //删除掉表中的某一个元素
/****************************************************/
int main()
{
}
/**********************************************/
//函数名:GetElem
//描述 :取出第i个元素
//参数 :链表L,i,e
//返回值:状态值
/**********************************************/
Status GetElem(SqList L,int i,ElemType *e){
if(L.length==0 || i<1 || i>L.length){
return ERROR;
}
*e = L.data[i-1];
return OK;
}
/**********************************************/
//函数名:ListInsert
//描述 :在第i个位置,插入一个新元素
//参数 :链表指针L,i,e
//返回值:状态值
/**********************************************/
Status ListInsert(SqList *L,int i,ElemType e){
int k;
if(L->length==0 || i<1 || i>L->length+1 || L->length==MAXSIZE){
return ERROR; //当表为空表,或者表已经存满,或者插入位置不当ERROR!
}
if(i <= L->length){ //如果在线性表内插入
for(k = L->length; k > e-1; k--){
L->data[k] = L->data[k-1]; //原来的线性表位置向后移位
}
L->data[i-1] = e;
L->length++; //线性表长度增加1
}else{ //如果在线性表的末端增加一个新元素
L->length++;
L->data[L->length - 1] = e; //在末尾插入即可
}
return OK;
}
/**********************************************/
//函数名:ListDelete
//描述 :删除第i个位置的元素,并取出来该元素
//参数 :链表指针L,i,e
//返回值:状态值
/**********************************************/
Status ListDelete(SqList *L,int i,ElemType *e){
int k; //for循环时的下标
if(L->length==0 || i<1 || i>L->length){
return ERROR; //当表为空表,或者删除位置不当,返回ERROR!
}
*e = L->data[i-1]; //取出第i个元素
if(i < L->length){ //删除的位置不再线性表末端
for(k = i-1; k < L->length-1; k++){
L->data[k] = L->data[k+1]; //删除操作
}
}else{
free(L+L->length-1); //释放最后一位元素的存储空间
}
L->length--; //线性表长度自减
return OK;
}
/**********************************************/
//函数名:ListEmpty
//描述 :判断该表是否为空表
//参数 :表L
//返回值:状态值
/**********************************************/
int ListEmpty(SqList L){
if(L.length==0){
return FALSE;
}
return TRUE;
}
/**********************************************/
//函数名:LocateElem
//描述 :定位元素的值为e的元素
//参数 :表L,元素值e
//返回值:查找成功则返回位置,查找失败,则返回0
/**********************************************/
int LocateElem(SqList L,ElemType e){
int k;
k = L.length;
if(k==0){
return ERROR; //空表则返回0
}
for(k = 0; k < L.length; k++){
if(L.data[k] == e){
return k+1; //查找成功,返回位置
}
}
return ERROR; //查找失败
}
仔细思考我们可以发现,线性表的顺序存储结构的缺点在于插入和删除某一元素非常耗时,因为它需要后面的元素都移动。而取出某一个元素则非常容易。