数据结构实验课:实验一、顺序表的实现及应用

本文涉及的产品
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介: 数据结构实验课:实验一、顺序表的实现及应用


一、实验目的


了解和掌握线性表的顺序存储结构;掌握用C语言上机调试线性表的基本方法;掌握线性表的基本操作:插入、删除、查找以及线性表合并等运算在顺序存储结构和链接存储结构上的运算,以及对相应算法的性能分析。


二、实验要求


给定一段程序代码,程序代码所完成的功能为:(1)建立一个线性表;(2)依次输入数据元素1,2,3,4,5,6,7,8,9,10;(3)删除数据元素5;(4)依次显示当前线性表中的数据元素。假设该线性表的数据元素个数在最坏情况下不会超过100个,要求使用顺序表。

程序中有3处错误的地方,有标识,属于逻辑错误,对照书中的代码仔细分析后,要求同学们修改错误的代码,修改后上机调试得到正确的运行结果。


三、程序代码


#include <stdio.h>
#define MaxSize 100
typedef int DataType;
typedef struct
{
DataType list[MaxSize];
int size;
} SeqList;
void ListInitiate(SeqList *L)/初始化顺序表L/
{
L->size = 0;/定义初始数据元素个数/
}
int ListLength(SeqList L)/返回顺序表L的当前数据元素个数/
{
return L.size;
}
int ListInsert(SeqList *L, int i, DataType x)
/在顺序表L的位置i(0 ≤ i ≤ size)前插入数据元素值x/
/插入成功返回1,插入失败返回0/
{
int j;
if(L->size >= MaxSize)
{
printf(“顺序表已满无法插入! \n”);
return 0;
}
else if(i < 0 || i > L->size )
{
printf(“参数i不合法! \n”);
return 0;
}
else
{ //此段程序有一处错误
for(j = L->size; j > i; j–) L->list[j+1] = L->list[j];/为插入做准备/
L->list[i] = x;/插入/
L->size ++;/元素个数加1/
return 1;
}
}
int ListDelete(SeqList *L, int i, DataType *x)
/删除顺序表L中位置i(0 ≤ i ≤ size - 1)的数据元素值并存放到参数x中/
/删除成功返回1,删除失败返回0/
{
int j;
if(L->size <= 0)
{
printf(“顺序表已空无数据元素可删! \n”);
return 0;
}
else if(i < 0 || i > L->size-1)
{
printf(“参数i不合法”);
return 0;
}
else
{//此段程序有一处错误
*x = L->list[i];/保存删除的元素到参数x中/
for(j = i +1; j <= L->size-1; j++) L->list[j] = L->list[j-1];/依次前移/
L->size–;/数据元素个数减1/
return 1;
}
}
int ListGet(SeqList L, int i, DataType *x)
/取顺序表L中第i个数据元素的值存于x中,成功则返回1,失败返回0/
{
if(i < 0 || i > L.size-1)
{
printf(“参数i不合法! \n”);
return 0;
}
else
{
*x = L.list[i];
return 1;
}
}
void main(void)
{ SeqList myList;
int i , x;
ListInitiate(&myList);
for(i = 0; i < 10; i++)
ListInsert(&myList, i, i+1);
ListDelete(&myList, 4, &x);
for(i = 0; i < ListLength(myList); i++)
{
ListGet(,i,&x); //此段程序有一处错误
printf("%d", x);
}
}


四、实验任务


1.改正上述程序中的错误。

2.编写合并函数,将两个有序线性表合并为一个有序表并在主函数中加以测试。

3.完成实验报告的撰写。


代码如下:


