当前位置:文档之家› 实验一 顺序表的操作、插入与删除

实验一 顺序表的操作、插入与删除

实验一顺序表的操作、插入与删除
【实验目的】
(1)熟悉数据移动是顺序表的操作特点。

(2)掌握顺序表中元素的移动、插入和删除操作的特点。

【实验内容】
题1 设有一个用向量表示的线性表a[n],a[0]中不存放线性表的元素。

要求写出将其中元素逆置的函数,并只允许用a[0]作附加的工作单元。

题2 写出从线性表中删除元素值为x的结点的函数。

若该表中无此结点,则输出“无此结点”信息。

【实验要求】
从键盘任意输入9个整数,依次存放在数组a[10]的元素a[1]~a[9]中,逆置后输出。

在题1的基础上,从键盘输入一个整数x,从a[1]开始访问数组a,完成题2。

【实验提示】
题1 有以下两种方法:
(1)将a[1]至a[n-1]前移1位,再将a[n-1]←a[0];接着a[1]至a[n-2]前移一位,再将a[n-2]←a[0];……。

(2)可用移动和插入,通过a[0]使元素a[1]和a[n-1]交换;再使a[2]和a[n-2]交换;如此继续至中点为止。

注意如何判断中点。

思考这两种方法的时间复杂度分别是多少。

题2 首先也要找到被删除元素的位置,然后将该位置以后的数据元素全部前移一个单元。

注意:当数组a中有重复的元素值且x与此值相等时,函数应能删除全部重复元素。

当有多个连续的相同值需要删除时,应都能删除。

程序如下:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch,
system("pause") or input loop */
int main(int argc, char *argv[]) {
int a[100]={0},i,x,j,k;
int n;
//输入数组
printf("请输入数组大小n:");
scanf("%d",&n);
printf("请输入%d个数:\n",n-1);
for (i=1;i<n;i++)
scanf("%d",&a[i]);
printf("\n");
for(i=1;i<=n/2;i++)
{
a[0]=a[i];
a[i]=a[n-i];
a[n-i]=a[0];
}//将a[i]与a[n-i]交换
printf("逆序输出:\n");
for(i=1;i<n;i++)
{
printf("%d ",a[i]);
}//逆序输出n-1个整数
printf("\n输入一个数字并删除它:\n");
scanf("%d",&x);
k=n;
for(i=1;i<k;i++)
while(a[i]==x)
{
for(j=i;j<n;j++)
a[j]=a[j+1];//将删除位置后的数据元素全部前移一个单元
k=k-1;//顺序表的元素个数减一
}//有多个连续相同值也进行删除
if(k==n)
printf("无此结点");
else
{
for(i=1;i<k;i++)
{
printf("%d ",a[i]);
}
}
return 0;
}。

相关主题