线性表
零个或多个数据元素的有限序列,线性表中的元素是一对一的关系,除了第一个元素和最后一个元素外,其他元素都是首尾相接的。线性表有两种存储方式,一种是顺序存储结构,另一种是链式存储结构。
线性表的顺序存储结构
线性表的顺序存储结构是指将线性表中的元素存放在一组连续的存储单元中,特点是线性表中逻辑相邻的元素,物理存储单元中也是相邻的。顺序表是采用顺序存储结构的线性表。
基本操作
Status InitList(SqList *list);
Status IsEmpty(SqList *list);
int Length(SqList *list);
Status GetElement(SqList *list, int index, Element *e);
Status InsertElement(SqList *list, int index, ElementType e);
Status DeleteElement(SqList *list, int index, ElementType *e);
Status ClearList(SqList* list);
Status DestroyList(SqList *list);
Status printSqList(SqList *list);
实现
线性表的动态分配顺序存储结构
#include <stdio.h>
#define LIST_INIT_SIZE 10
#define LIST_INCREMENT 2
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElementType;
typedef int Status;
typedef struct
{
ElementType *elements;
int length;
int listSize;
}SqList;
初始化
初始化就是把顺序表初始化为空的顺序表,即长度置为0
Status InitList(SqList *list)
{
list->elements = (ElementType*)malloc(LIST_INIT_SIZE * sizeof(ElementType));
if(!list->elements)
return ERROR;
list->length = 0;
list->listSize = LIST_INIT_SIZE;
return OK;
}
判断是否为空
判断顺序表长度是否为0
Status IsEmpty(SqList *list)
{
return list->length == 0 ? TRUE : FALSE;
}
获取表长
int GetLength(SqList *list)
{
return list->length;
}
获取指定坐标元素
Status GetElement(SqList *list, int index, ElementType *e)
{
if(index < 1 || index > list->length)
return ERROR;
*e = *(list->elements + index - 1);
return OK;
}
插入元素
插入操作就是在顺序表list的第i个位置插入新元素,长度加1
首先判断插入位置是否合法,表是否已满,如果满了,就要重新动态分配表空间
定位到第i
个位置,将其及以后的元素依次向后移动一个元素,然后将元素e
插入到第i
个位置。从后往前移动元素。
Status InsertElement(SqList *list, int index, ElementType e)
{
ElementType *newElements, *q, *p;
if(index < 1 || index > list->length + 1)
return ERROR;
if(list->length >= list->listSize)
{
newElements = realloc(list->elements, (list->listSize + LIST_INCREMENT) * sizeof(ElementType));
if(!newElements)
return ERROR;
list->elements = newElements;
list->listSize = list->listSize + LIST_INCREMENT;
}
q = list->elements + index - 1;
for(p = list->elements + list->length; p >= q; --p)
*(p + 1) = *p;
*q = e;
++list->length;
return OK;
}
删除指定坐标元素
删除操作就是将顺序表的第i
个位置元素删除,长度减1
首先判断删除位置是否合法
定位第i
个位置,将从第i+1
位置及以后的元素依次往前移动,覆盖前一个元素。记住从前往后移动。
Status DeleteElement(SqList *list, int index, ElementType *e)
{
ElementType *p;
if(index < 1 || index > list->length)
return ERROR;
p = list->elements + index - 1;
*e = *p;
for(; p <= list->elements + list->length; ++p)
*p = *(p + 1);
--list->length;
return OK;
}
清空线性表
Status ClearList(SqList* list)
{
list->length = 0;
return OK;
}
销毁线性表
Status DestroyList(SqList *list)
{
free(list->elements);
list->elements = NULL;
list->length = 0;
list->listSize = 0;
}
输出线性表
Status printSqList(SqList *list)
{
for(int i = 0; i < list->length; ++i)
printf("%d\t", list->elements[i]);
printf("\n");
return OK;
}
测试
int main()
{
SqList list;
InitList(&list);
printf("%d\n", IsEmpty(&list));
printSqList(&list);
for(int i = 0; i < 5; ++i)
InsertElement(&list, 1, i);
printSqList(&list);
printf("%d\n", GetLength(&list));
InsertElement(&list, 6, 10);
printSqList(&list);
ElementType e;
GetElement(&list, 2, &e);
printf("%d\n", e);
DeleteElement(&list, 3, &e);
printSqList(&list);
printf("%d\n", e);
ClearList(&list);
printSqList(&list);
return 0;
}