顺序表的创建,插入,删除,查找,取值,输出,退出功能实现

目录

1,结构体

2,创建函数

3,插入函数

4,删除函数

5,查找函数

6,取值函数

7,输出函数

8,退出函数

9,菜单函数

10,主函数

完整代码:


本文章不添加判断用户输入错误的代码,纯粹讲解顺序表。

完整代码在最后面。

1,结构体:

typedef struct sqlist
{
	int* arr;
	int length;
}sqlist;

     1.int* arr;定义指针数组,当然也可以定义为arr[10],静态开辟内存空间,定义为指针数组只是为了可以根据我们的需要分配空间大小,称为动态开辟内存空间,也就是创建函数里的L.arr = (int*)malloc(10 * sizeof(int));

     2.int length;为表的长度,插入时表长度+1,删除时表长度-1。

2,创建函数:

void listcreat(sqlist& L)
{
	L.arr = (int*)malloc(10 * sizeof(int));
	int i;
	printf("请输入创建的顺序表的长度");
	scanf("%d", &L.length);
	printf("请输入数字:");
	for (i = 0; i < L.length; i++)
	{
		scanf("%d", &L.arr[i]);
	}
	printf("创建链表成功!\n");
}

     1.sqlist& L;表示引用的意思,就是把sqlist取了一个名字叫L,后续就可以用L.什么什么去操作sqlist里的变量。

     2.L.arr = (int*)malloc(10 * sizeof(int));10*代表开辟了十个int大小的内存空间。

3,插入函数:

void listinsert(sqlist& L)
{
	int i, j, e;
	printf("请输入需要插入的位置\n");
	scanf("%d", &i);
	printf("请输入需要插入的数\n");
	scanf("%d", &e);
	for (j = L.length - 1; j >= i - 1; j--)
	{
		L.arr[j + 1] = L.arr[j];
	}
	L.arr[i] = e;
	L.length++;
	printf("插入成功\n");
}

     1.j=L.length-1;数组从最后一位依次往后移动。

     2.j >= i-1;如果输入需要插入的位置是2,实际上是让1号位后面的数向后移,所以控制for循环的条件为j>=i-1。

     3.L.arr[j+1]=L.arrlj];最后一个数先后移,最后一个数的前一个数移到最后一个数的原位置,以此类推,注意L.arr[j+1]=L.arr[j]的顺序是不可换的。

     4.L.arr[i] = e;因为控制for循环的条件为j>=i-1,所以跳出for循环时的i就为我们需要插入的位置。

     5.L.length++;表的长度+1。

4,删除函数:

void listdetel(sqlist& L)
{
	int i, e;
	printf("请输入需要删除的位置");
	scanf("%d", &i);
	int j;
	if (i < 0 || i > L.length)
		exit(1);
	e = L.arr[i];
	for (j = i + 1; j <= L.length; j++)
	{
		L.arr[j - 1] = L.arr[j];
	}
	L.length--;
	printf("%d删除成功!\n", e);
}

     1.j=i+1;如果数组为1 2 3 4 5,要删除的位置为2,也就是1号位,那就要把2号位移到1号位,后面的同理依次往前移动,所以j=i+1。

int e;记录删除的数。

     2.L.arr[j - 1] = L.arr[j];需要删除的后一位数向前移动把需要删除的数覆盖掉,然后后面的数依次向前移动注意顺序L.arrlj-1]=L.arr[j]。

拿出草稿画一画。

     3.最后表的长度-1。

接下来是查找函数与取值函数。

首先得了解两者的区别:

   查找是输入一个数,输出对应的位置。

   取值是输入一个位置,输出对应的数 。

核心都为用循环,把表里的每一个数都与输入的数进行比较,相等时输出结果。

5,查找函数:

void listsearch(sqlist& L)
{
	int e;
	int i;
	printf("请输入需要查找位置的数:");
	scanf("%d", &e);
	for (i = 0; i <= L.length; i++)
	{
		if (e == L.arr[i])
			printf("%d的位置为%d", e, i);
	}
}

      用表里的数依次和e比较,可与下面的取值函数进行对比。

6,取值函数:

void listget(sqlist& L)
{
	int i, e;
	printf("请输入需要取值数的位置:");
	scanf("%d", &e);
	for (i = 0; i < L.length; i++)
	{
		if (e == i)
			printf("%d号位是%d", e, L.arr[i]);
	}
}

      用表里数的位置依次和e比较。可以注意到两者的区别就在e==L.arr[i],还是e==i,这也是查找和取值的主要区别。

7,输出函数:

void listinput(sqlist& L)
{
	printf("顺序表里的元素有:\n");
	int i;
	for (i = 0; i < L.length; i++)
	{
		printf("%d       ", L.arr[i]);
	}
}

8,退出函数:

void listout(sqlist& L)
{
	free(L.arr);
	printf("退出成功!\n");
}

