资讯专栏INFORMATION COLUMN

(C语言)实现顺序表的基本操作(注释很详细)

RobinTang / 1722人阅读

摘要:创建一个结构体用于存放顺序表相关数据有效数据个数容量初始化顺序表插入元素插入到表头插入到指定位置插入到尾部先检查容量是否够用如果空间满了,扩容增

创建一个结构体用于存放顺序表相关数据

#define SEQTYPE inttypedef struct SeqList{	SEQTYPE* data;	int size;		//有效数据个数	int capacity;	//容量}SeqList;

初始化顺序表

void SeqListInit(SeqList* pq){	CheckNull(pq);	pq->data = NULL;	pq->capacity = 0;	pq->size = 0;}

插入元素

  1. 插入到表头;
  2. 插入到指定位置;
  3. 插入到尾部;

先检查容量是否够用

void CheckCapacity(SeqList* pq){	CheckNull(pq);		//如果空间满了,扩容	if (pq->size >= pq->capacity)	{		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;		SEQTYPE* new = (SEQTYPE*)realloc(pq->data, sizeof(SEQTYPE) * newcapacity);		if (new == NULL)		{			perror("realloc");			exit(-1);		}		pq->data = new;		pq->capacity = newcapacity;	}	puts("增容成功");}//往顺序表指定位置插入数据void SeqListInsert(SeqList* pq, int pos){	CheckNull(pq);	assert(pos <= pq->size);	SEQTYPE InsertVal;	if (pos == -1)	{		printf("请分别输入添加的数据和位置,空格隔开:>");		scanf("%d %d", &InsertVal, &pos);		if (pos > pq->size)		{			printf("请正确输入/n");			return;		}	}	else	{		printf("请输入添加的数据:>");		scanf("%d", &InsertVal);	}	//检查容量是否足够	CheckCapacity(pq);	//插入数据	int end = pq->size;	int begin = pos;	while (begin < end)	{		pq->data[end] = pq->data[end - 1];		--end;	}	pq->data[pos] = InsertVal;	++pq->size;	printf("添加成功/n");}//往顺序表末位置插入数据void SeqListPushBack(SeqList* pq){	CheckNull(pq);	SeqListInsert(pq, pq->size);}//往顺序表首位置插入数据void SeqListPushFront(SeqList* pq){	CheckNull(pq);	SeqListInsert(pq, 0);}

删除元素

  1. 删除首元素;
  2. 删除指定位置元素;
  3. 删除尾部元素;
//从顺序表指定位置删除数据void SeqListErase(SeqList* pq, int pos){	CheckNull(pq);	if (pos == -1)	{		printf("请输入要删除数据的位置:>");		scanf("%d", &pos);		if (pos < 0 || pos >= pq->size)		{			printf("请正确输入/n");			return;		}	}	int begin = pos;	int end = pq->size - 1;	while (begin < end)	{		pq->data[begin] = pq->data[begin + 1];		++begin;	}	--pq->size;	puts("删除成功");}//从顺序表末位置删除数据void SeqListPophBack(SeqList* pq){	CheckNull(pq);	SeqListErase(pq, pq->size - 1);}//从顺序表首位置删除数据void SeqListPophFront(SeqList* pq){	CheckNull(pq);	SeqListErase(pq, 0);}

元素修改

  1. 找到目标元素;
  2. 直接修改该元素的值;
//修改顺序表指定位置数据void SeqListModify(SeqList* pq){	CheckNull(pq);	int pos;	SEQTYPE x;	printf("请输入修改的位置和新的数据,空格隔开:>");	scanf("%d %d", &pos, &x);	if (pos < 0 && pos >= pq->size)	{		printf("请正确输入/n");		return;	}	pq->data[pos] = x;	puts("修改成功");}

查找元素

  • 查找目标元素,算法多种,比如二分,插值等等,这里使用顺序查找算法,具体代码如下:
//查找所需数据是否存在顺序表中void SeqListFindData(SeqList* pq){	CheckNull(pq);	SEQTYPE x;	printf("请输入要查找的数据:>");	scanf("%d", &x);	for (int i = 0; i < pq->size; i++)	{		if (pq->data[i] == x)		{			printf("所需查询数据存在,下标为:>%d/n", i);			return;		}	}	printf("找不到/n");}

排序元素

//排序顺序表void SeqListSort(SeqList* pq){	CheckNull(pq);	int option = 0;	printf("输入0为升序,1为降序:>");	scanf("%d", &option);	for (int i = 0; i < pq->size - 1; i++)	{		for (int j = 0; j < pq->size - i - 1; j++)		{			if (pq->data[j] > pq->data[j + 1])			{				SEQTYPE tmp = pq->data[j];				pq->data[j] = pq->data[j + 1];				pq->data[j + 1] = tmp;			}		}	}	if (option)	{		SeqListReverse(pq);		return;	}}

元素反转

//顺序表反转void SeqListReverse(SeqList* pq){	CheckNull(pq);	int left = 0;	int right = pq->size - 1;	while (left < right)	{		SEQTYPE tmp = pq->data[left];		pq->data[left] = pq->data[right];		pq->data[right] = tmp;		++left;		--right;	}}

源码

  • 以上是顺序表常用的功能操作,下面附上完整代码,VS2019环境

SeqList.c

#include "SeqList.h"void CheckNull(SeqList* pq){	if (pq == NULL)	{		perror("pq::");		exit(-1);	}}//初始化顺序表void SeqListInit(SeqList* pq){	CheckNull(pq);	pq->data = NULL;	pq->capacity = 0;	pq->size = 0;}void SeqListDestory(SeqList* pq){	CheckNull(pq);	free(pq->data);	pq->data = NULL;	pq->size = 0;	pq->capacity = 0;}void CheckCapacity(SeqList* pq){	CheckNull(pq);		//如果空间满了,扩容	if (pq->size >= pq->capacity)	{		int newcapacity = pq->capacity == 0 ? 4 : pq->capacity * 2;		SEQTYPE* new = (SEQTYPE*)realloc(pq->data, sizeof(SEQTYPE) * newcapacity);		if (new == NULL)		{			perror("realloc");			exit(-1);		}		pq->data = new;		pq->capacity = newcapacity;	}	puts("增容成功");}void SeqListPrint(SeqList* pq){	CheckNull(pq);	if (pq->size == 0)		printf("/n");	else	{		for (int i = 0; i < pq->size; i++)		{			printf("%d ", pq->data[i]);		}		puts("/n--------------------------------------");	}}//往顺序表末位置插入数据void SeqListPushBack(SeqList* pq){	CheckNull(pq);	SeqListInsert(pq, pq->size);}//往顺序表首位置插入数据void SeqListPushFront(SeqList* pq){	CheckNull(pq);	SeqListInsert(pq, 0);}//往顺序表指定位置插入数据void SeqListInsert(SeqList* pq, int pos){	CheckNull(pq);	assert(pos <= pq->size);	SEQTYPE InsertVal;	if (pos == -1)	{		printf("请分别输入添加的数据和位置,空格隔开:>");		scanf("%d %d", &InsertVal, &pos);		if (pos > pq->size)		{			printf("请正确输入/n");			return;		}	}	else	{		printf("请输入添加的数据:>");		scanf("%d", &InsertVal);	}	//检查容量是否足够	CheckCapacity(pq);	//插入数据	int end = pq->size;	int begin = pos;	while (begin < end)	{		pq->data[end] = pq->data[end - 1];		--end;	}	pq->data[pos] = InsertVal;	++pq->size;	printf("添加成功/n");}//从顺序表指定位置删除数据void SeqListErase(SeqList* pq, int pos){	CheckNull(pq);	if (pos == -1)	{		printf("请输入要删除数据的位置:>");		scanf("%d", &pos);		if (pos < 0 || pos >= pq->size)		{			printf("请正确输入/n");			return;		}	}	int begin = pos;	int end = pq->size - 1;	while (begin < end)	{		pq->data[begin] = pq->data[begin + 1];		++begin;	}	--pq->size;	puts("删除成功");}//从顺序表末位置删除数据void SeqListPophBack(SeqList* pq){	CheckNull(pq);	SeqListErase(pq, pq->size - 1);}//从顺序表首位置删除数据void SeqListPophFront(SeqList* pq){	CheckNull(pq);	SeqListErase(pq, 0);}//修改顺序表指定位置数据void SeqListModify(SeqList* pq){	CheckNull(pq);	int pos;	SEQTYPE x;	printf("请输入修改的位置和新的数据,空格隔开:>");	scanf("%d %d", &pos, &x);	if (pos < 0 && pos >= pq->size)	{		printf("请正确输入/n");		return;	}	pq->data[pos] = x;	puts("修改成功");}//查找顺序表指定位置数据void SeqListFindPos(SeqList* pq){	CheckNull(pq);	int pos;	printf("请输入要查找数据的位置:>");	scanf("%d", &pos);	if (pos < 0 && pos >= pq->size)	{		printf("请正确输入/n");		return;	}	for (int i = 0; i < pq->size; i++)	{		if (pq->data[i] == pq->data[pos])		{			printf("查找位置的数据为:>%d/n", pq->data[pos]);			break;		}	}}//查找所需数据是否存在顺序表中void SeqListFindData(SeqList* pq){	CheckNull(pq);	SEQTYPE x;	printf("请输入要查找的数据:>");	scanf("%d", &x);	for (int i = 0; i < pq->size; i++)	{		if (pq->data[i] == x)		{			printf("所需查询数据存在,下标为:>%d/n", i);			return;		}	}	printf("找不到/n");}//排序顺序表void SeqListSort(SeqList* pq){	CheckNull(pq);	int option = 0;	printf("输入0为升序,1为降序:>");	scanf("%d", &option);	for (int i = 0; i < pq->size - 1; i++)	{		for (int j = 0; j < pq->size - i - 1; j++)		{			if (pq->data[j] > pq->data[j + 1])			{				SEQTYPE tmp = pq->data[j];				pq->data[j] = pq->data[j + 1];				pq->data[j + 1] = tmp;			}		}	}	if (option)	{		SeqListReverse(pq)
            
                     
             
               

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122330.html

相关文章

  • 数据结构--顺序表的c语言实现(超详细注释/实验报告)

    摘要:数据结构顺序表的语言实现超详细注释实验报告知识小回顾线性表是一种最基本最常用的数据结构,它有两种存储结构顺序表和链表。顺序表是由地址连续的的向量实现的,便于实现随机访问。 ...

    Fourierr 评论0 收藏0
  • 数据结构--单链表的c语言实现(超详细注释/实验报告)

    摘要:数据结构单链表的语言实现超详细注释实验报告知识小回顾在顺序表中,用一组地址连续的存储单元来一次存放线性表的结点,因此结点的逻辑顺序和物理顺序是一致的。求单链表的长度。算法思想采用数结点的方法求出带头结点单链表的长度。 ...

    andong777 评论0 收藏0
  • 单链表的介绍和基本操作C语言实现)【保姆级别详细教学】

    单链表的基本操作【超详细备注和解释】 先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️ 强烈建议本篇收藏后再食用 文章目录 单链表基本介绍基本结构与顺序表的区别以及学习单链表的必要性 单链表的实现结点的定义以及头指针的创建单链表的遍历(打印接口的实现)【重点】开辟结点接口尾插接口尾删接口头插接口...

    王陆宽 评论0 收藏0
  • [数据结构]——线性表总结(c语言代码实现)爆肝两万字!

    摘要:它是学习其他数据结构的基础。其中,用顺序存储结构表示的是顺序表,用链式存储结构表示的是链表。头插循环三要素,初始条件,,结束条件,,迭代过程。 线性表总结 文章目...

    Lavender 评论0 收藏0
  • MySQL学习记录

    摘要:主键主要是用于其他表的外键关联,以及本记录的修改与删除。王匹配的是字段结尾为王的所有记录王匹配的是字段开头为王的所有记录王匹配的是字段包含王的所有记录表示任何单个字符,匹配单个任意字符,它常用来限制表达式的字符长度。 什么是数据库? 数据库Database是按照数据结构来组织、存储和管理数据的仓库。常见的数据库有Oracle、DB2、SQL Server、MySQL等... MySQL...

    琛h。 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<