数据结构实验一 线性表的顺序存储结构

一、实验目的

1.熟练掌握顺序表基本操作的C语言实现。

2.掌握顺序表的应用,逐步培养解决实际问题的能力。

3.培养学生程序设计能力,要求编写的程序结构清楚和正确易读,符合软件工程的规范。

4.培养学生利用顺序表解决实际问题的能力。

二、实验题目 

 1.设计并验证以下算法:设顺序表L中的数据元素为整数且非递增有序,删除其值相同的多余元素,即顺序表L中相同的元素只保留一个,并逆置删除后的顺序表L。

(1)根据键盘输入数据建立顺序表L。

(2)输出顺序表L、删除值相同多余元素后的顺序表L\逆置的顺序表L。

(3)假设顺序表L的长度为n,要求以O(n)的时间复杂度完成对值相同多余元素的删除

2.给定一个含n(n≥1)个整数的数组,请设计实现一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。

三、程序清单

1.

#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR -1

typedef int Elemtype;
typedef int Status;
typedef struct{
	Elemtype *elem;    //存储空间基址 
	int length;        //当前长度 
	int listsize;      //当前分配的存储容量(顺序表最大长度) 
}SqList;

//初始化顺序表 
Status InitList(SqList &L){
	L.elem = (Elemtype * )malloc(LIST_INIT_SIZE *sizeof(Elemtype));
	if(!L.elem){
		exit(ERROR);    // 异常处理 
	}
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
}

//把元素放入顺序表 
Status WriteList(SqList &L){
	printf("请输入需要创建顺序表的长度:");
	scanf("%d", &L.length);
	printf("请输入%d个需要放入的元素:\n", L.length);
	if(L.length<=0){
		return ERROR;     // 异常处理 
	}
	for(int i=0;i<L.length;i++){
		scanf("%d", &L.elem[i]);    // 将元素放入顺序表 
	} 
	printf("顺序表L为:");     // 检验顺序表 
	for(int i=0;i<L.length;i++){
		printf("%d ",L.elem[i]);
	}
	printf("\n");
	return OK;
}

// 顺序表删除相同的元素 
Status DeleteList(SqList &L) {
	int i,j;
	if(L.length<=0){
		return ERROR;
	}
	for(i=0,j=1;j<L.length;j++){
		if(L.elem[i]!=L.elem[j]){
			L.elem[++i]=L.elem[j];
		}
	}
	L.length=i+1;
	printf("删除值相同多余元素后的顺序表L为:"); 
	for(int i=0;i<L.length;i++){
		printf("%d ",L.elem[i]);
	}
	printf("\n");
	return OK;
}

//顺序表的逆置
Status InversionList(SqList &L) {
	int t;
	int length=L.length;
	for(int i=0;i<=length/2;i++){
		t=L.elem[i];
		L.elem[i]=L.elem[length-1];
		L.elem[length-1]=t;
		length--;
	}
	printf("逆置的顺序表L为:");
	for(int i=0;i<L.length;i++){
		printf("%d ",L.elem[i]);
	} 
	printf("\n");
	return OK;
}


int main(){
	SqList L;
	int i;
	i=InitList(L);
	i=WriteList(L);
	i=DeleteList(L);
	i=InversionList(L);
	if(i==1){
		printf("完成!");
	}
	else{
		printf("失败!"); 
	}
}

 2.

#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define OK 1
#define ERROR -1

typedef int Elemtype;
typedef int Status;
typedef struct{
	Elemtype *elem;    //存储空间基址 
	int length;        //当前长度 
	int listsize;      //当前分配的存储容量(顺序表最大长度) 
}SqList;

//初始化顺序表 
Status InitList(SqList &L){
	L.elem = (Elemtype * )malloc(LIST_INIT_SIZE *sizeof(Elemtype));
	if(!L.elem){
		exit(ERROR);
	}
	L.length = 0;
	L.listsize = LIST_INIT_SIZE;
	return OK;
}

//把元素放入顺序表 
Status WriteList(SqList &L){
	printf("请输入需要创建顺序表的长度:");
	scanf("%d", &L.length);
	printf("请输入%d个需要放入的元素:\n", L.length);
	if(L.length<=0){
		return ERROR;
	}
	for(int i=0;i<L.length;i++){
		scanf("%d", &L.elem[i]);
	} 
	printf("顺序表L为:");
	for(int i=0;i<L.length;i++){
		printf("%d ",L.elem[i]);
	}
	printf("\n");
	return OK;
}

int FindMissMin(SqList &L)
{
	int min = 1;
	int i;
	int a[LIST_INIT_SIZE];
	for(i=0;i<L.length;i++){
		if(L.elem[i]>=1){
			a[L.elem[i]]=1;
		}
	} 
	for(i=1;i<LIST_INIT_SIZE;i++){
		if(a[i]==0){
			return i;
		} 
	} 
}

int main(){
	SqList L;
	int i;
	InitList(L);
	WriteList(L);
	i=FindMissMin(L);
	printf("未出现的最小整数为%d",i);

四、实验结果 

1.

2.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值