首页 > 其他分享 >【C语言数据结构】EP1顺序表

【C语言数据结构】EP1顺序表

时间:2022-11-03 15:05:10浏览次数:88  
标签:sz int void C语言 EP1 Sqlist 数据结构 ptr con

1.什么是顺序表

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组 上完成数据的增删查改。 顺序表一般可以分为静态表与动态表

1.静态顺序表

#define S 100
typedef int Sqlinstdate;
typedef struct Sqlist
{
	Sqlinstdate con[S];
	int sz;
}Sqlist;

静态顺序表中我们使用定长数组来存储数据,所存储的数据不能超过最开始开辟的数组的大小,很多时候并无法满足我们的需求,所以我们更多的使用的是动态开辟的顺序表

2.动态顺序表

typedef int Sqlinstdate;
typedef struct Sqlist
{
	Sqlinstdate* con;
	int sz;
	int capacity;
}Sqlist;

我们使用指针来指向动态开辟的空间,sz记录表中数据的个数,capacity记录表的容量。

这样当表的容量不足时我们可以进一步扩容.

2.实现一个顺序表

对于一个表格我们需要实现他的增删查改,我们可以现在头文件中留好对应功能函数的接口,再在我们的源文件中去实现

#pragma once
#include <assert.h>
#include <stdlib.h>
#define InitCapacity 3
typedef int Sqlinstdate;
typedef struct Sqlist
{
	Sqlinstdate* con;
	int sz;
	int capacity;
}Sqlist;
void Sqlistinit(Sqlist* ptr);//表的初始化
void SqlistDestory(Sqlist* ptr);//表的销毁
void SqlistCheack(Sqlist* ptr);//检查是否已满,已满进行增容
void SqlistInsert(Sqlist* ptr,int x,Sqlinstdate z);//插入数据
void SqlistPrint(Sqlist* ptr);//打印表
void SqlistDel(Sqlist* ptr, int z);//删除
void SqlistFind(Sqlist* ptr, Sqlinstdate z);//查找
void SqlistChange(Sqlist* ptr, int x, Sqlinstdate z);//更改

1.初始化,检查,打印,销毁

void Sqlistinit(Sqlist* ptr)
{
	assert(ptr);
	ptr->capacity = InitCapacity;
	ptr->sz = 0;
	ptr->con = malloc(sizeof(Sqlinstdate)*(ptr->capacity));
}

当我们检查到容量不足时需要进行扩容,扩容时扩容太少频繁进行扩容会导致效率的损耗,而扩容过多又会导致空间的浪费,这里我选择让它每次扩容到原来的二倍

void SqlistCheack(Sqlist* ptr)
{
	assert(ptr);
	if (ptr->capacity == ptr->sz)
	{
		ptr->capacity *= 2;
		Sqlinstdate* pptr = realloc(ptr->con, sizeof(Sqlinstdate) * ptr->capacity);
		assert(pptr);
		ptr->con = pptr;
	}
}
void SqlistDestory(Sqlist* ptr)
{
	assert(ptr);
	free(ptr->con);
	ptr->con = NULL;
}

