顺序表及其概念

顺序表

1. 创建数组的方式建立顺序表实现增删改查

#include"stdio.h"
//顺序表:以数组的形式来存储数据
//顺序表理解成一个容器,在容器当中的元素的存储方式是排列在一起的,和数组的形式一样
//地址连续的
//在顺序表中存储的元素的地址必须是连续的,可以通过找到首地址,然后通过指针偏移,我们就可以访问里面的所有元素。
在中间删除或增加元素,那么效率是比较低的,因为需要移动大量的元素

//使用数组来实现顺序表:比较简单
int arr[100];//可以把数组看成一个顺序表
int len = 0;//元素个数
int maxSize = 100;//最多能存多少个
//操作:增删改查
void insert1(int data)
{
	if (len < maxSize)//元素个数不能超过最大容量
	{
		arr[len] = data;
		len++;
	}
	//else
	//	printf("容器满了\n");
}

//在已存在的数据的某个元素后面插入数据
void insert2(int data,int val)
{
	int n = 0;
	for (int i = 0; i < len; i++)
	{
		if (arr[i] == val)
		{
			len++;//把数组长度加长
			for (n = len; n>i; n--)
			{
				arr[n - 1] = arr[n - 2];
			}
			arr[n] = data;
			return;//结束该函数的执行
		}
	}
}

//输出所有数据
void print()
{
	for (int i = 0; i < len; i++)
	{
		printf("%d\t", arr[i]);
	}
	printf("\n");
}
void change(int data, int val)
{
	for (int i = 0; i < len; i++)
	{
		if (arr[i] == val)
		{
			arr[i] = data;//修改
			printf("\n");
			return;//作用是跳出函数,如果有重复数据,只会修改第一个
		}
	}
	printf("\n");
}
void find(int val)
{
	for (int i = 0; i < len; i++)
	{
		if (arr[i] == val)
		{
			printf("\n该元素的下标为%d值为:%d\n", i, arr[i]);
		}
	}
}
//删除最后一位元素  只需要len-- 叫做尾删
//删除两个相同元素的第二个元素 可以使用continue跳过本次循环  用注释**标记
void del(int val)
{
	//int x = 0;  //**
	for (int i = 0; i < 10; i++)
	{
		if (arr[i] == val)
		{
			//x++;//**
			/*if (x == 1)//**
				continue;*/
			for (int n = i; n < len;n++)
			{
				arr[n] = arr[n + 1];//赋值覆盖
			}
			len--;//数组长度缩短
			//i--;//加上这一句话可以删除重复且相邻的相同值的元素
		}
	}
}
int main()
{
	insert1(4);
	insert1(5);
	insert1(5);
	insert1(6);
	insert1(7);
	insert1(8);
	insert1(9);
	print();
	insert2(55, 5);
	print();
	return 0;
}

2.指针的方式实现顺序表的增删改查

#include"stdio.h"
#include"stdlib.h"
//初始化操作
void initArr(int** buff,int* max)
{
	//为一级指针申请内存空间 可以传入二级指针
	*max = 10;
	//buff是二级指针 解引用一次得到一级指针
	*buff = (int*)malloc(sizeof(int)*(*max));//int*类型的指针buff指向int内存变量的地址  申请内存地址为10个 内存地址的首地址为**buff
	memset(*buff, 0, sizeof(int)*(*max));//初始化 逐字节赋值  把里面的地址全部赋值为0
}
void print(int* p,int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d\t", p[i]);
	}
	printf("\n");
}
void insert(int **p,int data,int *len,int *max)
{
	if (*len >= *max)//条件成立,说明容器满了
	{
		*max = *max + ((*max) / 2);//扩充内存 一次扩原来的一半
		int* tempBuff = (int*)malloc(sizeof(int)*(*max));
		for (int i = 0; i < *len; i++)//把原来的数据移动到新的内存上
		{
			tempBuff[i] = (*p)[i];
		}
		//移动完元素之后,原来的内存就用不到了
		free(*p);//释放的是一级指针指向的内存
		//释放完之后指向新的内存
		*p = tempBuff;
		printf("%d,%d\n", *len, *max);//每一次扩容,都输出一次元素个数和最大值
	}
	(*p)[*len] = data;
	(*len)++;
}
void del(int*p, int val, int *len)
{
	for (int i = 0; i < *len; i++)
	{
		if (p[i] == val)
		{
			for (int n = i; n < *len; n++)
			{
				p[n] = p[n + 1];
			}
			(*len)--;
		}
	}
}
void change(int *p, int val, int data, int *len)
{
	for (int i = 0; i < *len; i++)
	{
		if (p[i] == val)
		{
			p[i] = data;
		}
	}
}
void find(int *p, int val, int *len)
{
	for (int i = 0; i < *len; i++)
	{
		if (p[i] == val)
		{
			printf("你要找的元素是%d下标为:%d\n", p[i], i);
		}
	}
}
int main()
{
	int*buff = NULL;//顺序表
	int len = 0;//元素个数
	int maxSize = 0;//最大容量
	initArr(&buff, &maxSize);
	printf("%d,%d\n", len, maxSize);
	for (int i = 0; i < 100; i++)
	{
		insert(&buff, i + 1, &len, &maxSize);
	}
	find(buff, 55, &len);
	del(buff, 6, &len);
	change(buff, 66, 999, &len);
	print(buff, len);
	free(buff);//清除内存
	return 0;
}

3.创建结构体的方式实现顺序表

#include"stdio.h"
typedef struct
{
	//练习 就是把下面的数组换成指针
	int arr[10];//顺序表
	int len;//要有初始化操作 不然没有值
	int maxSize;
}node;
node n;
void init()//初始化操作
{
	n.len = 0;
	n.maxSize = 10;
}
void insert(int data)
{
	if (n.len < n.maxSize)//元素个数不能超过最大容量
	{
		n.arr[n.len] = data;
		n.len++;
	}
}
void print()
{
	for (int i = 0; i < n.len; i++)
	{
		printf("%d\t", n.arr[i]);
	}
	printf("\n");
}
void change(int data, int val)
{
	for (int i = 0; i < n.len; i++)
	{
		if (n.arr[i] == val)//找到要修改的值
		{
			n.arr[i] = data;
			return;//跳出函数
		}
	}
}
void find(int val)
{
	for (int i = 0; i < n.len; i++)
	{
		if (n.arr[i] == val)
		{
			printf("你要找的元素是%d下标为:%d\n", n.arr[i], i);
		}
	}
}
void del(int val)
{
	//int x = 0;  //**
	for (int i = 0; i < 10; i++)
	{
		if (n.arr[i] == val)
		{
			//x++;//**
			/*if (x == 1)//**
				continue;*/
			for (int j = i; j < n.len;j++)
			{
				n.arr[j] = n.arr[j + 1];//赋值覆盖
			}
			n.len--;//数组长度缩短
			i--;//加上这一句话可以删除重复且相邻的相同值的元素
		}
	}
}
void fun()
{
	FILE *file;//定义文件指针
	file = fopen("1.txt", "w");
	char str[10] = { 0 };
	for (int i = 0; i < n.len; i++)
	{
		sprintf(str, "%d", n.arr[i]);
		fputs(str, file);
	}
	fclose(file);
}
int main()
{
	init();
	insert(4);
	insert(5);
	insert(5);
	insert(6);
	insert(7);
	insert(8);
	insert(9);
	fun();
	print();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭就是我的姓i

你的鼓励是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值