1.实验目的
熟练掌握顺序表的创建,输出,插入,删除、合并等操作。
2.实验内容
设计一个顺序表,设计如下函数,并调试运行
1、创建一个顺序表
2、打印一个顺序表
3、向L中【下标为i】的位置上插入元素x
4、删除【下标为i】的元素x
5、将x插入升序表L中的合适位置,使得L依旧保持升序
6、将L中的奇数放在左侧,偶数放在右侧
7、将升序表L1、L2合并,产生升序表L3
代码如下:
#include <stdio.h>
typedef struct
{
int a[100];
int len;
}seqList;
void creatList(seqList *L)
{
int i,x;
i=0;
printf("请输入一组数字,以-1结束:");
scanf("%d",&x);
while(x!=-1)
{
L->a[i]=x;
i++;
scanf("%d",&x);
}
L->len=i;
}
void printList(seqList *L)
{
int i;
for(i=0;i<L->len;i++)
{
printf("%3d",L->a[i]);
}
}
void insertList(seqList *L,int i,int x)//在下标为i处插入元素x;
{
int j;
if(i<0||i>L->len) {printf("ERROR!!!");return;}
for(j=L->len-1;j>=i;j--) L->a[j+1]=L->a[j];
L->a[i]=x;
L->len++;
}
void insert(seqList *L,int x)//插入元素x;
{
int i;
for(i=L->len-1;i>=0&&x<L->a[i];i--)
{
L->a[i+1]=L->a[i];
L->a[i+1]=x;
L->len++;
}
printList(L);
}
void del(seqList *L,int i)
{
if(i<0||i>L->len) {printf("error!!!"); return ;}
for(i=0;i<L->len;i++)
{
L->a[i-1]=L->a[i];
}
L->len--;
printList(L);
}
void changejiou(seqList *L)
{
int i,j,t;
i=0;
j=L->len-1;
while(i<j)
{
while(i<j&&L->a[i]%2==0) i++;
while(i<j&&L->a[j]%2==1) j--;
if(i<j) {t=L->a[i];L->a[i]=L->a[j];L->a[j]=t;}
}
printList(L);
}
void delAll(seqList *L)
{
int i,tail;
i=0;
tail=0;
while(i<L->len)
{
if(L->a[i]%2==1) i++;
else {L->a[tail]=L->a[i];i++;tail++;}
}
L->len=tail;
printList(L);
}
void transpose(seqList *L)
{
int i,j,t;
for(i=0,j=L->len-1;i<j;i++,j--)
{
t=L->a[i];
L->a[i]=L->a[j];
L->a[j]=t;
}
printList(L);
}
void merge(seqList *L1,seqList *L2,seqList *L3)
{
int i,j,k;
//1、先进行L1和L2的比较,将较小值依次填入L3。注:思考,升序表为何选小值?因为小值就是两个表的当前最小值
i=0; j=0; k=0;//k=L3->len-1;
while(i<L1->len && j<L2->len ){//何时结束?当L1、L2每一个达到末尾时可结束,因为此时只有一方有值,另一方无值,无法形成比较
if(L1->a[i]<L2->a[j]){ L3->a[k]=L1->a[i]; i++; k++; }
else { L3->a[k]=L2->a[j]; j++; k++; }
}
//2、循环结束后,定有一方未结束,需要将尾部追加到L3中
while(i<L1->len){ L3->a[k]=L1->a[i]; i++; k++; }
while(j<L2->len){ L3->a[k]=L2->a[j]; j++; k++; }
//3、注意:要修改新表的表长
L3->len=L1->len+L2->len;
}
int main()
{
seqList L1;seqList L2 ;seqList L3;
creatList(&L1);creatList(&L2);
printf("L1:");printList(&L1);
printf("L2:");printList(&L2);
merge(&L1,&L2,&L3);
printf("L3:");printList(&L3);
return 0;
}
3.实验总结(含心得体会)
通过本次实验,深入理解了如何创建一个顺序表、打印一个顺序表、向L中【下标为i】的位置上插入元素x、删除【下标为i】的元素x、将x插入升序表L中的合适位置,使得L依旧保持升序、实现奇偶分别存取两个顺序表、将L中的奇数放在左侧,偶数放在右侧、将升序表L1、L2合并,产生升序表L3.
这次实验代码量非常多,还有不同的算法思想,我开始很难理解,就算是靠着书上的代码还是无法理解到底是如何实现的,一旦结构复杂起来就很难去理清之间的关系,但后来通过老师的详细解答,逐渐开始理解。以后遇到类似的问题一定要有耐心,不要轻易放弃,一步步去考虑问题,将大问题分解成一个个小问题,这样就不会无从下手了。另外,在平常要多加练习,强化思想。