Tsai笔记:C++学习随性笔记(2)—— 数据结构:顺序表的基本操作
Tsai笔记:C++学习随性笔记(2)—— 数据结构:顺序表的基本操作
Tsai三步。(第一步,功能说明。第二步,结果图显示。第三步,代码展示)
第一步,功能说明。
1、线性表的顺序存储
线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素,使得线性表在逻辑结构上相邻的元素存储在连续的物理存储单元中,即:通过数据元素物理存储的连续性来反应元素之间逻辑上的相邻关系。采用顺序存储结构存储的线性表通常简称为顺序表。
顺序存储的线性表的特点:
- 线性表的逻辑顺序与物理顺序一致;
- 数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。
2、顺序表的线性存储示意图
假设线性表中有n个元素,每个元素占k个存储单元,第一个元素的地址为Loc(a1),则第i个元素的地址Loc(ai):
Loc(ai) = Loc(a1) + (i-1) * k; 其中Loc(a1)称为基地址。
第二步,结果图显示。
第三步,代码展示。(很详细的注释,有C++基础的人都能看懂。)
1、SeqList.h数据结构的定义和基本操作函数声明
#pragma once
#pragma once
#define ListSize 100//线性表的最大长度
typedef int DataType;
typedef struct
{
DataType data[ListSize];//用数组存储线性表中的元素
DataType length;//顺序表的长度
}SeqList, *PSeqList;//使用SeqList定义数据表类型变量,使用*PSeqList定义数据表指针变量
void InitList(PSeqList L);//顺序表的初始化操作
int LengthList(PSeqList L);//求顺序表的长度
int GetData(PSeqList L, int i);//返回数据表中第i个元素的值
int InsList(PSeqList L, int i, DataType e);//在顺序表的第i个位置插入元素
int DelList(PSeqList L, DataType i, DataType* e);//删除顺序表L的第i个数据元素
int Locate(PSeqList L, DataType e);//查找数据元素e在表中的位置
void PushFront(PSeqList L, DataType e);//头插,在表头插入元素e
void PopFront(PSeqList L);//头删,删除表中的第一个元素
void PushBack(PSeqList L, DataType e);//尾插,在表尾插入元素e
void PopBack(PSeqList L);//尾删,删除表尾元素
void ClearList(PSeqList L);//清空顺序表
int EmptyList(PSeqList L);//判断顺序表是否为空
void PrintList(PSeqList L);//打印表中元素
2、SeqList.c 函数的具体实现
#include <iostream>
#include "SeqList.h"
using namespace std;
//(1)顺序表的初始化操作
void InitList(PSeqList L)
{
if (L == NULL)
{
return;
}
L->length = 0;
}
//(2)求顺序表的长度
int LengthList(PSeqList L)
{
if (L == NULL)
{
return 0;
}
return L->length;
}
//(3)返回数据表中第i个元素的值
int GetData(PSeqList L, int i)
{
if (i < 1 || i >(LengthList(L)))
{
cout << "Out of the list!!!" << endl;
return 0;
}
return L->data[i - 1];
}
//(4)在顺序表的第i个位置插入元素
int InsList(PSeqList L, int i, DataType e)
{
//判断插入位置是否合法
if (i < 1 || i >(LengthList(L) + 1))
{
cout << "Out of the list!!!" << endl;
return 0;
}
//判断顺序表是否已满
else if (L->length >= ListSize)
{
cout << "Full list!!!" << endl;
return 0;
}
else
{
int k = LengthList(L);
for (; k > i; k--)
{
L->data[k] = L->data[k - 1];
}
L->data[k] = e;
L->length++;
return 1;
}
return 0;
}
//(5)删除顺序表L的第i个数据元素
int DelList(PSeqList L, DataType i, DataType* e)
{
if (L->length < 1)
{
cout << "Blank list!!!" << endl;
return 0;
}
*e = L->data[i - 1];
for (int k = i; k < L->length; k++)
{
L->data[k - 1] = L->data[k];
}
L->length--;
return *e;
}
//(6)查找数据元素e在表中的位置
int Locate(PSeqList L, DataType e)
{
for (int i = 0; i <= L->length; i++)
{
if (L->data[i] == e)
return i + 1;
}
}
//(7)头插,在表头插入元素e
void PushFront(PSeqList L, DataType e)
{
if (L->length == ListSize)
{
cout << "Full list!!!" << endl;
}
//将表中元素依次后移一位
for (int i = L->length; i > 0; i--)
L->data[i] = L->data[i - 1];
L->data[0] = e;
L->length++;
}
//(8)头删,删除表中的第一个元素
void PopFront(PSeqList L)
{
if (EmptyList(L))
{
cout << "Blank list!!!" << endl;
}
for (int i = 0; i < L->length - 1; i++)
L->data[i] = L->data[i + 1];
L->length--;
}
//(9)尾插,在表尾插入元素e
void PushBack(PSeqList L, DataType e)
{
if (L->length == ListSize)
{
cout << "Full list!!!" << endl;
}
L->data[L->length] = e;
L->length++;
}
//(10)尾删,删除表尾元素
void PopBack(PSeqList L)
{
if (EmptyList(L))
{
cout << "Blank list!!!" << endl;
}
L->length--;
}
//(11)清空顺序表
void ClearList(PSeqList L)
{
L->length = 0;
}
//(12)判断顺序表是否为空
int EmptyList(PSeqList L)
{
if (L->length == 0)
{
return 1;
}
return 0;
}
//(13)打印表中元素
void PrintList(PSeqList L)
{
if (EmptyList(L))
{
cout << "Blank list!!!" << endl;
return;
}
for (int i = 0; i < L->length; i++)
{
printf("%-3d", L->data[i]);
}
printf("\n");
}
3、mian.c函数的简单测试代码
#include<iostream>
#include <Windows.h>
#include "SeqList.h"
using namespace std;
int main()
{
SeqList L;
DataType data;
//初始化顺序表
InitList(&L);
//在表中插入元素
cout << "1、依次在表中插入元素(1,2,3,4,5):" << endl;
InsList(&L, 1, 1);
InsList(&L, 2, 2);
InsList(&L, 3, 3);
InsList(&L, 4, 4);
InsList(&L, 5, 5);
//打印表中元素
cout << "---->>现表中元素有:";
PrintList(&L);
//头插
cout << "2、在表头依次插入元素,6,7:" << endl;
PushFront(&L, 6);
PushFront(&L, 7);
cout << "---->>现表中元素有:";
PrintList(&L);
//尾插
cout << "3、在表尾依次插入元素,8, 9:" << endl;
PushBack(&L, 8);
PushBack(&L, 9);
cout << "---->>现表中元素有:";
PrintList(&L);
//头删
cout << "4、头删一个元素:" << endl;
PopFront(&L);
cout << "---->>现表中元素有:";
PrintList(&L);
//尾删
cout << "5、删一个元素:" << endl;
PopBack(&L);
cout << "---->>现表中元素有:";
PrintList(&L);
//输出表中第4个元素值
cout << "6、表中第4个元素值为:" << GetData(&L, 4) << endl;
//查找表中第 i个元素的位置
cout << "7、元素2在表中的位置为:" << Locate(&L, 2) << endl;
//删除表中第2个元素对应的值
cout << "8、删除表中第2个元素:" << DelList(&L, 2, &data) << endl;
cout << "---->>现表中元素有:";
PrintList(&L);
cout << "9、顺序表的长度为:" << LengthList(&L) << endl;
cout << "---->>现表中元素有:";
PrintList(&L);
//printf("删除的元素值为:%d\n", data);
//清空顺序表
cout << "10、清除列表内容:" << endl;
ClearList(&L);
cout << "---->>现表中元素有:";
PrintList(&L);
system("pause");
return 0;
}