一、实验目的
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.