数据结构顺序表的建立、删除、查找、插入、合并的实现
*[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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .