线性表之顺序表

该文详细介绍了线性表中的顺序表数据结构,包括其逻辑和物理结构特点。通过C语言实现了顺序表的初始化、销毁、尾部插入与删除、头部插入与删除等基本操作,并提供了容量检查和动态扩容功能。此外,还包括了对顺序表的查找、插入和删除数据的示例代码。
摘要由CSDN通过智能技术生成

线性表

线性表 (inear ist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字务串…
线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

顺序表


概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表就是数组,但是再数组的基础上,它还要求数据是连续存储的,不能跳跃间隔

顺序表的实现

seqlist.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>







typedef int SLDataType;



//动态顺序表
typedef struct SeqList
{
	SLDataType* a;
	int size;//储存了多少数据
	int capacity;//数组实际能存储数据的大小
}SL;







//接口函数---命名风格是跟着STL走的,方便学习STL
//初始化
void SeqListInit(SL* ps);
//释放空间
void SeqListDistory(SL* ps);
//尾插(一个数据)
void SeqListPushBack(SL* ps, SLDataType x);
//尾删(一个数据)
void SeqListPopBack(SL* ps);
//头插(一个数据)
void SeqListPushFront(SL* ps, SLDataType x);
//头删(一个数据)
void SeqListPopFront(SL* ps);
//打印检查
void SeqListprintf(SL* ps);
//容量检查
void Seqlistcheckcapacity(SL* ps);
//找到了返回x的下标,没有找打印错误信息
void SeqListFind(SL* ps);
//指定位置下标位置开始插入
void SeqListInsert(SL* ps);
//删除pose下标位置的数据
void SeqListErase(SL* ps);
连续头插输入
void ConstantInsert1(SL* ps);
//连续尾插输入
void ConstantInsert2(SL* ps);
seqlist.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"

//初始化
void SeqListInit(SL* ps)
{
	ps->a = NULL;
	ps->capacity = ps->size = 0;
}
//释放空间
void SeqListDistory(SL* ps)
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->size = 0;
}
//尾插(一个数据)
void SeqListPushBack(SL* ps, SLDataType x)
{
	//如果没有空间或空间不足,那我们就扩容
	Seqlistcheckcapacity(ps);
	ps->a[ps->size] = x;
	ps->size++;
}
//尾删(一个数据)
void SeqListPopBack(SL* ps)
{
	assert(ps->size > 0);
	ps->size--;
	printf("删除成功\n");
}

//头插(一个数据)
void SeqListPushFront(SL* ps, SLDataType x)
{
	
	Seqlistcheckcapacity(ps);
	int end = ps->size - 1;
	while (end >=0)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[0] = x;
	ps->size++;

}
//头删(一个数据)
void SeqListPopFront(SL* ps)
{
	int begin = 1;
	assert(ps->size >0);
	while (begin < ps->size)
	{
		ps->a[begin - 1] = ps->a[begin];
		begin++;
	}
	ps->size--;
	printf("删除成功\n");
}
//打印检查
void SeqListprintf(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d	", ps->a[i]);
	}
	printf("\n");
}

//容量检查
void Seqlistcheckcapacity(SL* ps)
{
	if (ps->size == ps->capacity)
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(int));
		if (tmp == NULL)
		{
			perror("realoc:");
			exit(-1);
		}

		ps->a = tmp;
		ps->capacity = newcapacity;
	}
	//printf("扩容成功\n");
}

//找到了返回x的下标,没有找到打印错误信息
void SeqListFind(SL* ps)//遍历
{
	SLDataType x;
	printf("请输入要查找的数据:");
	if(scanf("%d",&x)!=0)
	for (int i = 0; i < ps->size; i++)
	{
		if (ps->a[i] == x)
			printf("找到了下标是%d\n",i);
	}
	printf("没找到\n");
}

//指定位置下标位置开始插入
void SeqListInsert(SL* ps)
{
	SLDataType x;
	int pos;
	printf("请输入要插入的位置和数据:");
	scanf("%d%d", &pos, &x);
	Seqlistcheckcapacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->a[end + 1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;
	ps->size++;
}

//删除pose位置的数据
void SeqListErase(SL* ps)
{
	int pos;
	printf("亲输入要删除数据的位置:");
	scanf("%d", &pos);
	assert(ps->size>0);
	while (pos <= ps->size - 1)
	{
		ps->a[pos] = ps->a[pos + 1];
		pos++;
	}
	ps->size--;
}


//连续头插输入
void ConstantInsert1(SL*ps)
{
	int a;
	printf("亲输入数据,以”0“结束输入\n");
	do
	{
		scanf("%d", &a);
		SeqListPushFront(ps, a);

	} while (a);
	
}


//连续尾插输入
void ConstantInsert2(SL* ps)
{
	int a;
	printf("亲输入数据,以”0“结束输入\n");
	do
	{
		scanf("%d", &a);
	
		SeqListPushBack(ps, a);
	} while (a);
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"


void seqlisttest()
{
	SL s1;
	SeqListInit(&s1);


	SeqListPushBack(&s1, 1);
	SeqListPushBack(&s1, 2);
	SeqListPushBack(&s1, 4);
	
	SeqListFind(&s1);



	SeqListprintf(&s1);
	SeqListDistory(&s1);
}
void Menu()
{
	printf("---------------------------\n");
	printf("---------顺序表------------\n");
	printf("----1.头插------2.尾插-----\n");
	printf("----3.查找------4.定点插---\n");
	printf("----5.定点删----6.打印-----\n");
	printf("-------**-1.退出**---------\n");
	printf("---------------------------\n");
 }
int main()
{
	int input;
	SL ss;
	SeqListInit(&ss);
	do
	{
		Menu();
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			ConstantInsert1(&ss);
			break;
		case 2:
			ConstantInsert2(&ss);
			break;
		case 3:
			SeqListFind(&ss);
			break;
		case 4:
			SeqListInsert(&ss);
			break;
		case 5:
			SeqListErase(&ss);
			break;
		case 6:
			SeqListprintf(&ss);
			break;
		case -1:
			SeqListDistory(&ss);
			exit(0);
		default:
			printf("输入错误,请再次输入\n");
			break;

		}
	} while (input);
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值