数据结构实验一
南昌航空大学实验报告
二0 21 年 4 月 19 日
课程名称: 数据结构实验 实验名称: 线性表的链式存储结构
班级: 姓名: 同组人:
指导教师评定: 签名:
一、 需求分析
题目:设计并验证以下算法:设顺序表L中的数据元素为整数且非递增有序,删除其值相同的多余元素,即顺序表L中相同的元素只保留一个,并逆置删除后的顺序表L。
(1)根据键盘输入数据建立顺序L。
(2)输出顺序表L,删除值相同多余元素后的顺序表L、逆置的顺序表L。
(3)假设顺序表L的长度为n,要求以 O(n)的时间复杂度完成对值相同多余元素的删除。
1、在本次实验中,首先,创建顺序表L,再删除顺序表L的多余元素,然后将新的到的顺序表逆置,最后输出所得到的三个顺序表。
2.演示程序以用户和计算机对话的方式进行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入顺序表L。输出三个要求的顺序表。
3.程序执行的命令包括:
(1)创建顺序表L;
(2)输出顺序表L;
(3)将顺序表中多余元素删除得到新顺序表L1;
(4)输出顺序表L1;
(5)将顺序表L1逆置得到新的顺序表L2;
(6)输出顺序表L2;
(7)结束。
4.测试数据
输入:8
9 9 8 7 6 6 5 4
输出:顺序表:9 9 8 7 6 6 5 4
删除相同多余元素后的顺序表:9 8 7 6 5 4
逆置的顺序表:4 5 6 7 8 9
二、 概要设计
1. 抽象数据类型定义
为实现上述程序功能,需要一个抽象数据类型:
ADT Graph{
基本操作:
List InitList(List l)
操作结果:将新建顺序表初始化;
List CreatList(List l)
操作结果:赋予具体数值给顺序表
void PrintList(List l)
操作结果:将顺序表输出
List DelList(List l)
操作结果:删除顺序表中重复多余的数
List SortList(List l)
操作结果:将顺序表逆置
2.程序模块
(1)主程序流程
int main{
初始化、创建顺序表;
给顺序表赋值;
输出顺序表;
删除顺序表中多于重复元素得到新顺序表;
输出新顺序表;
将新顺序表再逆置得到新顺序表;
输出新顺序表;
}
(2)顺序表初始化;
(3)顺序表输入;
(4)顺序表删除;
(5)顺序表逆置;
(6)顺序表输出。
3.程序结构图
各模块之间的调用关系如图所示。
图1 模块之间调用关系图
三、 详细设计
1.数据类型及结构体
typedef struct Node
{
int Data[Maxsize];
int len;
}Node,*List;
List InitList(List l);//顺序表初始化
List CreatList(List l);//顺序表创建
void PrintList(List l);//顺序表输出
List DelList(List l);//顺序表多余元素删除
List SortList(List l);//顺序表逆置
2.主函数
int main()
{
Node node;
List l=&node;
l=InitList(l);
l=CreatList(l);
printf("顺序表:\n");
PrintList(l);
printf("\n");
l=DelList(l);
printf("删除相同多余元素后的顺序表:\n");
PrintList(l);
printf("\n");
l=SortList(l);
printf("逆置的顺序表:\n");
PrintList(l);
return 0;
}
四、 调试分析
1.第一次完成顺序表多余元素删除与顺序表逆置时创建一个新的线性表去实现,通过改进在原线性表上完成多余元素的删除与逆置。
2. 顺序表多余元素删除用for语句找到重复元素,将后边元素都往前推进,完成后再寻找下一个重复元素,时间复杂度不为O(n),改进代码如下:
for(i=1,j=1;i<l->len;i++)
{
if(l->Data[i]!=l->Data[i-1])
{
l->Data[j++]=l->Data[i];
}
}
五、 用户手册
1. 本程序的运行环境为DOS操作系统,执行文件为:main.exe。
2. 进入演示程序后即显示文本方式的用户界面。
3. 程序运行后,输入顺序表表长以及顺序表元素。
4. 输出三种顺序表。
六、 测试结果
测试结果:
输入:8
9 9 8 7 6 6 5 4
输出:顺序表:9 9 8 7 6 6 5 4
删除相同多余元素后的顺序表:9 8 7 6 5 4
逆置的顺序表:4 5 6 7 8 9
七、 附录
源代码:#include <stdio.h>
#include <stdlib.h>
#define Maxsize 10000
typedef struct Node
{
int Data[Maxsize];
int len;
}Node,*List;
List InitList(List l)//初始化
{
l->len=0;
return l;
}
List CreatList(List l)//创建
{
scanf("%d",&l->len);
int i;
for(i=0;i<l->len;i++)
scanf("%d",&l->Data[i]);
return l;
}
void PrintList(List l)//输出
{
int i;
for(i=0;i<l->len;i++)
{
printf("%d ",l->Data[i]);
}
}
List DelList(List l)//删除
{
int i,j;
for(i=1,j=1;i<l->len;i++)
{
if(l->Data[i]!=l->Data[i-1])
{
l->Data[j++]=l->Data[i];
}
}
l->len=j;
return l;
}
List SortList(List l)//逆置
{
int i,j,num;
{
for(i=0,j=l->len-1;j-i>0;i++,j--)
{
num=l->Data[i];
l->Data[i]=l->Data[j];
l->Data[j]=num;
}
}
return l;
}
int main()
{
Node node;
List l=&node;
l=InitList(l);
l=CreatList(l);
printf("顺序表:\n");
PrintList(l);
printf("\n");
l=DelList(l);
printf("删除相同多余元素后的顺序表:\n");
PrintList(l);
printf("\n");
l=SortList(l);
printf("逆置的顺序表:\n");
PrintList(l);
return 0;
}