首页 > 其他分享 >数据结构:顺序表

数据结构:顺序表

时间:2024-12-03 12:32:59浏览次数:11  
标签:newcapcity 顺序 cl int realloc capcity 数据结构 size

1.顺序表的组成。 

1.静态顺序表(固定的元素大小)

静态顺序表的组成如下图代码所示,由一个数组和其大小组成。数组长度固定,size是有效位数。

typedef struct cl{
	int arr[10];
	int size;
	
}cl;

2.动态顺序表(元素随时可以增加)

动态顺序表的组成代码由下图:

typedef struct cl{
	int *a;
	int size;
	int capcity;
}cl;

typedef将 struct cl类型重命名为cl,以后初始化结构体只用写cl即可,不用写struct cl cl。这里使用指针可以继续增加空间容量。size存放目前拥有的数据的大小,capcity存放整个数据的大小。

2.顺序表的操作

 1.尾插(在数据尾部插入数字)

typedef struct cl{
	int *a;
	int size;
	int capcity;
}cl;
void pushback(cl*p,int x)
{
	if((p->size)<(p->capcity));
	{
			p->a[p->size]=x;//目前由size个元素,直接插入在size后面的个数,就直接尾部插入。
			++p->size;//size发生改变
	}
	if(p->size==p->capcity)
	{
		int newcapcity=p->capcity==0?4:2*p->capcity;//如果capcity等于0是成立的,那么其被赋值为4,
			//不然就返回2*newcapcity,此方法是为了避免capcity=0;
		int *s=(int *)realloc(p->a,newcapcity*sizeof(int));//一般扩容是扩大二倍	
		if(s==NULL)//为了避免realloc开辟失败
		{
			perror("realloc fail");
			exit(1);
		}
		else{
			p->a=s;
		}
		p->capcity=newcapcity;
	}

}
int main()
{
	cl s1={NULL,0,0};
	pushback(&s1,s1.size);
}

 尾插代码比较复杂,详细解释如下:

对于尾插操作我们首先应该判断的是是否还有足够的空间给我们进行插入,那么就应该判断size和capcity到底谁大谁小了,所以在函数中我们先进行两次if判断如下:

1.如果空间足够那么直接插入即可:

目前有size个元素,那么数组存储到size-1,直接另p->a[p->size]=x;再让size++一下。

2.如果空间不够用,此种情况比较复杂:

需要先使用realloc函数进行扩容,再进行插入。我们扩容时一般是扩容原本大小的二倍,所以应该返回2*capcity,但是有capcity是0的情况的可能,所以我们先写一个多目操作符。

int newcapcity=p->capcity==0?4:2*p->capcity;意思是先判断capcity是不是0,如果是就返回4,如果不是返回2*capcity,最后再用newcapcity和realloc函数来开辟空间。

但是使用realloc有可能会开辟失败,所以我们要判断用来接受的新指针s是否为空指针,如果是的话直接打印错误,退出程序,如果不是就重复上述操作。

2.头插

1.顾名思义是再顺序表头部插入一个数字。代码如下

typedef struct cl{
	int *a;
	int size;
	int capcity;
}cl;
void checkcapcity(cl *p)
{

		if(p->size>=p->capcity)

		{
			int newcapcity=p->capcity==0?4:2*p->capcity;//如果capcity等于0是成立的,那么其被赋值为4,
				//不然就返回2*newcapcity,此方法是为了避免capcity=0;
			int *s=(int *)realloc(p->a,newcapcity*sizeof(int));//一般扩容是扩大二倍	
		}
}
void pushforward(cl *p,int k)
{
	checkcapcity(p);//直接调用函数就ok
	for(int i=p->size;i<0;i--){
		
		p->a[i]=p->a[i-1];//将所有数据右移一位
	}	
	p->a[0]=k;
	p->size++;
}

//void pushback(cl*p,int x)
//{
//	if((p->size)<(p->capcity));
//	{
//			p->a[p->size]=x;//目前由size个元素,直接插入在size后面的个数,就直接尾部插入。
//			++p->size;//size发生改变
//	}
//	if(p->size==p->capcity)
//	{
//		int newcapcity=p->capcity==0?4:2*p->capcity;//如果capcity等于0是成立的,那么其被赋值为4,
//			//不然就返回2*newcapcity,此方法是为了避免capcity=0;
//		int *s=(int *)realloc(p->a,newcapcity*sizeof(int));//一般扩容是扩大二倍	
//		if(s==NULL)//为了避免realloc开辟失败
//		{
//			perror("realloc fail");
//			exit(1);
//		}
//		else{
//			p->a=s;
//		}
//		p->capcity=newcapcity;
//	}
//
//}
int main()
{
	cl s1={NULL,0,0};
	pushback(&s1,s1.size);
}

