数据结构线性表——顺序表、链表

本文详细介绍了线性表的概念,重点讨论了顺序表和链表这两种数据结构。顺序表通过数组实现,动态扩容可能导致空间浪费和高时间复杂度,而链表在物理存储上非连续,提供了更灵活的插入删除操作。链表分为单向、双向、带头、不带头、循环和非循环等多种类型,实际应用中常见的是带头双向循环链表。
摘要由CSDN通过智能技术生成

目录

1.线性表

​编辑 2.顺序表

 2.2接口实现

2.3 顺序表的问题和思考

3.链表

3.1 链表的概念和结构

3.2 链表的分类

3.3 不带头单向非循环链表的实现

3.4 带头双向循环链表的实现

 3.5   链表和顺序表的区别



1.线性表

线性表(linear list)是有n个相同特性的元素组成的有限序列,在逻辑上是线性结构,也就是连续的一条直线;但是在物理结构上,不一定是连续的。

常见的线性表有:

顺序表、链表、栈、队列、字符串....

 2.顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的数据结构,一般采用数组存储,在数组上完成增删查改。

顺序表一般分为:

1.静态的顺序表:使用定长数组存储元素。

define N 6
typedef int SeqListDataType;

typedef struct SeqList
{
	SeqListDataType arr[N];//创建数组
	int size;//有效元素个数
}SL;

2.动态顺序表:使用动态开辟的数组存储。

typedef int SeqListDataType;

typedef struct SeqList
{
	SeqListDataType* ps;//创建指向动态开辟数组的指针
	int size;//有效元素个数
	int capicity;//数组的容量大小
}SL;

 2.2接口实现

        由于静态数据表只适用与确定需要存储多少数据的情况,实际中一般使用动态数据表,根据数据的多寡来扩容空间,所以下面实现动态顺序表。

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SeqListDataType;

typedef struct SeqList
{
	SeqListDataType* ps;
	int size;
	int capicity;
}SL;

void SeqLIstInst(SL* ps);               //初始化

void CheckCapacity(SL* ps);	            //判断容量是否足够

void SeqLIstPushBack(SL* ps, int size);//尾插

void SeqListPrint(SL* ps);				//打印顺序表

void SeqListPopBack(SL* ps);			//顺序表尾删

void SeqListPushFront(SL* ps, int size);//顺序表头插

void SeqListPopFront(SL* ps);	        //顺序表头删

void SeqListFind(SL* ps, int x);		//顺序表查找

void SeqListInsert(SL* ps, int pos,int x);		//指定位置插入

void SeqListErase(SL* ps, int pos);				//指定位置pos删除

void SeqListDestory(SL* ps);					//销毁数据表


//-------------------------------------------------------------------------------------

void SeqLIstInst(SL* ps)						//初始化
{
	ps->ps = (SeqListDataType*)malloc(sizeof(SeqListDataType) * 4);
	if (ps->ps == NULL)
	{
		printf("申请空间失败\n");
			exit(-1);
	}
	ps->size = 0;
	ps->capicity = 4;
}

void CheckCapacity(SL* ps)				//检查顺序表满了没
{
	assert(ps);
	if (ps->capicity == ps->size)
	{
		ps->capicity *= 2;
		ps->ps=(SeqListDataType*)realloc(ps->ps	, ps->capicity*sizeof(SeqListDataType));
		if (ps->ps == NULL)
		{
			printf("增容失败\n");
			exit(-1);
		}
	}

}
void SeqLIstPushBack(SL* ps, int size)			//尾插
{
	assert(ps);
	CheckCapacity(ps);	//检查顺序表满了没
	ps->ps[ps->size] = size;
	ps->size++;
}

void SeqListPrint(SL* ps)				//打印顺序表
{
	assert(ps);
	int i = 0;
	for (; i < ps->size; i++)
	{
		printf("%d ", ps->ps[i]);
	}
	printf("\n");
}

void SeqListPopBack(SL* ps)			//顺序表尾删
{
	as
  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值