W...Y的主页 😊
代码仓库分享 💕
目录
一、实验目的:
二、实验内容:
三、实验要求:
四.实验步骤(给出每个函数的算法描述):
五.实验结果:
六.源代码
实验名称 : 顺序表的基本操作
一、实验目的:
1、复习C语言程序设计中的知识。
2、掌握线性表的顺序存储结构的表示和实现方法。
3、掌握顺序表基本操作的算法实现。
二、实验内容:
1.建立顺序表。
2.在顺序表上实现插入、删除和查找等操作。
三、实验要求:
1. 编写实现顺序表的基本算法(初始化、查找、插入、删除等)的函数,并在此基础上设计一个主程序完成如下功能:
⑴初始化一个顺序表L,数据元素类型可任选;
⑵建立顺序表L,要求数据元素至少10个;
⑶输出顺序表L的长度;
⑷按位置查找:输出顺序表L的第i个元素,如第3个元素;
⑸按内容查找:输出给定元素的位置;
⑹在第i个元素前插入给定元素;
⑺删除顺序表L的第i个元素;
⑻遍历顺序表,将表中的元素按序输出。
⑼编写菜单,以便用户可以选择相应的操作。
2. 利用顺序表的基本操作,求两个集合A和B的交集、并集和差集。
四.实验步骤(给出每个函数的算法描述):
下面是使用 C 语言实现顺序表的一般步骤:
1.定义结构体:首先,你需要定义一个结构体来表示顺序表。该结构体至少应包含两个成员:一个数组来存储数据元素,以及一个整型变量来记录当前元素的数量。
#define MAX_SIZE 100
typedef struct {
int data[MAX_SIZE];
int length;
} SeqList;
2.初始化顺序表:创建一个函数来初始化顺序表。这将包括将顺序表的 length 成员设置为 0。void init(SeqList *list) {
list->length = 0;
}
3.插入元素:创建一个函数用于在顺序表中插入元素。这将包括将新元素添加到数组中,并增加 length 变量的值。int insert(SeqList *list, int index, int element) {
if (index < 0 || index > list->length || list->length == MAX_SIZE) {
return 0; // 插入失败
}// 将 index 位置及其后面的元素后移一位
for (int i = list->length - 1; i >= index; i--) {
list->data[i + 1] = list->data[i];
}// 在 index 位置插入新元素
list->data[index] = element;
list->length++;return 1; // 插入成功
}
4.删除元素:创建一个函数用于从顺序表中删除元素。这将涉及将指定位置的元素删除,并将后面的元素向前移动。int remove(SeqList *list, int index) {
if (index < 0 || index >= list->length) {
return 0; // 删除失败
}// 将 index 位置后面的元素前移一位
for (int i = index + 1; i < list->length; i++) {
list->data[i - 1] = list->data[i];
}list->length--;
return 1; // 删除成功
}
5.查找元素:创建一个函数用于在顺序表中查找指定元素。这将涉及遍历顺序表的元素,并与目标元素进行比较。int search(SeqList *list, int element) {
for (int i = 0; i < list->length; i++) {
if (list->data[i] == element) {
return i; // 返回元素位置
}
}return -1; // 找不到元素
}
6.打印顺序表:创建一个函数来打印顺序表的所有元素。void print(SeqList *list) {
for (int i = 0; i < list->length; i++) {
printf("%d ", list->data[i]);
}printf("\n");
}当完善顺序表的实验步骤时,你可以考虑添加以下功能:
1.获取指定位置的元素:创建一个函数,用于获取指定位置的元素值。
int getElement(SeqList *list, int index) {
if (index < 0 || index >= list->length) {
return -1; // 获取失败,返回一个特定的错误值
}return list->data[index];
}
2.更新指定位置的元素:创建一个函数,用于更新指定位置的元素值。int updateElement(SeqList *list, int index, int newElement) {
if (index < 0 || index >= list->length) {
return 0; // 更新失败
}list->data[index] = newElement;
return 1; // 更新成功
}
3.清空顺序表:创建一个函数,用于清空顺序表中的所有元素。void clear(SeqList *list) {
list->length = 0;
}这些是一些常见的功能,可以帮助完善顺序表的实验步骤。在实际应用中,你还可以根据需要扩展其他功能,例如顺序表的动态扩容、按值查找等。确保在修改完善代码后,进行编译和测试,以确保顺序表的正确性和稳定性。
五.实验结果:
初始化成功
销毁顺序表
- 头部插入
- 尾部插入
- 头部删除
- 尾部删除
查找想要pos位置的元素下标
六.源代码
Seqlist.h文件
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef int SLDateType;
typedef struct SeqList
{
SLDateType* a;
int size;
int capacity;
}SL;
// 对数据的管理:增删查改
//初始化
void SeqListInit(SL* ps);
//销毁
void SeqListDestroy(SL* ps);
//打印
void SeqListPrint(SL* ps);
//尾插
void SeqListPushBack(SL* ps, SLDateType x);
//头插
void SeqListPushFront(SL* ps, SLDateType x);
//头删
void SeqListPopFront(SL* ps);
// 尾删
void SeqListPopBack(SL* ps);
//检测空间是否需要扩容
void SLCheckCapacity(SL* ps);
//
顺序表查找
int SeqListFind(SL* ps, SLDateType x);
顺序表在pos位置插入x
void SeqListInsert(SL* ps, int pos, SLDateType x);
顺序表删除pos位置的值
void SeqListErase(SL* ps, int pos);
Seqlist.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"SeqList.h"
void SeqListInit(SL* ps)
{
ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);
if (ps->a == NULL)
{
perror("malloc");
exit(-1);
}
ps->size = 0;
ps->capacity = 4;
}
void SeqListDestroy(SL* ps)
{
free(ps->a);
ps->a = NULL;
ps->size = 0;
ps->capacity = 0;
}
void SeqListPrint(SL* ps)
{
for (int i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
void SLCheckCapacity(SL* ps)
{
if (ps->size == ps->capacity)
{
SLDateType* p = (SLDateType*)realloc(ps->a, sizeof(ps->a) * 2);
if (*p == NULL)
{
perror(realloc);
exit(-1);
}
ps->capacity *= 2;
ps->a = p;
}
}
void SeqListPushBack(SL* ps, SLDateType x)
{
SLCheckCapacity(ps);
ps->a[ps->size] = x;
ps->size++;
}
void SeqListPopBack(SL* ps)
{
assert(ps->size > 0);
/*if (ps->sz == 0)
{
return;
}*/
ps->size--;
}
void SeqListPushFront(SL* ps, SLDateType x)
{
SLCheckCapacity(ps);
for (int i = ps->size; i > 0; i--)
{
ps->a[i] = ps->a[i - 1];
}
ps->a[0] = x;
ps->size++;
}
void SeqListPopFront(SL* ps)
{
assert(ps->size > 0);
for (int i = 0; i < ps->size - 1; i++)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
void SeqListInsert(SL* ps, int pos, SLDateType x)
{
assert(pos >= 0 && pos <= ps->size);
SLCheckCapacity(ps);
int end = ps->size - 1;
while (end >= pos)
{
ps->a[end + 1] = ps->a[end];
--end;
}
ps->a[pos] = x;
ps->size++;
}
void SeqListErase(SL* ps, int pos)
{
assert(ps->size > 0);
for (int i = pos - 1; i < ps->size - 1; i++)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
int SeqListFind(SL* ps, SLDateType x)
{
assert(ps->size > 0);
for (int i = 0; i < ps->size; i++)
{
if (ps->a[i] == x)
return i;
}
return -1;
}
Test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"Seqlist.h"
void menu()
{
printf("******************************************************\n");
printf("******* 线 性 表 ******\n");
printf("******* 1.初始化顺序表 ******\n");
printf("******* 2. 销毁顺序表 ******\n");
printf("******* 3. 头部插入 ******\n");
printf("******* 4. 尾部插入 ******\n");
printf("******* 5. 头部删除 ******\n");
printf("******* 6. 尾部删除 ******\n");
printf("******* 7. 在pos位置插入给定元素 ******\n");
printf("******* 8. 删除pos位置的元素 *****\n");
printf("******* 9. 遍历顺序表,将表中的元素按序输出 ******\n");
printf("******* 10. 查找想要pos位置的元素下标 *****\n");
printf("******* 0. 退出程序 ***********\n\n");
printf("----------------------------------------------------\n\n");
}
int main()
{
SL sl;
int choose = 0;
do
{
menu();
printf("请选择需要的功能:");
scanf("%d", &choose);
if (!(choose >= 0 && choose <= 10))
{
printf("非法输入,重新输入(范围0~10)\n");
continue;
}
switch (choose)
{
case 1:
{
SeqListInit(&sl);
printf("初始化成功\n");
break;
}
case 2:
{
SeqListDestroy(&sl);
printf("销毁成功\n");
break;
}
case 3:
{
int num = 0;
printf("输入存放值:");
scanf("%d", &num);
SeqListPushFront(&sl, num);
break;
}
case 4:
{
int num = 0;
printf("输入存放值:");
scanf("%d", &num);
SeqListPushBack(&sl, num);
break;
}
case 5:
{
SeqListPopFront(&sl);
break;
}
case 6:
{
SeqListPopBack(&sl);
break;
}
case 7:
{
int num = 0;
int pos = 0;
printf("输入存放值:");
scanf("%d", &num);
printf("\n输入想要放置的pos位:");
scanf("%d", &pos);
SeqListInsert(&sl, pos, num);
break;
}
case 8:
{
int pos = 0;
printf("\n输入想要删除的pos位:");
scanf("%d", &pos);
SeqListErase(&sl, pos);
break;
}
case 9:
{
SeqListPrint(&sl);
break;
}
case 10:
{
int num = 0;
printf("输入寻找pos位的元素:");
scanf("%d", &num);
printf("%d\n",SeqListFind(&sl, num));
break;
}
case 0: printf("结束程序\n");
}
} while (choose);
return 0;
}
以上代码需要不能直接应用,需要在三个文件中使用,在借鉴使用同时,如果有不明白的地方可以私信博主,博主在线解答。