主要看pushfoward的部分,将上述检查capcity是否足够大和capcity是否为0的操作封装为一个函数,直接调用,再将a中每个元素右移一位,最后将元素插入p->a[0]的位置。

pushback部分已经屏蔽。

标签:newcapcity,顺序,cl,int,realloc,capcity,数据结构,size
From: https://blog.csdn.net/2401_86499491/article/details/144197876

相关文章

  • 数据结构实训——查找
    声明: 以下是我们学校在学习数据结构时进行的实训,如涉及侵权马上删除文章声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。一、实训类型  验证性实训二、实训目的与任务1.掌......
  • 数据结构实训——排序
    声明: 以下是我们学校在学习数据结构时进行的实训,如涉及侵权马上删除文章声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。实训八  排序算法实现(二)一、实训类型  验证性......
  • 【无标题】数据结构实训——线性表的链式存储
    声明: 以下是我们学校在学习数据结构时进行的实训,如涉及侵权马上删除文章声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。一、实训类型  验证性实训二、实训目的与任务1......
  • 学习数据结构之线性结构
    线性结构是一种最基本的数据结构,其中数据元素之间存在一对一的线性关系。换句话说,每个元素(除了第一个和最后一个)都有一个前驱和一个后继。线性结构的特点是数据元素可以按顺序排列,并且可以通过索引或遍历的方式访问每个元素。常见的线性结构包括:1.数组(Array)  定义:数......
  • 「Java进阶」数据结构与算法全攻略:从基础理论到实战应用
    「Java进阶」数据结构与算法全攻略:从基础理论到实战应用目录第1章绪论1.1数据结构的基础概念1.2数据结构的内容1.3算法1.4算法描述1.5算法性能评价1.5.1算法的时间性能分析1.5.2算法的空间性能分析1.5.3算法性能选择1.6数据结构与Java语言表示......
  • 数据结构与算法学习笔记----堆
    数据结构与算法学习笔记----堆@@author:明月清了个风@@lastedited:2024.12.2ps⛹从这里开始调整了文章结构,先讲解算法和数据结构基本原理,再给出例题,针对例题中的应用再讲解思路。堆堆是一种完全二叉树,常用于实现优先队列(priority_queue)等功能,可以根据堆内元素......
  • 数据结构初阶--算法复杂度(1)
    以下我用C语言实现基础的数据结构。目录初识数据结构与算法数据结构算法算法效率练习:轮转数组(不完全版)时间复杂度大O的渐进表示法例一: 例二:例三:例四:例五:总结:例六:例七:例八:阶乘递归的时间复杂度初识数据结构与算法数据结构数据结构(DataStructure)是计算......
  • 天梯赛 L2-004 这是二叉搜索树吗? 数据结构
    反思:使用指针前先分配内存。#include<bits/stdc++.h>usingnamespacestd;typedefstructnode{ intdata; structnode*left; structnode*right;}*T;queue<int>q1;queue<int>q2;queue<int>q3;Tresult;voidbuilt1(T&t,intx){ if(t==NU......
  • 数据结构(Python)
    目录1.数组(Array)2.链表(LinkedList)3.栈(Stack)4.队列(Queue)5.哈希表(HashTable)6.树(Tree)7.图(Graph)1.数组(Array)特点:连续的内存空间,支持快速随机访问。适用场景:需要频繁读取数据,但对插入、删除操作要求不高。示例:使用列表实现数组#定义一个数组array=[10,......
  • 华水967数据结构2005真题---选择题部分
    一.选择题1.在数据结构中,从逻辑上可以把数据结构分成()。A、动态结构和静态结构B、紧凑结构和非紧凑结构C、线性结构和非线性结构D、内部结构和外部结构答案:C解析:A.动态结构和静态结构:这个分类更多地涉及到数据结构的可变性,而不是其逻辑组织形式。动态结构通常指可......