[success]数据结构上课上的挺迷的,所以打算自己把算法都用c++写一遍,这样可以方便以后查找,今天搞了一上午才写出第一个算法。。。[/success]
顺序表其实很简单,就是一个数组,只是把这个数组放到结构体里了,主要的几个函数也很简单,包括查找,插入,删除。
一些细节部分都会在代码里面说明,所以直接贴代码了:
#include "pch.h"
#include <iostream>
//c++实现顺序表
#define MAXSIZE 100
#define OK 1
#define ERROR 0
using namespace std;
typedef struct
{
int *data;
int length;
}spList;
//初始化顺序表
int InitList(spList &L) //这里&是引用,就是这L和传入的是同一个东西,如果不加的话,就相当于拷贝一个副本
{ //这里传的是*L也就是那个新创建结构体(因为返回的是地址,所以需要用到指针保存数据,*L就相当于结构体变量)
L.data = new int[MAXSIZE];//新建一个int类型的数组
if (!L.data) return ERROR;//如果数组创建失败返回错误
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;//先给几个初始值
L.length = 3;
return OK;
}
//获取顺序表的取值
int GetElem(spList L, int i,int &e)
{
if (i<0 || i>L.length) return ERROR;
e = L.data[i - 1];
return OK;
}
//顺序表的查找
int LocatElem(spList L,int a)
{
for (int i = 0; i < L.length; i++)
if (a == L.data[i]) return i + 1;
return 0;
}
//顺序表的插入
int ListInsert(spList &L, int i,int e)
{
if (i<1 || i>L.length + 1) return ERROR;//这里i是从1开始的,我们只能插入1-L.length
if (L.length == MAXSIZE) return ERROR;//存储空间已满
for (int j = L.length - 1; j >=i-1; j--)//这里我们顺序表从0开始,所以也就是说把 i-1到总长度-1的这一段数据集体往后移
L.data[j + 1] = L.data[j];//移动数据
L.data[i-1] = e;
++L.length;
return ERROR;
}
//打印顺序表
void PrintList(spList L)
{
for (int i=0; i < L.length; i++)
cout << L.data[i] << " ";
cout << endl;
}
//删除顺序表
int ListDelete(spList &L, int i)
{
if (i<0 || i>L.length) return ERROR;
for (int j = i; j <= L.length - 1; j++)//删除就是把第i个元素去掉,然后把后面的元素集体往前面移
L.data[j - 1] = L.data[j];
--L.length;
return OK;
}
int main()
{
spList *L = new spList;//新建一个结构体指针,指向这个结构体
//这里*L存的指针引用所对应的值(比如*a指向一个变量b=5,那么*a就是这个变量的值5,a就是这个变量的地址,&a是a指针的地址)
if (!InitList(*L)) return ERROR;
int a;
GetElem(*L, 1, a);
cout << "第一号元素为:" << a<<endl;
a=LocatElem(*L, 2);
cout << "2所在的位置为:" << a<<endl;
ListInsert(*L, 2, 5);
PrintList(*L);
ListDelete(*L, 2);
PrintList(*L);
}