1.线性表
1.1相关说明
(1)线性表是一种简单数据结构,主要操作特点是可以在任意位置插入和删除一个数据元素。
(2)可以用顺序、链式两种方式存储。
1.2相关操作
顺序表操作实现
(1)初始化ListInitiate(L)
SqList *ListInitate(SqList *L) {
//申请分配内存空间
L = (SqList*)malloc(sizeof(SqList));
if (L != nullptr)
{
//设置顺序表的长度为0,表示为空的顺序表
L->length = 0;
cout << "内存分配成功" << endl;
}
return L;
}
(2)顺序表插入Insert_Sqlist
int Insert_Sqlist(SqList *L,DataType x,int i) {
int j = 0;
//检查顺序表是否已满
if (L->length >= MAXSIZE-1)
{
cout << "顺序表已满,不能插入!!!" << endl;
return 0;
}
if (i<1 || i>L->length + 2)
{
cout << "不能在此处插入" << endl;
}
for (j = L->length; j >= i - 1; j--)
{
L->dataType[j + 1] = L->dataType[j];
L->dataType[i - 1] = x;
L->length = L->length + 1;
return 1;
}
cout << "插入元素成功!" << endl;
return 1;
}
(3)顺序表长度
//顺序表的长度
int Sqlist_Length(SqList *L)
{
cout << "该顺序表的长度是:" << L->length << endl;
return (L->length);
}
…
其他操作如下:
int Delete_Sqlist(SqList *&L, int i)
{
int j;
//检查位置有效性
if (i<1 || i>L->length + 1)
{
cout << "删除位置无效!" << endl;
}
else
{
//往前移动结点
for (j = i; j <= L->length; j++)
L->dataType[j - 1] = L->dataType[j]; //将结点j赋值给j-1;
L->length--; //整个表要减一
cout << "删除成功!" << endl;
}
return 1;
}
int Print_Sqlist(SqList *L) //遍历顺序表
{
int i;
if (L->length == -1)
{
cout << "顺序表为空!" << endl;
}
for (i = 0; i <= L->length - 1; i++)
{
cout << L->dataType[i] << endl;
if ((i + 1) % 5 == 0) //每行输出为5个元素
cout << endl;
}
return 1;
}
int Search_Sqlist(SqList *L, DataType key) //查找key
{
int i;
for (i = 0; i <= L->length; i++)
{
if (L->dataType[i] == key)
{
cout << key << "在第" << i + 1 << "位" << endl;
}
else
{
cout << "查找失败!!!" << endl;
return 0;
}
return 1;
}
}
完整代码:
#pragma once
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXSIZE 100
#define OVERFLOW -2
#define ERROR -1
typedef int DataType;
typedef int Status;
//定义一个SqList的结构体
typedef struct {
//存储空间的基地址
DataType dataType[MAXSIZE];
//长度
int length;
}SqList;
SqList *ListInitate(SqList *L) {
//申请分配内存空间
L = (SqList*)malloc(sizeof(SqList));
if (L != nullptr)
{
//设置顺序表的长度为0,表示为空的顺序表
L->length = 0;
cout << "内存分配成功" << endl;
}
return L;
}
//顺序表的长度
int Sqlist_Length(SqList *L)
{
cout << "该顺序表的长度是:" << L->length << endl;
return (L->length);
}
int Insert_Sqlist(SqList *L,DataType x,int i) {
int j = 0;
//检查顺序表是否已满
if (L->length >= MAXSIZE-1)
{
cout << "顺序表已满,不能插入!!!" << endl;
return 0;
}
if (i<1 || i>L->length + 2)
{
cout << "不能在此处插入" << endl;
}
for (j = L->length; j >= i - 1; j--)
{
L->dataType[j + 1] = L->dataType[j];
L->dataType[i - 1] = x;
L->length = L->length + 1;
return 1;
}
cout << "插入元素成功!" << endl;
return 1;
}
int Delete_Sqlist(SqList *&L, int i)
{
int j;
//检查位置有效性
if (i<1 || i>L->length + 1)
{
cout << "删除位置无效!" << endl;
}
else
{
//往前移动结点
for (j = i; j <= L->length; j++)
L->dataType[j - 1] = L->dataType[j]; //将结点j赋值给j-1;
L->length--; //整个表要减一
cout << "删除成功!" << endl;
}
return 1;
}
int Print_Sqlist(SqList *L) //遍历顺序表
{
int i;
if (L->length == -1)
{
cout << "顺序表为空!" << endl;
}
for (i = 0; i <= L->length - 1; i++)
{
cout << L->dataType[i] << endl;
if ((i + 1) % 5 == 0) //每行输出为5个元素
cout << endl;
}
return 1;
}
int Search_Sqlist(SqList *L, DataType key) //查找key
{
int i;
for (i = 0; i <= L->length; i++)
{
if (L->dataType[i] == key)
{
cout << key << "在第" << i + 1 << "位" << endl;
}
else
{
cout << "查找失败!!!" << endl;
return 0;
}
return 1;
}
}
调用
#include "SeqList.h"
int main()
{
static SqList *L;
L = ListInitate();
Insert_Sqlist(L,10,1);
Insert_Sqlist(L, 9, 2);
Insert_Sqlist(L, 8, 3);
Insert_Sqlist(L, 7, 4);
Print_Sqlist(L);
int length1 = Sqlist_Length(L);
cout << "该顺序表的长度是:" << length1 << endl;
Search_Sqlist(L, 8);
Delete_Sqlist(L,2);
Print_Sqlist(L);
int length2 = Sqlist_Length(L);
cout << "该顺序表的长度是:" << length2 << endl;
getchar();
return 0;
}
输出:
分配内存空间成功!
插入元素成功!
插入元素成功!
插入元素成功!
插入元素成功!
10
9
8
7
该顺序表的长度是:4
8在第3位
删除成功!
10
8
7
该顺序表的长度是:3