2020.11.17 数据结构顺序表的创建、插入、查找、删除、合并

数据结构顺序表的建立、删除、查找、插入、合并的实现

*[HTML] // 数据结构顺序表的建立、删除、查找、插入、合并的实现的过程中让我对数据、函数的建立有了一个初步的认识,特别是将多个函数联合起来时,需要考虑到很多东西,所以我建议大家必须自己打代码,不要只是简单的进行复制粘贴。这对你只会有害无益

实现代码

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 100
typedef struct
{
	int* data;    //存放数据,使用指针是为了使用new操作符来申请内存空间,并指定一个地址作为内存起始位置同时调用构造函数初始化
	int length;
}SqList;
//初始化线性表
void InitializeSqList(SqList &L)//这里一定记得加上&引用,将L的变化传回实参
{
	L.data = new int[MaxSize];
	if (!L.data)exit(1);  //exit函数是用来结束进程的除0外其他数字代表异常,并返回给相应的操作系统
	L.length = 0;  //分配成功,将长度置为0
}
//创建顺序表
int CreateSqList(SqList &L)
{
	int n;
	printf("请输入数据的大小(即长度不要超过100):\n");
	scanf_s("%d", &n); //最好用scanf_s()函数不要用scanf,具体原因上网查,下面将不再进行解释
	if (n<0 || n>MaxSize) {
		printf("数据输入有误\n");
		return 0;
	}
	printf("请依次输入数据元素:\n");
	for (int i=0 ; i < n; i++)
	{
		scanf_s("%d", &L.data[i]);
		L.length++;    //输入一个数据长度加一
	}
	return 0;
}
//按值查找逻辑序号(第一个与之相等的值,因为可能有相同的数据), 或按逻辑序号查找数据值
int FindDataValue(SqList L)
{
	int i = 0,flag=0;
	if (0 == L.length)
	{
		printf("你还没有数据输入 请先按 1 创建顺序表:\n"); 
		return 0;
    }
	int  value, choice;
	printf("按值查找——1  按序查找——2\n 请输入:\n");
	scanf_s("%d", &choice);
	 if (1 == choice)
	{
		printf("请输入你要查找的数据值:\n");
		scanf_s("%d", &value);
		while (i < L.length)
		{
			if (L.data[i] != value)i++;
			else 
			{
				flag = 1;
				printf("%d的序号为%d:\n", value, i + 1); break;
			}
		}
		if (flag == 0)printf("该值不存在\n");
	}
	 if (2 == choice)
	 {
		 printf("请输入查找的序号:\n");
		 scanf_s("%d", &i);
		 if (i<1 || i>L.length + 1)
		 {
			 printf("不存在该序号\n");
			 return 0;
		 }
		 else printf("序号为 %d 的元素值为: %d", i, L.data[i - 1]);
	 }
}
//插入数据元素
int Insert(SqList &L)
{
	int position, i=0,dat; //position插入位置,dat待插入数据
	printf("请输入待查数据的位置:\n");
	scanf_s("%d", &position);
	if (position<1 || position>L.length+1)
	{
		printf("输入位置有误\n");
		return 0;
	}
	position--;//将逻辑序号转化为物理序号
	for (i = L.length; i >= position; i--)
		L.data[i + 1] = L.data[i];
	printf("请输入待插入数据:\n");
	scanf_s("%d", &dat);
	L.data[position] = dat;
	L.length++;  //插入一个数据,长度加一
}
//输入函数
int Print(SqList L)
{
	int i;
	if (0 == L.length)
	{
		printf("顺序表为空表\n");
		return 0;
	}
	for (i = 0; i < L.length; i++)
		printf("%d  ", L.data[i]);
	printf("\n");
}
//删除函数,这里最好用序号来删除函数,用数据值的话可能出现值相同的情况
int Delete(SqList& L)
{
	int i, position, d_value; //d_value存储删除的数据,避免数据泄露
	printf("请输入想要删除的一个序号:\n");
	scanf_s("%d", &position);
	if (0 == L.length)
	{
		printf("顺序表为空\n");
		return 0;
    }
	if (position<1 || position>L.length + 1)
	{
			printf("你的输入序号不正确\n");
		return 0;
	}
	position--;
	for (i = position; i <L.length; i++)
		L.data[i] = L.data[i+1];
	d_value = L.data[position];
	L.length--;
}
//功能键的选择
void FunctionMenu()
{
	printf("\t\t\t******************功能表*******************\n");
	printf("\t\t\t1-创建顺序表————————————————————2-输出顺序表\n");
	printf("\t\t\t3-插入数据————————————————————4-删除数据\n");
	printf("\t\t\t5-查找数据————————————————————6-合并两个顺序表\n");
	printf("\t\t\t\t\t7-退出程序");
}
//顺序表释放
void DeleteList(SqList L)
{
	delete(L.data);
}
//两个顺序表的合并
void UnionTwoList(SqList List1, SqList List2, SqList& unionList)//这里的List1,List2必须已经创建才能使用
{
	int i = 0, j = 0, k=0;
	InitializeSqList(unionList);  //先将unionList进行初始化
	for (i ; i < List1.length; i++)
	{
		j = i;
		unionList.data[j] = List1.data[i];//将List1直接赋值给unionList,并将表长度递增
		unionList.length++;
	}
	i= 0;
	for (j = 0; j < unionList.length;j++)
		if (unionList.data[j] == List2.data[i])i++;//如果unionList.data[j]中的数据值有一个等于List2.data[i](此时i=0)就让List2中的下一个元素与unionList中的元素值比较
		else if (j == unionList.length - 1)//不满足上条语句就说明List2中的第i个元素(此时为第一个元素)与unionList中所有元素值不相等
		{//从而可以将该List2中的该元素值加入到unionList中,同时让unionList中的长度加一
			unionList.data[unionList.length + 1] = List2.data[i];
			unionList.length++;
		}
	printf("合并后的顺序表为:\n");
	Print(unionList);  //输出合并后的结果
}
int main()
{
	SqList List2, List1, unionList;
	int  choice;
	InitializeSqList(List1);
	InitializeSqList(List2);
	while (1)
	{
		FunctionMenu();
		printf("\n请输入相应的数值来实现对应功能:\n");
		scanf_s("%d", &choice);
		if (7 == choice)
		{		DeleteList(List1);
		break;
	}
		switch (choice)
		{
		case 1:CreateSqList(List1); break;
		case 2:Print(List1); break;
		case 3:printf("没有创建顺序表不能使用插入功能,若没有创建顺序表则请先创建顺序表\n");
			if (0 != List1.length)
			{
				Insert(List1); break;
			}
			else break;
		case 4:Delete(List1); break;
		case 5:FindDataValue(List1); break;
		case 6:printf("你是否已经创建了一个顺序表?\n已创建按 1 还未创建按 2\n");
			int inValue;
			scanf_s("%d", &inValue);
			if (1 == inValue)
			{
				if (0 == List1.length)
				{
					printf("你还没有创建顺序表,你可能是忘了!\n"); break;
				}
				else
				{
					printf("请创建第二个顺序表进行两个顺序表的合并\n");
					CreateSqList(List2);
				}
			}
			else if (2 == inValue)
			{
				if (0 != List1.length)
				{		printf("你已经创建了一个顺序表,你可能忘了!\n");
				break;
			}
				printf("请先创建你的第一个顺序表\n");
				CreateSqList(List1);
				printf("\n再创建第二个顺序表来进行两个顺序表的合并\n");
				CreateSqList(List2);
			}
			else {
				printf("你的输入有误\n"); break;
			}
			UnionTwoList(List1, List2, unionList);
		 DeleteList(List2); DeleteList(unionList);//释放两个顺序表
			break;
		default:DeleteList(List1);   //退出之前释放List1
			printf("你的输入有误\n"); break;
		}
	}
}

