总共分为10点
/(1)输出顺序表中的所有元素;
(2)按序号查找指定元素,即输出顺序表中的第i个元素;
(3)按值查找指定元素,即输出顺序表中值为x的元素的序号;
(4)在指定位置插入元素,即在第i个元素前面插入值为x的元素;
(5)删除指定元素,即删除第i个元素;
(6)删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);
(7)单值化操作,即删除表中重复元素中的多余元素,只保留其中序号最小的一个,例如,顺序表(2,4,4,3,2,4)单值化后的结果为(2,4,3);
(8)简单划分操作,即将顺序表 (a1,a2,… ,an) 重新排列为以指定元素a1为界的两部分:a1前面的值均小于等于a1,a1后面的值均大于a1;
(9)采用直接插入法将顺序表排列为升序序列,参见教材P236对直接插入排序法基本操作步骤的讲解;
(10)销毁顺序表并退出。/
头文件
#include<stdio.h>
#define ok 1
#define error 0
#define MAXSIZE 100
typedef int status;
typedef struct a
{
status length;
status *p;
}sqlist;
创建链表
status cj(sqlist &L) //创建链表
{
L.p=new status (MAXSIZE);
L.length = 0;
if(!L.length )
return error;
L.length = 0;
return ok;
}
链表的初始化
status csh(sqlist &L,status n) //初始化
{
status i;
printf("请输入要输入的值\n");
for(i=0;i<n;i++)
scanf("%d",L.p[i]);
return ok;
}
1.输出链表中所有元素
status shuchu(sqlist &L) //输出所有元素
{
int i;
for(i=0;i<L.length-1;i++)
{
printf("%d\n",L.p[i]);
}
return ok;
}
2.输出链表中第n个元素
status sci(sqlist L,status n) //输出i
{
int i;
if(i>L.length)
{
printf("错误");
return error;
}
else
printf("%d",a.p[n-1]);
return ok;
}
3.按值输出元素
status azsc(sqlist L,status n) //按值输出元素
{
int i;
for(i=0;i<L.length-1,i++)
{
if(L.p[i]==n)
{
printf("为第%d个元素\n",i+1);
return ok;
}
else
{
printf("没有您要查找的值\n");
return error;
}
}
}
4.插入元素
status crys(sqlist &L,status n,status x) //插入元素
{
L.length++;
int i=L.length;
if(n<0||n>L.length-1)
{
return error;
}
else
{
for(;i>n-2;i--)
{
L.p[i]=L.p[i-1];
}
a[n-1]=x;
}
return ok;
}
5.删除第n个元素
status scys(sqlist &L,status n) //删除第n个元素
{
int i;
if(n<0||n>L.length+1)
{
printf("不存在\n");
return error;
}
else
{
for(i=n;i<L.length;i++)
{
L.p[n-1]=L.p[n];
}
L.length--;
}
return ok;
}
6.删除值在一个范围内的数
stasus scfwys(sqlist &L) //删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);
{
status cj(sqlist &L)
int i,q=0;
sqlist a;
cj(sqlist &a);
for(i=0;i<L.length;i++)
{
if(L.p[i]>=x&&L.p[i]<=y)
{
a.p[q]=L.p[i];
q++;
}
}
for(i=0;i<q+1;i++)
{
L.p[i]=a.p[i];
}
L.length=q+1;
return ok;
}
7.删除重复元素
status sccfys(sqlist &L) //删除重复元素
{
status scys(sqlist &L,Status n)
int i,a;
for(i=1,i<L.length;i++)
{
for(a=0;a<i;a++)
{
if(L.p[i]==L.p[a])
{
scys(L,i+1);
}
}
}
return ok;
}
8.排序分界
status px(sqlist &L,status a) //排序分界
{
int q=a,*w,z,x;
*w=new status(MAXSIZE); //q是值a w[]是新数组 L->p[]是原数组
w=q; //x为末尾 z为开始
z=0;x=L.length-1;
for(i=0;i<L.length;i++)
{
if(q<L->p[i])
{
w[x]=L.p[i];
x--;
}
else
{
w[z+1]=w[z];
w[z]=L.p[i];
z++;
}
}
return ok;
}
9.直接插入法升序
status sx(sqlist &L) //直接插入法升序
{
int i;
for(i=1;i<L.length-1;i++)
{
for(a=0;a<i;a++)
{
if(L.p[i]<L.p[a])
{
q=L.p[i];
for(w=i;w<a+2;w--)
{
L.p[w]=L.p[w-1];
}
L.p[a]=q;
}
}
}
return ok;
}
10.销毁
Status xh(LinkList &L)
{
LNode *q;
while(L!=NULL)
{
q=L;
L=L->next;
delete q;
}
return ok;
}
菜单
status menu(status n,sqlist &L) //菜单
{
status cj(sqlist &L); //创建链表
status csh(sqlist &L,status n); //初始化
status sci(sqlist L,status n); //输出i
status azsc(sqlist L,status n); //按值输出元素
status crys(sqlist &L,status n,status x); //插入元素
status scys(sqlist &L,status n); //删除第n个元素
status scfwys(sqlist &L); //删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);
status sccfys(sqlist &L); //删除重复元素
status px(sqlist &L,int a); //排序分界
status sx(sqlist &L); //直接插入法升序
status shuchu(sqlist &L); //输出所有元素
status xh(sqlist &L); //销毁
printf("1:输出顺序表中的所有元素\n");
printf("2:输出顺序表中的第i个元素\n");
printf("3:输出顺序表中值为x的元素的序号\n");
printf("4:在第i个元素前面插入值为x的元素\n");
printf("5:删除第i个元素\n");
printf("6:删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n)\n");
printf("7:单值化操作,删除表中重复元素中的多余元素\n");
printf("8:简单划分操作,将顺序表 (a1,a2,... ,an) 重新排列为以指定元素a1为界的两部分\n");
printf("9:采用直接插入法将顺序表排列为升序序列");
printf("10:销毁顺序表并退出\n");
printf("请输入您想要做的事对应的序号");
scanf("%d",n);
int i,q; switch (n) //int main里面去
{
case 1: shuchu(L);
menu(n,L); break;
case 2: printf("您想输出第几个元素\n");
scanf("%d",&i);
sci(L,i);
menu(n,L); break;
case 3: printf("值为多少\n");
scanf("%d",&i);
azsc(L,i);
menu(n,L); break;
case 4: printf("第几个元素 值为多少\n");
scanf("%d %d",&i,&q);
crys(&L,i,q);
menu(n,L); break;
case 5: printf("删除第几个元素\n");
scanf("%d",&i);
scys(&L,i);
menu(n,L); break;
case 6: printf("删除范围在x~y内的数x是多少y是多少\n");
scanf("%d %d",&i,&q);
scfwys(&L,i,q);
menu(n,L); break;
case 7: sccfys(&L);
shuchu(L);
menu(n,L); break;
case 8: printf("a1为多少\n");
scanf("%d",&i);
px(&L,i);
shuchu(L);
menu(n,L); break;
case 9: sx(&L);
shuchu(L);
menu(n,L); break;
case 10: xh(&L);
break;
}
return ok;
}
主函数
int main() //主函数
{
status cj(sqlist &L); //创建链表
status csh(sqlist &L,status n); //初始化
status menu(status n); //菜单
status sc(sqlist L,status n); //删除
status sci(sqlist L,status n); //输出i
status azsc(sqlist L,status n); //按值输出元素
status crys(sqlist &L,status n,status x); //插入元素
status scys(sqlist &L,status n); //删除第n个元素
stasus scfwys(sqlist &L); //删除顺序表中所有值在[x,y]范围内的元素,要求时间复杂度达到O(n);
status sccfys(sqlist &L); //删除重复元素
status px(sqlist &L,int a); //排序分界
status sx(sqlist &L); //直接插入法升序
status shuchu(sqlist &L); //输出所有元素
status xh(sqlist &L); //销毁
int i,q,w;
status n;
sqlist L;
cj(&L);
printf("要存几个值\n");
scanf("%d",&w);
csh(&L,w);
menu(n,L);
return 0;
}