一、顺序表简述
按顺序方式存储的线性表称为顺序表(sequen list),通过创建数组来建立。顺序表中的每个数据元素按其顺序有唯一的索引值,又称为下标值,可以方便地访问数据元素内容。
1、顺序表的定义:
线性表的顺序存储结构是指将线性表的所有数据元素,按其逻辑顺序一次 存储在一组连续的内存单元中,用这种存储形式存储的线性表称为顺序表。
2、顺序表的特点:
逻辑关系相邻的两个数据元素在物理位置上也相邻,即利用存储位置上的相邻实现数据元素之间的逻辑相邻关系。
3、图解顺序表:
二、定长顺序表
#pragma once
#define LISTSIZE 10
//声明顺序表存储结构的数据元素类型
typedef int ElemType;
//顺序表结构
typedef struct FixedSeqList
{
ElemType data[LISTSIZE];
int length;
}FixedSeqList, *pFixedSeqList;
//对于顺序表的初始化
void InitFixedSeqList(pFixedSeqList list);
//pos位置插入val值
int InsertFixedSeqListPos(pFixedSeqList list, ElemType val, int pos);
int InsertFixedSeqListHead(pFixedSeqList list, ElemType val);
int InsertFixedSeqListTail(pFixedSeqList list, ElemType val);
//打印顺序表
void ShowFixedSeqList(pFixedSeqList list);
//pos位置删除
int DeleteFixedSeqListPos(pFixedSeqList list, int pos);
int DeleteFixedSeqListHead(pFixedSeqList list);
int DeleteFixedSeqListTail(pFixedSeqList list);
//val值删除
int DeleteFixedSeqListVal(pFixedSeqList list, ElemType val);
int DeleteFixedSeqListVal1(pFixedSeqList list, ElemType val);
//清空顺序表
void ClearFixedSeqList(pFixedSeqList list);
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include"FixedSeqList.h"
//判断是否为空
static void DeterPointIsNULL(pFixedSeqList list)
{
assert(list != NULL);
if (NULL == list)
{
printf("List is NULL, Please check\n");
exit(0);
}
}
//对于顺序表的初始化
void InitFixedSeqList(pFixedSeqList list)
{
DeterPointIsNULL(list);
list->length = 0;
}
//pos位置插入val值
int InsertFixedSeqListPos(pFixedSeqList list, ElemType val, int pos)
{
DeterPointIsNULL(list);
if (pos < 0 || pos > list->length > 0)
{
printf("Pos is out of range, Please check\n");
return 0;
}
if (list->length > LISTSIZE)
{
printf("List is full,insert error\n");
return 0;
}
for (int i = list->length; i > pos - 1; --i)
{
list->data[i + 1] = list->data[i];
}
list->data[pos] = val;
list->length++;
return 1;
}
int InsertFixedSeqListHead(pFixedSeqList list, ElemType val)
{
return InsertFixedSeqListPos(list, val, 0);
}
int InsertFixedSeqListTail(pFixedSeqList list, ElemType val)
{
//因为后面需要访问 list->length 所以需要判断
DeterPointIsNULL(list);
return InsertFixedSeqListPos(list, val, list->length);
}
//打印顺序表
void ShowFixedSeqList(pFixedSeqList list)
{
DeterPointIsNULL(list);
for (int i = 0; i < list->length; ++i)
{
printf("%d ", list->data[i]);
}
printf("\n");
}
//删除
int DeleteFixedSeqListPos(pFixedSeqList list, int pos)
{
DeterPointIsNULL(list);
if (pos < 0 || pos >= list->length)
{
printf("Pos is out of range, Please check\n");
return 0;
}
for (int i = pos; i < list->length - 1; ++i)
{
list->data[i] = list->data[i + 1];
}
list->length--;
return 1;
}
int DeleteFixedSeqListHead(pFixedSeqList list)
{
return DeleteFixedSeqListPos(list, 0);
}
int DeleteFixedSeqListTail(pFixedSeqList list)
{
//因为后面需要访问 list->length 所以需要判断
DeterPointIsNULL(list);
return DeleteFixedSeqListPos(list, list->length - 1);
}
int DeleteFixedSeqListVal(pFixedSeqList list, ElemType val)
{
DeterPointIsNULL(list);
int i = 0,
j = 0;
while (j < list->length)
{
if (list->data[j] == val)
{
//跳过val
j++;
}
else
{
list->data[i++] = list->data[j++];
}
}
list->length = i;
return 1;
}
int DeleteFixedSeqListVal1(pFixedSeqList list, ElemType val)
{
DeterPointIsNULL(list);
for (int i = 0; i < list->length; ++i)
{
if (list->data[i] == val)
{
DeleteFixedSeqListPos(list, i);
}
}
return 1;
}
//销毁
void ClearFixedSeqList(pFixedSeqList list)
{
DeterPointIsNULL(list);
list->length = 0;
}
三、不定长顺序表
#pragma once
#define APPENDSIZE 10
typedef int ElemType;
typedef struct SeqList
{
ElemType *data;
int length;
int listsize;
}SeqList, *pSeqList;
void InitSeqList(pSeqList list);
int InsertSeqListPos(pSeqList list, ElemType val, int pos);
int InsertSeqListHead(pSeqList list, ElemType val);
int InsertSeqListTail(pSeqList list, ElemType val);
void ShowSeqList(pSeqList list);
int DeleteSeqListPos(pSeqList list, int pos);
int DeleteSeqListHead(pSeqList list);
int DeleteSeqListTail(pSeqList list);
int DeleteSeqListVal(pSeqList list, ElemType val);
void ClearSeqList(pSeqList list);
void DestorySeqList(pSeqList list);
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include"SeqList.h"
static void DeterPointIsNULL(pSeqList list)
{
assert(list != NULL);
if (list == NULL)
{
printf("list is null, Error\n");
exit(0);
}
}
//扩容 +APPENDSIZE
static void AppendSpace(pSeqList list)
{
ElemType *s = (ElemType *)malloc(sizeof(ElemType)* (list->listsize + APPENDSIZE));
assert(s != NULL);
for (int i = 0; i < list->length; ++i)
{
s[i] = list->data[i];
}
free(list->data);
list->data = s;
list->listsize += APPENDSIZE;
}
void InitSeqList(pSeqList list)
{
DeterPointIsNULL(list);
list->data = NULL;
list->length = list->listsize = 0;
}
int InsertSeqListPos(pSeqList list, ElemType val, int pos)
{
DeterPointIsNULL(list);
if (pos < 0 || pos > list->length)
{
printf("Pos is error, Insert file\n");
return 0;
}
if (list->length == list->listsize)
{
AppendSpace(list);
}
for (int i = list->length; i > pos; --i)
{
list->data[i] = list->data[i - 1];
}
list->data[pos] = val;
list->length++;
return 1;
}
int InsertSeqListHead(pSeqList list, ElemType val)
{
return InsertSeqListPos(list, val, 0);
}
int InsertSeqListTail(pSeqList list, ElemType val)
{
DeterPointIsNULL(list);
return InsertSeqListPos(list, val, list->length);
}
void ShowSeqList(pSeqList list)
{
DeterPointIsNULL(list);
for (int i = 0; i < list->length; i++)
{
printf("%d ", list->data[i]);
}
printf("\n");
}
//删除
int DeleteSeqListPos(pSeqList list, int pos)
{
DeterPointIsNULL(list);
if (pos < 0 || pos >= list->length)
{
printf("Pos is out of range, Please check\n");
return 0;
}
for (int i = pos; i < list->length - 1; ++i)
{
list->data[i] = list->data[i + 1];
}
list->length--;
return 1;
}
int DeleteSeqListHead(pSeqList list)
{
return DeleteSeqListPos(list, 0);
}
int DeleteSeqListTail(pSeqList list)
{
//因为后面需要访问 list->length 所以需要判断
DeterPointIsNULL(list);
return DeleteSeqListPos(list, list->length - 1);
}
int DeleteSeqListVal(pSeqList list, ElemType val)
{
DeterPointIsNULL(list);
int i = 0,
j = 0;
while (j < list->length)
{
if (list->data[j] == val)
{
//跳过val
j++;
}
else
{
list->data[i++] = list->data[j++];
}
}
list->length = i;
return 1;
}
//清空
void ClearSeqList(pSeqList list)
{
DeterPointIsNULL(list);
list->length = 0;
}
//销毁
void DestorySeqList(pSeqList list)
{
DeterPointIsNULL(list);
free(list->data);
list->data = NULL;
list->length = list->listsize = 0;
}