顺序表

一、顺序表简述

按顺序方式存储的线性表称为顺序表(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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值