利用c语言,写出顺序列表完成基础功能()
问题描述:
帮忙看看吧
#include <stdio.h>
#define MaxSize 100
typedef int ElemType;
typedef struct list
{
ElemType elem[MaxSize];
int last; //定义最后一个数
}list; //定义一个类型
//功能包括:创建,初始化,插入,删除,访问,定位访问,合并,输出
void sort(list *L);
void CreList(list*l,int n); //创建
void Initlist (list*L); //初始化
int Inslist(list*L,int i,ElemType e); //插入
int DelList (list*L,int i); //删除
int Locate(list*l,ElemType e); //查找
int CombList (list *L1,list *L2,list *L3);
int AccLink (list *L,int i); //顺序访问
void DispList (list *L); //输出顺序表
int main (void)
{
list L1,L2,L3;
int cho,size,temp1,temp2;
do
{
printf("请您创建一个顺序列表\n");
printf("请输入列表的长度(长度需要小于最大长度(MaxSize):");
scanf("%d",&size);
printf("输入列表的元素:");
Initlist(&L1); //进行初始化
CreList(&L1,size);
}while(size<=0 || size>MaxSize); //检测长度定义的列表是否超过最大值
do
{
printf("以下为可以进行的操作~\n");
printf("1_访问列表中某一个指定位置的元素\n");
printf("2_查找列表中某一个元素的所在位置\n");
printf("3_在列表中插入一个元素\n");
printf("4_从列表中删除一个元素\n");
printf("5_初始化列表\n");
printf("6_合并第二序列列表\n");
printf("请进行选择:");
scanf("%d",&cho);
}while (cho>6 || cho<1); //对非法输入进行对策
switch(cho)
{
case 1:
printf("请输入位置:");
scanf("%d",&temp1);
AccLink(&L1,temp1);
break;
case 2: printf("请输入元素:");
scanf("%d",&temp1);
temp1 = Locate(&L1,temp1);
printf("该位置的元素是 %d\n",temp1);
break;
case 3: printf("请您输入要插入元素的位置和元素:");
scanf("%d %d",&temp1,&temp2);
Inslist (&L1,temp1,temp2);
printf("目前列表为:");
DispList(&L1);
puts("");
break;
case 4: printf("请输入要删除元素所在的位置:");
scanf("%d",&temp2);
temp1 = DelList (&L1,temp2);
printf("您删除的元素是%d\n",temp1);
printf("目前列表是:");
DispList(&L1);
puts("");
break;
case 5: Initlist (&L1);
break;
case 6: puts("请输入列表的长度(小于最大长度 Maxsize)");
scanf("%d",&size);
puts("请现在输入元素:");
CreList(&L2,size);
puts("确定要合并两个列表吗?(将两个列表按升序排列)");
puts("1)Yes\t2)No");
printf("你的选择是:");
do
{
scanf("%d",&cho);
}while (cho <1 || cho>2);
switch (cho)
{
case 1:
CombList(&L1,&L2,&L3);
printf("经过组合后的列表为:");
DispList(&L3);
break;
case 2: DispList(&L1);
puts("");
DispList(&L2);
return 0;
break;
}
break;
default:puts("您输入的有错误!");
return 0;
}
return 0;
}
void CreList (list *L,int n) //创建一个n个元素的顺序列表
{
int i;
for (i=0;i<n;i++)
{
scanf ("%d",&L->elem[i]);
L->last = n-1;
}
}
void InitList (list *L) //初始化顺序表为空表
{
L->last = -1;
}
int InsList (list *L,int i,ElemType e) //此函数用于在顺序表中插入元素
{
int k;
if (L->last == MaxSize-1)
{
printf("存储空间已满,无法执行“添加”操作");
return 0;
}
if (!(i>=1 && i<=L->last+2))
{
puts("位置输入不合法");
return 0;
}
for (k=L->last;k>=i-1;k--) //将“目标位置”后的元素依次后移
{
L->elem[k+1] = L->elem[k];
}
L->elem[i-1] = e; //将“目标元素”插入到目标位置
L->last++;
return 1;
}
int DelList (list *L,int i)
{
int k;
ElemType temp;
if (L->last == -1)
{
puts("此顺序表为空,无法执行“删除”操作");
return 0;
}
if (!(i>=1 && i<=L->last+1))
{
puts("删除位置不合法");
return 0;
}
temp = L->elem[i-1]; //将删除的元素保存,便于用户核对
for(k=i-1;k<=L->last;k++) //将被删除元素后的元素依次前移一位
{
L->elem[k] = L->elem[k+1];
}
L->last--;
return temp;
}
int Locate (list *L,ElemType e) //此函数通过给定元素值来查找其位置
{
int i;
if (L->last == -1)
{
puts("此顺序表为空,无法执行“查找”操作");
return 0;
}
for (i=0;i<L->last;i++)
{
if (L->elem[i] == e)
{
return i+1;
}
}
return 0;
}
int CombList (list *L1,list *L2,list *L3)
{
int size,i,j,k;
if (L1->last + L2->last + 2 >=MaxSize)
{
puts("合并后的顺序表长度超出单顺序表上限,无法执行“合并”操作");
return 0;
}
size = L1->last + L2->last + 2; //确定顺序表L3的大小
sort(L1);
sort(L2);
InitList(L3); //初始化顺序表L3
for (i=0,j=0,k=0;k<size;k++)
{
if (L1->elem[i] < L2->elem[j])
{
InsList (L3,k+1,L1->elem[i++]); //将L1->elem[i]插入L3
if (i>L1->last) //L1全部插入L3后将L2中的剩余元素依次插入L3
{
for (;k<size-1;k++)
{
InsList (L3,k+2,L2->elem[j++]);
}
}
}
else
{
InsList (L3,k+1,L2->elem[j++]); //将L2->elem[j]插入L3
if (j>L2->last) //L2全部插入L3后将L1中的剩余元素依次插入L3
{
for (;k<size-1;k++)
{
InsList (L3,k+2,L1->elem[i++]);
}
}
}
}
L3->last = k-1;
return 1;
}
int AccLink (list *L,int i) //此函数通过位置来访问顺序表中的元素
{
if (i > L->last+1)
{
puts("输入位置不合法");
return 0;
}
printf("位置元素 %d 是 %d",i,L->elem[i-1]);
return 1;
}
void DispList (list *L) //此函数用于打印顺序表
{
int i;
for (i=0;i<=L->last;i++)
{
printf ("%d ",L->elem[i]);
}
}
void sort(list *L) //此函数使用冒泡法将顺序表从小到大进行排序
{
int i,j;
ElemType temp;
for (i=0;i<=L->last;i++)
{
for (j=0;j<=L->last-1;j++)
{
if (L->elem[j] > L->elem[j+1])
{
temp = L->elem[j];
L->elem[j] = L->elem[j+1];
L->elem[j+1] = temp;
}
}
}
}
*告诉我怎么解决
- 问题在哪
- 速度
答
void Initlist (list*L); //初始化
int Inslist(list*L,int i,ElemType e); //插入
声明和定义的大小写不一致,C/C++是区分大小写的,请保持两边一致