9,菜单函数:

void menu()
{
	printf("\n****************************************************************\n");
	printf("\n***********            请输入你的选择                ***********\n");
	printf("\n***********          1 ---- 建表                     ***********\n");
	printf("\n***********          2 ---- 插入                     ***********\n");
	printf("\n***********          3 ---- 删除                     ***********\n");
	printf("\n***********          4 ---- 查找                     ***********\n");
	printf("\n***********          5 ---- 取值                     ***********\n");
	printf("\n***********          6 ---- 输出顺序表               ***********\n");
	printf("\n***********          0 ---- 退出                     ***********\n");
	printf("\n****************************************************************\n");
}

10,主函数:

int main()
{
	sqlist L;
	while (1)
	{
		menu();
		int choice, i, e;
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			listcreat(L);
			break;
		case 2:
			listinsert(L);
			break;
		case 3:
			listdetel(L);
			break;
		case 4:
			listsearch(L);
			break;
		case 5:
			listget(L);
			break;
		case 6:
			listinput(L);
			break;
		case 0: listout(L);
			break;
		}
	}
	return 0;
}

完整代码:

#define  _CRT_SECURE_NO_WARNINGS 1//不用VS删除这一行
#include<stdio.h>
#include<stdlib.h>
typedef struct sqlist
{
	int* arr;
	int length;
}sqlist;

void menu()
{
	printf("\n****************************************************************\n");
	printf("\n***********            请输入你的选择                ***********\n");
	printf("\n***********          1 ---- 建表                     ***********\n");
	printf("\n***********          2 ---- 插入                     ***********\n");
	printf("\n***********          3 ---- 删除                     ***********\n");
	printf("\n***********          4 ---- 查找                     ***********\n");
	printf("\n***********          5 ---- 取值                     ***********\n");
	printf("\n***********          6 ---- 输出顺序表               ***********\n");
	printf("\n***********          0 ---- 退出                     ***********\n");
	printf("\n****************************************************************\n");
}

void listcreat(sqlist& L)
{
	L.arr = (int*)malloc(10 * sizeof(int));
	int i;
	printf("请输入创建的顺序表的长度:");
	scanf("%d", &L.length);
	printf("请输入数字:");
	for (i = 0; i < L.length; i++)
	{
		scanf("%d", &L.arr[i]);
	}
	printf("创建顺序表成功!\n");
}

void listinsert(sqlist& L)
{
	int i;
	printf("请输入需要插入的位置\n");
	scanf("%d", &i);
	if (i < 0 || i>L.length + 1)
	{
		printf("插入失败!\n");
		exit(1);
	}
	int j;
	int e;
	printf("请输入需要插入的数\n");
	scanf("%d", &e);
	for (j = L.length - 1; j >= i - 1; j--)
	{
		L.arr[j + 1] = L.arr[j];
	}
	L.arr[i] = e;
	L.length++;
	printf("插入成功\n");
}

void listdetel(sqlist& L)
{
	int i, e;
	printf("请输入需要删除的位置");
	scanf("%d", &i);
	int j;
	if (i < 0 || i > L.length)
		exit(1);
	e = L.arr[i];
	for (j = i + 1; j <= L.length; j++)
	{
		L.arr[j - 1] = L.arr[j];
	}
	L.length--;
	printf("%d删除成功!\n", e);
}

void listsearch(sqlist& L)
{
	int e;
	int i;
	printf("请输入需要查找位置的数:");
	scanf("%d", &e);
	for (i = 0; i <= L.length; i++)
	{
		if (e == L.arr[i])
			printf("%d的位置为%d", e, i);
	}
}

void listget(sqlist& L)
{
	int e;
	int i;
	printf("请输入需要取值数的位置:");
	scanf("%d", &e);
	if (e < 0 || e >= L.length)
	{
		printf("输入位置错误!");
		exit(1);
	}
	for (i = 0; i < L.length; i++)
	{
		if (e == i)
			printf("%d号位是%d", e, L.arr[i]);
	}
}

void listinput(sqlist& L)
{
	printf("顺序表里的元素有:\n");
	int i;
	for (i = 0; i < L.length; i++)
	{
		printf("%d       ", L.arr[i]);
	}
}

void listout(sqlist& L)
{
	free(L.arr);
	printf("退出成功!\n");
}

int main()
{
	sqlist L;
	while (1)
	{
		menu();
		int choice, i, e;
		scanf("%d", &choice);
		switch (choice)
		{
		case 1:
			listcreat(L);
			break;
		case 2:
			listinsert(L);
			break;
		case 3:
			listdetel(L);
			break;
		case 4:
			listsearch(L);
			break;
		case 5:
			listget(L);
			break;
		case 6:
			listinput(L);
			break;
		case 0: listout(L);
			break;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

脑子不好真君

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值