顺序线性表

设计一个顺序表,实现删除、插入、查找、排序等功能。

 

解析:根据下列需要实现的功能具体分析

1.在长度为n的线性表的第i个位置插入一个新的数据item(尾部插入法)

该操作是指在线性表的第i-1个位置与线性表的第i个位置插入一个新的数据元素,使得线性表的长度变为n+1,但是在进行插入时首先应该判断线性表是否已满或者存储空间已被占满,并且还需要测试插入的位置是否恰当,由此插入的步骤分为:先做判断是否插入不当;然后将第i个元素到第n个元素之间的所有元素依次向后移动一个位置;再将item插入到第i个位置上,然后修改线性表的长度。

2.删除长度为n的线性表的第i个元素

该操作是指线性表的第i个位置上的元素从列表中去掉,使得线性表的长度为n-1,在进行删除操作时,需要先判断线性表是否为空以及删除的位置是否合适,然后进行删除过程:先将表中第i+1个元素到第n个元素依次向前移动一个单位长度,然后将线性表的长度减一。

3.确定元素item在长度为n的线性表中的位置

该操作只需从第一个元素开始,从前往后依次通过比较来确定给定元素的位置,如果线性表中存在该元素则返回其位置,否则输出-1,表示查找失败。

4.删除表中重复的元素

该操作从线性表的第1个元素开始到最后1个元素为止,依次检查在某个元素后面的元素中是否存在与之相同的元素,若存在,则删除后面那个元素,并且及时修改表的长度。

5. 对线性表中元素进行排序

该操作是第i趟排序从线性表的后面的n-i个数据中选择一个值最小的数据元素,并将其与第i个元素交换位置,如此经过n-1趟,形成个值从小到大的线性表。

#include<iostream>
#include<cstdio>
#include<cstring>
#define max 1000
using namespace std;

void insertlist(int a[],int &n,int i,int item)
{	
	
	if(n==max||i<1||i>n+1)
		printf("表满或插入位置不正确!");	 
	for(int j=n;j>=i;j--)
		a[j+1]=a[j];
	a[i]=item;
	n++;
}

void deletelist(int a[],int &n,int i)
{
	if(i<1||i>n)
		printf("表空或删除位置不正确!");	
	for(int j=i+1;j<=n;j++)
		a[j-1]=a[j];
	n--;
}

int locate(int a[],int &n,int item)
{
	for(int j=1;j<=n;j++)
		if(a[j]==item)
			return j;
	return -1;//查找失败 
}

void purge(int a[],int &n) 
{
	int i=1,j;
	while(i<=n)
	{
		j=i+1;
		while(j<=n)
		{
			if(a[j]==a[i])
			{
				deletelist(a,n,j);
			}
			else
				j++;
		}
		i++;
	}
}

void selectsort(int a[],int &n)
{
	int temp;
	for(int i=1;i<n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			if(a[i]>a[j])
			{
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}
}

void selectsort1(int a[],int &n)
{
	int temp,d;
	for(int i=1;i<n;i++)
	{
		d=i;//假设最小元素为未排序线性表的第1个元素 
		for(int j=i+1;j<=n;j++)
		{
			if(a[j]>a[d])
				d=j;//寻找最小的元素,并记录其位置 
			if(d!=i)//当最小元素不是第1个元素时 
			{
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}
}

void printinfo(int a[max],int n)//输出 
{
	for(int j=1;j<=n;j++)
		printf("%d ",a[j]);
	printf("\n");
}

int main()
{
	int a[max],n,i,item;
	scanf("%d",&n);
	for(int j=1;j<=n;j++)
		scanf("%d",&a[j]);
		
	//在长度为n的线性表的第i个位置插入一个新的数据item 	
	scanf("%d %d",&i,&item); 
	insertlist(a,n,i,item);
	printinfo(a,n);
	
	//删除长度为n的线性表的第i个元素
	scanf("%d",&i);
	deletelist(a,n,i);
	printinfo(a,n);
	
	//确定元素item在长度为n的线性表中的位置 
	scanf("%d",&item);
	printf("%d\n",locate(a,n,item));
	
	//删除表中重复的元素
	purge(a,n);
	printinfo(a,n);
	
	//对线性表中元素进行排序
	selectsort(a,n);
	printinfo(a,n);
	
	//对线性表中元素进行排序
	selectsort1(a,n);
	printinfo(a,n);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值