(一)顺序表
这一章是线性表中顺序表的实现和代码分析。
顺序表的数据结构:
#define MaxSize 50
#define InitSize 100
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
有以下主要的功能函数:
- bool CreateList(SqList &L, int n) 创建顺序表;参数 L:顺序表,n:顺序表长度;功能:创建长度为n的顺序表;时间复杂度O(n)。
- bool InsertElem(SqList& L, int i, ElemType e) 插入;参数 L:顺序表,i:插入位置(不是下标),e:插入的元素; 功能:在顺序表位置i插入一个元素e;时间复杂度O(n)。
- bool DeleteElem(SqList& L, int i) 删除;参数 L:顺序表,i:要删除的位置;功能:删除顺序表位置i的元素;时间复杂度O(n)。
- int LocateElem(SqList& L, ElemType e) 查找;参数 L:顺序表,e:要查找的元素;功能:查找元素e第一次出现的位置并返回;时间复杂度O(n)。
- bool ReviseElem(SqList& L, int n, ElemType e) 修改;参数 L:顺序表,n:要修改的元素的位置,e:要改成的元素;功能:将n位置的元素修改为e;时间复杂度O(1)。
- void PrintList(SqList& L) 打印表;参数 L:顺序表;功能:输出顺序表的所有元素;时间复杂度O(n)。
以下是完整代码:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#define ElemType int
#define MaxSize 50
#define InitSize 100
typedef struct {
ElemType data[MaxSize];
int length;
}SqList;
void InitList(SqList &L) {
memset(L.data, 0, sizeof(L));
L.length = 0;
}
bool CreateList(SqList& L, int n) {
InitList(L);
if (n<0 || n>MaxSize)
return false;
for (int i = 0; i < n; i++) {
scanf("%d", &L.data[i]);
L.length++;
}
return true;
}
bool InsertElem(SqList& L, int i, ElemType e) {
if (i < 1 || i > L.length + 1)
return false;
if (L.length >= MaxSize)
return false;
for (int j = L.length; j >= i; j--)
L.data[j] = L.data[j - 1];
L.data[i - 1] = e;
L.length++;
return true;
}
bool DeleteElem(SqList& L, int i) {
if (i<1 || i>L.length)
return false;
for (int j = i; j <= L.length - 1; j++)
L.data[j - 1] = L.data[j];
L.length--;
return true;
}
int LocateElem(SqList& L, ElemType e) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == e)
return i + 1;
}
return -1;
}
bool ReviseElem(SqList& L, int n, ElemType e) {
if (n<1 || n>L.length)
return false;
L.data[n - 1] = e;
return true;
}
void PrintList(SqList& L) {
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
}
void Create(SqList &L) {
int n;
printf("输入表长n(n<=50):");
scanf("%d", &n);
printf("输入数据:\n");
CreateList(L, n);
}
void Insert(SqList& L) {
int n,e;
while (true)
{
printf("输入要插入的位置:");
scanf("%d", &n);
if (n >= 1 && n <= L.length+1)
break;
printf("输入的位置有误,重新输入!\n");
}
printf("输入要插入的元素:");
scanf("%d", &e);
InsertElem(L, n, e);
printf("插入“%d”到位置“%d”!", e, n);
}
void Revise(SqList& L) {
int n, e;
while (true)
{
printf("输入要被修改的元素的位置:");
scanf("%d", &n);
if (n>=1 && n<=L.length)
break;
printf("输入的位置有误,重新输入!\n");
}
printf("修改为:");
scanf("%d", &e);
ReviseElem(L, n, e);
printf("修改成功!");
}
void Delete(SqList& L) {
int n;
while (true)
{
printf("输入要删除的元素的位置:");
scanf("%d", &n);
if (DeleteElem(L, n)) {
printf("删除成功!\n");
break;
}
printf("输入的位置有误,重新输入!\n");
}
}
void Search(SqList& L) {
int e;
printf("输入要查找的元素:");
scanf("%d", &e);
int n = LocateElem(L, e);
if (n == -1)
printf("未找到“%d”\n", e);
else
printf("“%d”的位置在%d\n", e, n);
}
void menu() {
printf("\n\n");
printf("--------①创建表--------\n");
printf("--------②插入--------\n");
printf("--------③修改--------\n");
printf("--------④删除--------\n");
printf("--------⑤查找--------\n");
printf("--------⑥打印表--------\n");
printf("按“0”退出\n");
printf("\n\n");
}
int main() {
SqList L;
int choice;
while (true) {
menu();
scanf("%d", &choice);
switch (choice)
{
case(1):
Create(L);
break;
case(2):
Insert(L);
break;
case(3):
Revise(L);
break;
case(4):
Delete(L);
break;
case(5):
Search(L);
break;
case(6):
PrintList(L);
break;
case(0):
exit(0);
default:
break;
}
}
return 0;
}
|