#include <stdio.h>
#define MaxSize  100
typedef int DataType;
typedef struct
{
    DataType list[MaxSize];
    int size;
} SeqList;
void ListInitiate(SeqList *L)/*初始化顺序表L*/
{
    L->size = 0;/*定义初始数据元素个数*/
}
int ListLength(SeqList L)/*返回顺序表L的当前数据元素个数*/
{
    return L.size;
}
int ListInsert(SeqList *L, int i, DataType x)
/*在顺序表L的位置i(0 ≤ i ≤ size)前插入数据元素值x*/
/*插入成功返回1,插入失败返回0*/
{
    int j;
    if(L->size >= MaxSize)
    {
        printf("顺序表已满无法插入! \n");
        return 0;
    }
    else if(i < 0 || i > L->size )
    {
        printf("参数i不合法! \n");
        return 0;
    }
    else
    {
        //此段程序有一处错误
        for(j = L->size; j > i; j--) L->list[j] = L->list[j-1];/*为插入做准备*/
        L->list[i] = x;/*插入*/
        L->size ++;/*元素个数加1*/
        return 1;
    }
}
int ListDelete(SeqList *L, int i, DataType *x)
/*删除顺序表L中位置i(0 ≤ i ≤ size - 1)的数据元素值并存放到参数x中*/
/*删除成功返回1,删除失败返回0*/
{
    int j;
    if(L->size <= 0)
    {
        printf("顺序表已空无数据元素可删! \n");
        return 0;
    }
    else if(i < 0 || i > L->size-1)
    {
        printf("参数i不合法");
        return 0;
    }
    else
    {
        //此段程序有一处错误
        *x = L->list[i];/*保存删除的元素到参数x中*/
        for(j = i +1; j <= L->size-1; j++) L->list[j-1] = L->list[j];/*依次前移*/
        L->size--;/*数据元素个数减1*/
        return 1;
    }
}
int ListGet(SeqList L, int i, DataType *x)
/*取顺序表L中第i个数据元素的值存于x中,成功则返回1,失败返回0*/
{
    if(i < 0 || i > L.size-1)
    {
        printf("参数i不合法! \n");
        return 0;
    }
    else
    {
        *x = L.list[i];
        return 1;
    }
}
int main()
{
    SeqList myList;
    int i, x;
    ListInitiate(&myList);
    for(i = 0; i < 10; i++)
        ListInsert(&myList, i, i+1);
    ListDelete(&myList, 4, &x);
    for(i = 0; i < ListLength(myList); i++)
    {
        ListGet(myList,i,&x); //此段程序有一处错误
        printf("%d", x);
    }
    return 0;
}


第二题


