线性表中的顺序表的各种操作

#include <stdafx.h>
#define MAXSIZE 100
#include<stdio.h>
#include<iostream>
typedef int Elemtype;
typedef struct //建立结构体
{
Elemtype data[MAXSIZE];
int length;
}Sqlist;
void Initlist(Sqlist &L) //顺序表的初始化
{
L.length=0;
}
void CreatSqlist(Sqlist &L,int n) //创建链表函数
{
int i;
for(i=0;i<n;i++)
scanf("%d",&L.data[i]);
L.length=n;
fflush(stdin);
}
void Output(Sqlist L) //输出顺序表函数
{
int i;
for(i=0;i<L.length;i++)
printf("%5d",L.data[i]);
printf("\n");
}
int IsEmpty(Sqlist L) //判断顺序表是否为空
{
if(L.length==0) return 1;
else return 0;
}
int GetElem(Sqlist L,int i) //取出第i个元素
{
if(i<0||i>=L.length) return -9999;
else return L.data[i];
}
int LocateElem(Sqlist L,Elemtype x) //定位函数
{
int k=0;
while(k<L.length&&L.data[k]!=x)
k++;
if(k<L.length) return k;
else return -1;
}
int Insert(Sqlist &L,Elemtype x,int i) //在顺序表中第i个元素之前插入一个数据元素
{
int k;
if(i<0||i>L.length||L.length==MAXSIZE)
return 0;
else
{ for(k=L.length;k>=i;k--)
L.data[k]=L.data[k-1];
L.data[i]=x;
L.length=L.length+1;
}
return 1;
}
int Delete(Sqlist &L,int i) //删除顺序表L中第i个数据元素
{
int k;
if(i<0||i>=L.length)
return 0;
else
{ for(k=i;k<L.length;k++)
L.data[k]=L.data[k+1];
L.length--;
}
return 1;
}
void Clear(Sqlist &L) //清空顺序表L
{
Initlist(L);
}
void Mergelist(Sqlist la,Sqlist lb,Sqlist &lc) //合并有序链表la和lb到lc中,使得lc依然有序
{
int i,j,k;
i=j=k=0;
while(i<la.length&&j<lb.length)
{
if(la.data[i]<lb.data[j])
lc.data[k++]=la.data[i++];
else if(la.data[i]>lb.data[j])
lc.data[k++]=lb.data[j++];
else
{
lc.data[k++]=lb.data[j++];
lc.data[k++]=la.data[i++]; //原程序两个数相同时只取了一个数,这样修改后两个顺序表合并时才不会掉元素
}
}
while(i<la.length)
lc.data[k++]=la.data[i++];
while(i<lb.length)
lc.data[k++]=la.data[i++];
lc.length=k;
}
void output()
{
int i;
for(i=0;i<10;i++)
printf("");
for(i=0;i<32;i++)
printf("*");
printf("\n");
}
void mainpp() //原程序菜单程序过于繁琐
{
int i;
char *menu[]={"1.建立一个顺序表","2.输出一个顺序表","3.在顺序表中查找",
"4.向顺序表中插入一个元素","5.删除顺序表中的一个元素",
"6.从顺序表中取出一个元素","7.将两个顺序表合并",
"0.退出","\0"}; //注意最后一个 "\0"不能少
for(i=0;menu[i][0]!='\0';i++)
{
printf("\t%s\n",menu[i]);
}
}
void main()
{
int n,i,k=1,m,x;
Sqlist l,la,lc;
Initlist(l);
//Initlist(la);
mainpp();
while(k)
{ printf("请选择0--7: ");
scanf("%d",&m);
getchar();
switch(m)
{
case 0: return;
case 1: {
printf("输入元素值,建立一个顺序表\n");
printf("输入顺序表的个数: ");
scanf("%d",&n);
getchar();
printf("请输入%d输入个数: ",n);
CreatSqlist(l,n);
printf("您建立的顺序表如下:\n");
Output(l);
break;
}
case 2: {
Output(l);
printf("\n");
break;
}
case 3: {
printf("输入要查找的元素值: ");
scanf("%d",&x);
getchar();
k=LocateElem(l,x);
printf("要查找的元素定位:%d\n",k);
printf("\n");
break;
}
case 4: {
printf("请输入要插入元素的位置: ");
fflush(stdin);
scanf("%d",&i);
getchar();
printf("请输入要插入的数:");
scanf("%d",&x);
getchar();
Insert(l,x,i);
printf("插入后的顺序表为:\n");
Output(l);
break;
}
case 5: {
printf("输入要删除元素的位置: ");
fflush(stdin);
scanf("%d",&i);
getchar();
Delete(l,i);
printf("删除元素后的顺序表为: ");
Output(l);
break;
}
case 6: {
printf("输入要取出的元素的序号: ");
fflush(stdin);
scanf("%d",&i);
getchar();
k=GetElem(l,i);
printf("取出的第%d个元素为:%d\n",i,k);
break;
}
case 7: {
Initlist(la);
printf("请输入第二个顺序表的个数: ");
scanf("%d",&m);
getchar();
printf("请输入%d输入个数: ",m);
CreatSqlist(la,m);
printf("您新建立的顺序表如下:\n");
Output(la);
Mergelist(l,la,lc);
printf("合并后的顺序表为: \n");
Output(lc);
break;
}
default:return;
}
printf("继续运行吗?Y(1)/N(0): ");
scanf("%d",&k);
getchar();
if(!k) return;
}
}
如果本文的描述的方法或内容有问题,请给我留言。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述