实验报告:数据结构线性表应用实验

一、实验目的

本次实验旨在掌握线性表的基本概念和操作,熟悉线性表在实际应用中的使用方法,并能够编写相关的代码实现。

二、实验内容

本次实验主要包括以下内容:

  1. 线性表的基本操作:创建、插入、删除、查找等。

  2. 线性表的应用:使用线性表实现一个简单的通讯录程序,包括添加联系人、查找联系人、删除联系人、显示联系人等功能。

三、实验环境

本次实验使用的编程语言为C语言,使用的开发环境为Visual Studio 2019。

四、实验步骤

  1. 创建线性表

首先,我们需要定义一个结构体来表示通讯录中的一个联系人,包括姓名、电话号码和电子邮件地址等信息。

typedef struct { char name[20]; // 姓名 char phone[20]; // 电话号码 char email[50]; // 电子邮件地址 } Contact;

接着,我们需要定义线性表的结构体,包括线性表的元素类型、元素数量、元素容量和元素数组等信息。

typedef struct { Contact *data; // 元素数组 int length; // 元素数量 int capacity; // 元素容量 } List;

创建一个新的线性表时,我们需要分配一定的内存空间来存储元素数组,并初始化线性表的长度和容量等属性。

List *createList(int capacity) { List *list = (List *)malloc(sizeof(List)); list->data = (Contact *)malloc(capacity * sizeof(Contact)); list->length = 0; list->capacity = capacity; return list; }

  1. 插入元素

在通讯录程序中,我们需要实现添加联系人的功能,即向线性表中插入一个新元素。我们可以通过以下代码来实现插入操作:

bool insert(List *list, Contact contact, int index) { if (index < 0 || index > list->length) { return false; } if (list->length >= list->capacity) { return false; } for (int i = list->length - 1; i >= index; i--) { list->data[i + 1] = list->data[i]; } list->data[index] = contact; list->length++; return true; }

这段代码首先判断插入位置是否合法,然后判断线性表是否已满。如果插入位置合法且线性表未满,则将插入位置之后的元素向后移动一位,然后在插入位置处插入新元素,并将线性表的长度加1。

  1. 删除元素

在通讯录程序中,我们需要实现删除联系人的功能,即从线性表中删除一个元素。我们可以通过以下代码来实现删除操作:

bool remove(List *list, int index) { if (index < 0 || index >= list->length) { return false; } for (int i = index + 1; i < list->length; i++) { list->data[i - 1] = list->data[i]; } list->length--; return true; }

这段代码首先判断删除位置是否合法,然后将删除位置之后的元素向前移动一位,最后将线性表的长度减1。

  1. 查找元素

在通讯录程序中,我们需要实现查找联系人的功能,即根据姓名查找一个元素。我们可以通过以下代码来实现查找操作:

int find(List *list, char *name) { for (int i = 0; i < list->length; i++) { if (strcmp(list->data[i].name, name) == 0) { return i; } } return -1; }

这段代码遍历整个元素数组,如果找到了指定姓名的元素,则返回其位置。如果未找到,则返回-1。

  1. 显示元素

在通讯录程序中,我们需要实现显示联系人的功能,即将所有元素打印出来。我们可以通过以下代码来实现显示操作:

void display(List *list) { for (int i = 0; i < list->length; i++) { printf("%s\t%s\t%s\n", list->data[i].name, list->data[i].phone, list->data[i].email); } }

这段代码遍历整个元素数组,将每个元素的姓名、电话号码和电子邮件地址打印出来。

五、实验结果

通过以上步骤,我们完成了线性表的基本操作,并实现了一个简单的通讯录程序。下面是完整的代码实现:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h>

// 联系人结构体 typedef struct { char name[20]; // 姓名 char phone[20]; // 电话号码 char email[50]; // 电子邮件地址 } Contact;

// 线性表结构体 typedef struct { Contact *data; // 元素数组 int length; // 元素数量 int capacity; // 元素容量 } List;

// 创建线性表 List *createList(int capacity) { List *list = (List *)malloc(sizeof(List)); list->data = (Contact *)malloc(capacity * sizeof(Contact)); list->length = 0; list->capacity = capacity; return list; }

// 插入元素 bool insert(List *list, Contact contact, int index) { if (index < 0 || index > list->length) { return false; } if (list->length >= list->capacity) { return false; } for (int i = list->length - 1; i >= index; i--) { list->data[i + 1] = list->data[i]; } list->data[index] = contact; list->length++; return true; }

// 删除元素 bool remove(List *list, int index) { if (index < 0 || index >= list->length) { return false; } for (int i = index + 1; i < list->length; i++) { list->data[i - 1] = list->data[i]; } list->length--; return true; }

// 查找元素 int find(List *list, char *name) { for (int i = 0; i < list->length; i++) { if (strcmp(list->data[i].name, name) == 0) { return i; } } return -1; }

// 显示元素 void display(List *list) { for (int i = 0; i < list->length; i++) { printf("%s\t%s\t%s\n", list->data[i].name, list->data[i].phone, list->data[i].email); } }

int main() { List *list = createList(10);

Contact c1 = {"张三", "123456789", "zhangsan@qq.com"};
Contact c2 = {"李四", "987654321", "lisi@qq.com"};
Contact c3 = {"王五", "135792468", "wangwu@qq.com"};

insert(list, c1, 0);
insert(list, c2, 1);
insert(list, c3, 2);

display(list);

int index = find(list, "李四");
if (index != -1) {
    remove(list, index);
}

display(list);

return 0;

}

六、实验结论

通过本次实验,我们掌握了线性表的基本概念和操作,并且成功地使用线性表实现了一个简单的通讯录程序。线性表作为一种常用的数据结构,在实际应用中有着广泛的应用场景,学习掌握线性表的相关知识和技能对于我们的编程能力提升具有重要意义

写一篇关于数据结构线性表应用实验报告要求写出实验代码

原文地址: http://www.cveoy.top/t/topic/fbnD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录