随笔 - 149  文章 - 8  评论 - 248  阅读 - 21万

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

复制代码
代码

#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;
}
}


复制代码

 

posted on   几度夕阳红了  阅读(419)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
< 2010年10月 >
26 27 28 29 30 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

点击右上角即可分享
微信分享提示