顺序表是一种基本的数据结构,是线性表的一种实现方式,本文将结合代码简单介绍顺序表的相关基础知识点。
认识线性表
线性表(Linear_list)是最常用且最简单的一种数据结构。简言之,一个线性表就是n个数据元素的有限序列。线性表根据存储方式可分为顺序表和链表,本文将实现顺序表(Sqlist)的相关操作,链表将在以后实现。
代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 10
#define INCREMENT 10
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
typedef struct
{
ElemType *data; //节点数据
int length; //顺序表长度
int size; //顺序表大小
}SqList;
//初始化
Status InitList(SqList *L)
{
L->data = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));
if(!L->data) return ERROR;
L->length = 0;
L->size = MAXSIZE;
return OK;
}
//清空
Status Clear(SqList *L)
{
if(!L->data) return ERROR;
L->length = 0;
return OK;
}
//销毁
Status Destroy(SqList *L)
{
if(L->data)
{
free(L->data);
L = NULL;
return OK;
}
return ERROR;
}
//根据位置返回元素
Status GetElem(SqList *L,int pos,ElemType* e)
{
if(pos<1||pos>L->length) return ERROR;
(*e) = L->data[pos-1];
return OK;
}
//根据元素返回位置
Status GetPos(SqList *L,ElemType e,int* pos)
{
int i = 0;
if(!L->data) return ERROR;
while(i < L->length)
{
if(e == L->data[i])
{
(*pos) = i+1;
return OK;
}
i++;
}
(*pos) = -1;
return ERROR;
}
//表空
Status ListEmpty(SqList *L)
{
return L->length == 0?1:0;
}
//根据位置插入元素
Status Insert(SqList *L,int pos,ElemType e)
{
ElemType* newBase;
int i = 0;
if(pos < 1||pos > L->length+1)
return ERROR;
if(L->length >= L->size)
{
newBase = (ElemType *)realloc(L->data,(L->size+INCREMENT)*sizeof(ElemType));
L->data = newBase;
L->size+=INCREMENT;
}
for(i=L->length-1;i>=pos-1;i--)
L->data[i+1] = L->data[i]; //后移
L->data[pos-1] = e;
L->length++;
return OK;
}
//创建
Status Create(SqList *L,int n)
{
ElemType e;
int i = 0;
while(i < n)
{
scanf("%d",&e);
Insert(L,i+1,e);
i++;
}
return OK;
}
//根据位置删除元素
Status DeleteAccordToPos(SqList *L,int pos,ElemType* e)
{
int i = 0;
if(!L->data) return ERROR;
if(pos < 1||pos > L->length)
return ERROR;
(*e) = L->data[pos-1];
for(i = pos-1;i < L->length;++i)
L->data[i] = L->data[i+1];
L->length--;
return OK;
}
//根据值删除元素
Status DeleteAccordToElem(SqList *L,ElemType e,int* pos)
{
int i = 0;
if(!L->data) return ERROR;
while(i < L->length)
{
if(e == L->data[i])
{
(*pos) = i+1;
while(i < L->length)
{
L->data[i] = L->data[i+1];
i++;
}
L->length--;
return OK;
}
i++;
}
(*pos) = -1;
return ERROR;
}
// 合并
/*Status Merge(SqList *L_1,SqList L_2,SqList L)
{
}*/
//遍历
Status Traverse(SqList *L)
{
int i = 0;
while(i < L->length)
{
printf("%d ",L->data[i]);
i++;
}
printf("\n");
return OK;
}
完整代码可参见:GitHub
DONE!