#include <stdio.h>
#include <stdlib.h>
#define MaxSize  100
typedef int DataType;
typedef struct
{
    DataType list[MaxSize];
    int size;
} SeqList;
void ListInitiate(SeqList *L)/*初始化顺序表L*/
{
    L->size = 0;/*定义初始数据元素个数*/
}
int ListLength(SeqList L)/*返回顺序表L的当前数据元素个数*/
{
    return L.size;
}
int ListInsert(SeqList *L, int i, DataType x)
/*在顺序表L的位置i(0 ≤ i ≤ size)前插入数据元素值x*/
/*插入成功返回1,插入失败返回0*/
{
    int j;
    if(L->size >= MaxSize)
    {
        printf("顺序表已满无法插入! \n");
        return 0;
    }
    else if(i < 0 || i > L->size )
    {
        printf("参数i不合法! \n");
        return 0;
    }
    else
    {
        //此段程序有一处错误
        for(j = L->size; j >= i; j--) L->list[j+1] = L->list[j];/*为插入做准备*/
        L->list[i] = x;/*插入*/
        L->size ++;/*元素个数加1*/
        return 1;
    }
}
int ListDelete(SeqList *L, int i, DataType *x)
/*删除顺序表L中位置i(0 ≤ i ≤ size - 1)的数据元素值并存放到参数x中*/
/*删除成功返回1,删除失败返回0*/
{
    int j;
    if(L->size <= 0)
    {
        printf("顺序表已空无数据元素可删! \n");
        return 0;
    }
    else if(i < 0 || i > L->size-1)
    {
        printf("参数i不合法");
        return 0;
    }
    else
    {
        //此段程序有一处错误
        *x = L->list[i];/*保存删除的元素到参数x中*/
        for(j = i+1; j <= L->size-1; j++)
            L->list[j-1] = L->list[j];/*依次前移*/
        L->size--;/*数据元素个数减1*/
        return 1;
    }
}
int ListGet(SeqList L, int i, DataType *x)
/*取顺序表L中第i个数据元素的值存于x中,成功则返回1,失败返回0*/
{
    if(i < 0 || i > L.size-1)
    {
        printf("参数i不合法! \n");
        return 0;
    }
    else
    {
        *x = L.list[i];
        return 1;
    }
}
void MergeList(SeqList La,SeqList Lb,SeqList Lc)
{
    DataType* pa;
    DataType* pb;
    DataType* pc;
    DataType* pa_last;
    DataType* pb_last;
    pa = La.list;
    pb = Lb.list;
    pc = Lc.list;
    Lc.size = La.size + Lb.size;
    if(!Lc.list) exit(-1);
    pa_last = La.list + La.size-1;
    pb_last = Lb.list + Lb.size-1;
    while(pa <=pa_last&&pb<pb_last)
    {
        if(*pa<= *pb) *pc++ = *pa++;
        else *pc++ = *pb++;
    }
    while(pa<= pa_last) *pc++ = *pa++;
    while(pb<= pb_last) *pc++ = *pb++;
    for(int i = 0,x=0; i < ListLength(Lc); i++)
    {
        ListGet(Lc,i,&x); //此段程序有一处错误
        printf("%d ", x);
    }
    printf("\n");
}
int main(void)
{
    int i,x,j;
    SeqList La,Lb,Lc;
    ListInitiate(&La);
    ListInitiate(&Lb);
    ListInitiate(&Lc);
    for(i = 0,j=0; i < 10; i++,j+=2)
        ListInsert(&La, i, j);
    for(i = 0,j=1; i < 10; i++,j+=2)
        ListInsert(&Lb, i, j);
    for(i = 0; i < ListLength(La); i++)
    {
        ListGet(La,i,&x); //此段程序有一处错误
        printf("%d ", x);
    }
    printf("\n");
    for(i = 0; i < ListLength(Lb); i++)
    {
        ListGet(Lb,i,&x); //此段程序有一处错误
        printf("%d ", x);
    }
    printf("\n");
    MergeList(La,Lb,Lc);
    /*
    SeqList myList;
    int i, x;
    ListInitiate(&myList);
    for(i = 0; i < 10; i++)
        ListInsert(&myList, i, i+1);
    ListDelete(&myList, 4, &x);
    for(i = 0; i < ListLength(myList); i++)
    {
        ListGet(myList,i,&x); //此段程序有一处错误
        printf("%d", x);
    }
    */
}
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
2月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
275 86
|
4月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
152 1
|
4月前
|
存储 监控 算法
公司员工泄密防护体系中跳表数据结构及其 Go 语言算法的应用研究
在数字化办公中,企业面临员工泄密风险。本文探讨使用跳表(Skip List)数据结构优化泄密防护系统,提升敏感数据监测效率。跳表以其高效的动态数据处理能力,为企业信息安全管理提供了可靠技术支持。
120 0
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
305 4
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
146 1
|
9月前
|
DataX
☀☀☀☀☀☀☀有关栈和队列应用的oj题讲解☼☼☼☼☼☼☼
### 简介 本文介绍了三种数据结构的实现方法:用两个队列实现栈、用两个栈实现队列以及设计循环队列。具体思路如下: 1. **用两个队列实现栈**: - 插入元素时,选择非空队列进行插入。 - 移除栈顶元素时,将非空队列中的元素依次转移到另一个队列,直到只剩下一个元素,然后弹出该元素。 - 判空条件为两个队列均为空。 2. **用两个栈实现队列**: - 插入元素时,选择非空栈进行插入。 - 移除队首元素时,将非空栈中的元素依次转移到另一个栈,再将这些元素重新放回原栈以保持顺序。 - 判空条件为两个栈均为空。
|
机器学习/深度学习 存储 人工智能
数据结构在实际开发中的广泛应用
【10月更文挑战第20天】数据结构是软件开发的基础,它们贯穿于各种应用场景中,为解决实际问题提供了有力的支持。不同的数据结构具有不同的特点和优势,开发者需要根据具体需求选择合适的数据结构,以实现高效、可靠的程序设计。
664 63
|
10月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】
本文档介绍了线性表的基本运算任务,涵盖顺序表和链表的初始化、销毁、判定是否为空、求长度、输出、查找元素、插入和删除元素等内容。通过C++代码示例详细展示了每一步骤的具体实现方法,并提供了测试说明和通关代码。 主要内容包括: - **任务描述**:实现顺序表的基本运算。 - **相关知识**:介绍线性表的基本概念及操作,如初始化、销毁、判定是否为空表等。 - **具体操作**:详述顺序表和链表的初始化、求长度、输出、查找、插入和删除元素的方法,并附有代码示例。 - **测试说明**:提供测试输入和预期输出,确保代码正确性。 - **通关代码**:给出完整的C++代码实现,帮助完成任务。 文档
324 5
|
11月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
12月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
353 5

热门文章

最新文章

下一篇
oss云网关配置