运行结果

Markdown将文本转换为 HTML

上面代码中的顺序表合并有些问题,希望大家能够自己解决(我目前还没找到原因),解决后望告知我,和大家一起进步,在此谢过。

                        ******************功能表*******************
                        1-创建顺序表————————————————————2-输出顺序表
                        3-插入数据————————————————————4-删除数据
                        5-查找数据————————————————————6-合并两个顺序表
                                        7-退出程序
请输入相应的数值来实现对应功能:
1
请输入数据的大小(即长度不要超过100):
2
请依次输入数据元素:
45 33
                        ******************功能表*******************
                        1-创建顺序表————————————————————2-输出顺序表
                        3-插入数据————————————————————4-删除数据
                        5-查找数据————————————————————6-合并两个顺序表
                                        7-退出程序
请输入相应的数值来实现对应功能:
2
45  33
                        ******************功能表*******************
                        1-创建顺序表————————————————————2-输出顺序表
                        3-插入数据————————————————————4-删除数据
                        5-查找数据————————————————————6-合并两个顺序表
                                        7-退出程序
请输入相应的数值来实现对应功能:
3
没有创建顺序表不能使用插入功能,若没有创建顺序表则请先创建顺序表
请输入待查数据的位置:
3
请输入待插入数据:
89
                        ******************功能表*******************
                        1-创建顺序表————————————————————2-输出顺序表
                        3-插入数据————————————————————4-删除数据
                        5-查找数据————————————————————6-合并两个顺序表
                                        7-退出程序
请输入相应的数值来实现对应功能:
2
45  33  89
                        ******************功能表*******************
                        1-创建顺序表————————————————————2-输出顺序表
                        3-插入数据————————————————————4-删除数据
                        5-查找数据————————————————————6-合并两个顺序表
                                        7-退出程序
请输入相应的数值来实现对应功能:
4
请输入想要删除的一个序号:
1
                        ******************功能表*******************
                        1-创建顺序表————————————————————2-输出顺序表
                        3-插入数据————————————————————4-删除数据
                        5-查找数据————————————————————6-合并两个顺序表
                                        7-退出程序
请输入相应的数值来实现对应功能:
2
33  89
                        ******************功能表*******************
                        1-创建顺序表————————————————————2-输出顺序表
                        3-插入数据————————————————————4-删除数据
                        5-查找数据————————————————————6-合并两个顺序表
                                        7-退出程序
请输入相应的数值来实现对应功能:
6
你是否已经创建了一个顺序表?
已创建按 1 还未创建按 2
1
请创建第二个顺序表进行两个顺序表的合并
请输入数据的大小(即长度不要超过100):
2
请依次输入数据元素:
39 55
合并后的顺序表为:
33  89  -842150451  39
                        ******************功能表*******************
                        1-创建顺序表————————————————————2-输出顺序表
                        3-插入数据————————————————————4-删除数据
                        5-查找数据————————————————————6-合并两个顺序表
                                        7-退出程序
请输入相应的数值来实现对应功能:
7

C:\Users\huashi\source\repos\SqListFieldPractice\x64\Debug\SqListFieldPractice.exe (进程 17236)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值