基于C++的顺序表的使用
头文件的代码展示:
#ifndef header_h
#define header_h
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
#define ok 1
#define error 0
#define overflow -2
#define list_init_size 100
#define listincrement 10
typedef int status; //将status定义为int型的类型,用来表示函数的返回值类型
typedef int elemtype; //将elemtype定义为int型的类型,用来表示顺序表的指针类型
typedef struct { //结构体
elemtype* elem; //指针,用来存放顺序表
int length; //整型变量,用来表示顺序表的长度
int listsize; //整型变量,用来表示顺序表的容量
}sqlist;
status reverse(sqlist& l); //顺序表的倒置
status initlist_sq(sqlist& l);//创建顺序链表
status listinsert_sq(sqlist& l, int i, elemtype e);//顺序表的插入
status listdelete_sq(sqlist& l, int i, elemtype& e);//删除第i个位置的数据
void print(sqlist l);//输出顺序表
status destorylist(sqlist& l);//删除顺序表
status clearlist(sqlist& l);//清空顺序表中的元素
status listempty(sqlist l);//判断顺序表是否为空
status listlength(sqlist l);//返回顺序表的长度
status getelem(sqlist l, int i, elemtype& e); //获得第i个位置的元素
status loateelem(sqlist l, elemtype e);//查找与e元素的位置
void zhuye();//选择页面的输出
#endif
主函数的代码展示:
#include "header.h"
int main()
{
int i, j, n, m;
sqlist la;
int f;
initlist_sq(la);
while (1) {
cout << "请选择你要需要的功能!" << endl;
zhuye();
cin >> f;
system("cls");
switch (f) {
case 1:
printf("请输入la顺序表的长度:");
cin >> m;
printf("输入la顺序表数据:");
for (i = 1; i <= m; i++)
{
cin >> j;
listinsert_sq(la, i, j);
}
cout << "顺序表la:";
print(la);
break;
case 2:
print(la);
break;
case 3:
cout << "输入要插入的元素值:";
cin >> i;
cout << "输入要插入的位置:";
cin >> j;
listinsert_sq(la, j, i);
cout << "输出插入元素后的顺序表la:";
print(la);
break;
case 4:
cout << "输入删除元素的位置:";
cin >> i;
listdelete_sq(la, i, j);
cout << "删除元素的值为" << j;
cout << "\n删除元素后的la:";
print(la);
break;
case 5:
cout << "顺序表的长度:" << listlength(la) << endl;
break;
case 6:
cout << "\n输入查找的元素:";
cin >> i;
if (!loateelem(la, i))
cout << "\n顺序表la中没有查找元素" << i << endl;
else
cout << "\n元素" << i << "在顺序表la中的位置为" << loateelem(la, i) << endl;
break;
case 7:
cout << "\n输入要获取的元素的位置:";
cin >> i;
if (!getelem(la, i, n))
cout << "\n输入位置不合法" << endl;
else
cout << "\n要获取的第" << i << "个元素" << "为" << n << endl;
break;
case 8:
reverse(la);
print(la);
break;
case 9:
if (clearlist(la))
cout << "\n顺序表la已经清空";
cout << "\n顺序表la的长度为" << listlength(la) << endl;;
if (destorylist(la))
cout << "\n顺序表la被销毁" << endl;
return 0;
break;
}
system("pause");
system("cls");
}
return 0;
}
函数功能的代码分析:
#include "header.h"
status initlist_sq(sqlist& l) //创建顺序链表
{
/*********begin1**********/
l.elem = new elemtype[list_init_size];//创建顺序链表
if (!l.elem) exit(overflow); //判断顺序表是否创建成功
l.length = 0; //初始化顺序表长度
l.listsize = list_init_size; //初始化顺序表容量
return ok;
/********end1************/
}
status reverse(sqlist& l) { //顺序表的倒置
/*******************begin1****************/
int* p, * q; //定义两个指针,p用来存放表头,q用来存放表尾
int s; //定义一个整型变量,用来存放临时数据
p = l.elem; //将表头赋给p
q = l.elem + l.length - 1; //将表尾赋给q
while (p <= q) { //判断是否居中,如果已经居中过,则推出循环体
s = *p;
*p = *q;
*q = s;
//将p和q指针的值交换
p++; //将p后移一个单位
q--; //将q前移一个单位
}
return 0;
/*******************end1******************/
}
status listinsert_sq(sqlist& l, int i, elemtype e)//顺序表的插入
{
/*********begin2**********/
elemtype* q, * p, * s; //定义一个整型指针,用来存放顺序表
if (i<1 || i>l.length + 1) return 0; //判断插入的位置是否超出了顺序表的有效数据长度
if (l.length >= list_init_size) { //如果容量已满,则执行以下括号内的步骤
s = (elemtype*)realloc(l.elem, (l.listsize + 10) * sizeof(elemtype));
//创建一个新的顺序表(容量比原来多10),并将原来的数据复制给新的顺序表
if (!s) exit(-2); //判断是否创建成功
l.elem = s; //将原来的顺序表替换为新的顺序表
l.listsize += 10; //将顺序表的容量在原来的基础上加10
}
q = &(l.elem[i - 1]); //将顺序表中第i个位置(即顺序表中的下标为i-1)的地址赋给q
for (p = &(l.elem[l.length - 1]); p >= q; --p)
*(p + 1) = *p;
//将第i个之后的位置后移
*q = e; //将q中的数据替换成e
++l.length; //将长度加一
return 1;
/********end2************/
}
status listdelete_sq(sqlist& l, int i, elemtype& e)//删除第i个位置的数据
{
/*********begin3**********/
if (i<1 || i>l.length) return 0;//判断插入的位置是否超出了顺序表的有效数据长度
elemtype* q, * p; //定义一个整型指针
q = &(l.elem[i - 1]); //将顺序表中第i个位置(即顺序表中的下标为i-1)的地址赋给q
e = *q; //将第i个位置的值给e
p = l.elem + l.length - 1; //将p指针指到顺序表的尾部
for (++q; p >= q; ++q)
*(q - 1) = *q;
//将第i个之后的数据前移
--l.length; //长度减一
return 1;
/********end3************/
}
void print(sqlist l) { //输出顺序表
int i; //定义一个变量,用来表示顺序表的下标
for (i = 0; i < l.length - 1; i++) //从下标为0开始,一直到下标为长度减一
cout << l.elem[i] << ' '; //输出数据,并带上空格
cout << l.elem[i]<<endl; //最后一个不输出空格
}
status destorylist(sqlist& l)//删除顺序表
{
free(l.elem); //删除l.elem指针
return ok;
}
status clearlist(sqlist& l)//清空顺序表中的元素
{
l.length = 0; //直接赋值为0即可
return ok;
}
status listempty(sqlist l)//判断顺序表是否为空
{
if (l.length == 0)
return 1;
else
return 0;
//如果为空,则返回1,否则返回0
}
status listlength(sqlist l) //返回顺序表的长度
{
return l.length;
}
status getelem(sqlist l, int i, elemtype& e) //获得第i个位置的元素
{
/*********begin4**********/
if (i<1 || i>l.length) return 0;//判断插入的位置是否超出了顺序表的有效数据长度
e = l.elem[i - 1]; //将顺序表中第i个位置(即顺序表中的下标为i-1)的元素赋给e
return 1;
/********end4************/
}
status loateelem(sqlist l, elemtype e) //查找与e元素的位置
{
/*********begin5**********/
for (int i = 0; i < l.length; i++)
if (l.elem[i] == e) return i + 1;
return 0;
/********end5************/
}
void zhuye()//选择页面的输出
{
cout << "输入1:在顺序表中添加数据" << endl;
cout << "输入2:查看顺序表的所有元素" << endl;
cout << "输入3:在顺序表中插入数据" << endl;
cout << "输入4:在顺序表中删除数据" << endl;
cout << "输入5:查看顺序表的长度" << endl;
cout << "输入6:通过元素查找顺序表中的数据" << endl;
cout << "输入7:通过位置查看顺序表中的数据" << endl;
cout << "输入8:将顺序表倒置" << endl;
cout << "输入9:退出" << endl;
cout << "请输入:";
}
专心看人间!
浙公网安备 33010602011771号