【数据结构——顺序表三种数据结构差异】

数据结构——顺序表的三种数据结构

数据结构:就是数据之间的关系。
数据结构的关系:一对多,多对多,集合,网络

顺序表的三种数据结构

第一种顺序表数据结构

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
//第一种设计方式
#define SEQSIZE 100 //定义一个宏,后面调用SEQSIZE都可以替换成100
typedef int ElemType;//将int重命名为ElemType

typedef struct
{
   
	ElemType data[SEQSIZE];
	int cursize;
}SeqList;

//初始化
void InitList(SeqList *list)
{
   
	list->cursize = 0;
}
bool push_back(SeqList *list,ElemType value)
{
   
	//检查顺序表是否已满
	if(list->cursize == SEQSIZE)
	{
   
		printf("顺序表已满");
		return false;
	}
	list->data[list->cursize]= value;
	list->cursize += 1;
	return true;
}
//销毁
void DestroyList(SeqList *list)
{
   
//其实可以不进行销毁,因为此时的数组是临时变量,当SeqList实例销毁,list也会被销毁
	list->cursize = 0;
}
int main()
{
   
	int value = 0;
	SeqList mylist;
	InitList(&mylist);
	for(int i = 0;i<10;i++)
	{
   
		push_back(&mylist,i);
	}
	DestroyList(&mylist);
}

第二种顺序表数据结构

#include <stdio.h>
#include<stdlib.h>

//第二种设计方式
#define SEQSIZE 100
#define INCSIZE 2 //顺序表空间不足时,每次增加的空间数量
typedef int ElemType;
typedef struct 
{
   
	ElemType* data;
	int cursize;//已存储的元素数量
	int maxsize;//能够存储的最大数量
}SeqList;
//初始化
void InitList(SeqList *list)
{
   
	list->data = (ElemType*)malloc(sizeof(ElemType)*(SEQSIZE));
	if (!list->data)
	{
   
		exit(EXIT_FAILURE);//如果分配失败则退出程序
	}
	list->cursize = 0;
	list->maxsize = SEQSIZE;
}
bool push_back(SeqList *list,ElemType value)
{
   
	if(list->cursize == list->maxsize)
	{
   
		printf("顺序表已满");
		return false;
	}
	list->data[list->cursize]=value;
	list->cursize ++;
	return true;
}
void DestroyList(SeqList *list)
{
   
	free(list->data);
	list->data = NULL;
	list->cursize =0;
	list->maxsize = 0;
}
int main()
{
   
	SeqList mylist;
	InitList(&mylist);
	for(int i = 0;i<10;i++)
	{
   
		push_back(&mylist,i);
	}
	DestroyList(&mylist);
}

第三种顺序表数据结构

//第三种设计方式
#include <stdio.h>
#include <stdlib.h>

#define SEQSIZE 100
#define INCSIZE 2
typedef int ElemType;
typedef struct
{
   
	ElemType* first;
	ElemType* last;
	ElemType* end;	
}SeqList;
void InitList(SeqList *list)
{
   
	list->first = (ElemType*)malloc(sizeof(ElemType)*SEQSIZE);
	if(!list->first)
	{
   
		exit(EXIT_FAILURE);
	}
	list->last = list->first;
	list->end = list->first + SEQSIZE;
}
bool push_back(SeqList *list,ElemType value)
{
   
	if(list->last == list->end)
	{
   
		printf("顺序表已满");
		return false;
	}
	*(list->last)=value;
	list->last ++;
	return true;
}
void DestroyList(SeqList *list)
{
   
	free(list->first);
	list->first = NULL;
	list->last = NULL;
	list->end = NULL;
}
int main()
{
   
	SeqList mylist;
	InitList(&mylist);
	for(int i = 0;i<10;i++)
	{
   
		push_back(&mylist,i);
	}
	 DestroyList(&mylist);
	 return 0}

顺序表的三种数据结构使用差异

初始化InitList、摧毁DestroyList、尾插法Push_back来比较三者差异。

数据结构 InitList
第一种 只需要定义cursize
第二种 需要动态申请内存,还需要定义cursize
第三种 需要动态申请内存,需要定义last、end指向
数据结构 DestroyList
第一种 因为是变量,当调用结束,结构体直接释放内存,只需要将cursize置为空。
第二种 动态生成的空间,需要free内存,并且需要将指针置为空(防止空悬指针)。
第三种 动态生成的空间,需要free内存,并且需要将指针置为空(防止空悬指针)。需要将其他指针置为空(可选)。
数据结构 Push_back
第一种 因为是数组,直接存在末尾位置,当前元素数量+1
第二种 动态生成空间可以看成存在当前末尾位置,当前元素数量+1
第三种 动态生成空间,数据存储在当前元素指针指向的最后一个位置,指针位置+1
数据结构 优点 缺点
第一种 便捷简单,不需要动态内存管理 申请空间多了,占内存;申请空间少了,放不下,不能动态扩容
第二种 可以扩容,扩容只需要更改maxsize的数量,相比较第三种更好管理 需要动态管理内存
第三种 可以扩容 扩容时first、last、end指针都需要更改,比较麻烦

相关推荐

  1. 数据结构——顺序数据结构差异

    2024-02-21 09:46:01       34 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-21 09:46:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-21 09:46:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-21 09:46:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-21 09:46:01       20 阅读

热门阅读

  1. zookeeper动态扩缩容(无需重启)

    2024-02-21 09:46:01       24 阅读
  2. 物联网平台构成与边缘计算

    2024-02-21 09:46:01       26 阅读
  3. 从查字典到查网络再到查大语言模型

    2024-02-21 09:46:01       32 阅读
  4. 单精度(float)和双精度(double)的区别

    2024-02-21 09:46:01       34 阅读
  5. Go 空切片与nil切片

    2024-02-21 09:46:01       33 阅读
  6. 区块链笔记(二)

    2024-02-21 09:46:01       31 阅读