```c
void SqlistPrint(Sqlist* ptr)
{
	assert(ptr);
	for (int i = 0; i < ptr->sz; i++)
	{
		printf("%d ", ptr->con[i]);
	}
	printf("\n");
}

assert的作用是当条件为假时会中止程序并报错,我用它来检查所传递的指针是否为空,当然你也可以用if()来进行判断

2.插入

注意顺序表中数据必须从头开始连续存放 这里我们大致思考一下表中没有数据,在中间插入,在头部插入,在尾部插入的情况 没有数据时当我们放入数据时只能放到第一位,在中间插入和在头部插入是同一种情况都需要将插入位置开始的数据往后挪动一位

void SqlistInsert(Sqlist* ptr, int x,Sqlinstdate z)//x为插入的位置,z为插入的数据
{
	assert(ptr);
	if (ptr->sz==0)
	{
		ptr->sz++;
		ptr->con[0] = z;
	}
	else if (x >= 0 && x < ptr->sz)
	{
		ptr->sz++;
		for(int i = ptr->sz-1; i>x; i--)
		{
			ptr->con[i] = ptr->con[i - 1];
		}
		ptr->con[x] = z;
	}
	else
	{
		ptr->sz++;
		ptr->con[x] = z;
	}
}

注意当你写完一个程序之后先进行一下测试确定该模块的功能没有问题,我们先在最开写好输出函数的目的也是为了方便测试。 对于我们顺序表需要的头插尾插功能都可以通过调用这个函数来实现。 例如头插函数,我们不做更多演示,以讲解思路为主

SqlistFrontPush(Sqlist* ptr)
{
     assert(ptr);
     SqlistInsert(ptr,ptr->sz);
}

3.删除

void SqlistDel(Sqlist* ptr,int x)
{
	assert(ptr);
	if (x < ptr->sz)
	{
		ptr->sz--;
		for (int i = x; i < ptr->sz; i++)
		{
			ptr->con[i] = ptr->con[i + 1];
		}
	}
}

4. 查询

遍历顺序表即可

void SqlistFind(Sqlist* ptr,Sqlinstdate z)
{
	int sum = 0;
	for (int i = 0; i < ptr->sz; i++)
	{
		if (ptr->con[i] == z)
		{
			sum++;
			printf("下标为%d的位置\n", i);
		}
	}
	if (sum == 0)
		printf("未找到");
}

5.改

修改对应位置的数据即可

void SqlistChange(Sqlist* ptr, int x, Sqlinstdate z)
{
	assert(ptr);
	if (x >= 0 && x < ptr->sz)
	{
		ptr->con[x] = z;
	}
}

标签:sz,int,void,C语言,EP1,Sqlist,数据结构,ptr,con
From: https://blog.51cto.com/u_15572441/5817825

相关文章

  • 【数据结构与算法】有向图的拓扑排序
    前言在现实生活中,我们经常会同一时间接到很多任务去完成,但是这些任务的完成是有先后次序的。以我们学习java学科为例,我们需要学习很多知识,但是这些知识在学习的过程中是需要......
  • 《STM32MP1 M4裸机HAL库开发指南》第十二章 C语言LED灯实验
    第十二章C语言LED灯实验为了加深理解汇编语言以及汇编初始化过程,第十一章我们使用汇编来控制LED0。本章节我们来学习使用C语言来控制LED0,实际的开发中我们接触最多的就是C......
  • c语言中多维数组的指针表示
    c语言中多维数组的指针表示学c的时候碰见了下面这道题修改下面的程序,让它从数组计算变成指针计算:/*rain.c--findsyearlytotals,yearlyaverage,andmonthlyav......
  • C语言 结构体、联合、位段
    例如,有一些寄存器,寄存器有一些位,每个位都控制不同的设置,要是想单独设置某一个位的值,用位段就是一个比较好的方法,寄存器例子:  第一种方法:如果内存小的话可能造成堆栈......
  • 如何判断点是否在多边形内部 (C语言版)
    概述这是图形学中的一个经典问题(point-in-polygon),一种比较简易的判断方法是射线法,就是以判断点作为端点,朝着任意方向绘制一条射线。如果射线与多边形交点为奇数个,就说明此......
  • C语言 模拟实现字符串函数 看着一篇够了
    C语言模拟实现字符串操作的库函数求字符串长度strlen思路1.如果碰到\0就代表字符串已经到了末尾size_tmy_strlen(constchar*str){ assert(str!=NULL); //......
  • 四舍六入五成双(C语言版)
    四舍五入的小细节计算机的四舍五入与我们数学学的还是有点区别,下面开始讲解吧四舍五入的规则:如果需要约位的数<=4,舍去不进位如果需要约位的数>=6,舍6进1如果需要约......
  • C语言 旋转字符串
    C语言旋转字符串思路:1.循环需要旋转几次2.保存处于第一个的字符3.再将后面的所有字符往前挪动一位4.再把处于第一位的字符放在末尾//字符串旋转第一种解法......
  • C语言中出现[Error] assignment to expression with array type
    1.原因数组不能直接给数组赋值指针不能直接给数组赋值2.解决办法chara[]={'h','e','l','l','o'};charb[5];char*p=NULL;//错误情况charc[5]=a;//......
  • 实验3 C语言控制语句应用编程
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#defineN80voidprint_text(intline,intcol,chartext[]);voidprint_spaces......