// 数据结构实验2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include<iostream>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef int Status;
typedef int ElemType;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct
{
ElemType* elem;
int length;
int listsize;
}SqList;
Status InitList(SqList& L)
{
L.elem = (ElemType * )malloc(LIST_INIT_SIZE * sizeof(ElemType));
if (!L.elem)exit(-1);
L.length = 0;
L.listsize = LIST_INIT_SIZE;
return true;
}
Status DestroyList(SqList& L)
{
if (L.elem == NULL)
{
cout << "线性表不存在!" << '\n';
return false;
}
free(L.elem);
L.elem = NULL;
return true;
}
Status ClearList(SqList& L)
{
if (!L.elem)
{
cout << "线性表不存在!" << '\n';
return false;
}
L.length = 0;
return true;
}
int ListEmpty(SqList L)
{
if (!L.elem)
{
cout<<"线性表不存在!"<<'\n';
return -1;
}
if (L.length == 0)
return true;
else
return false;
}
//5
int ListLength(SqList L)
{
if (!L.elem)
{
cout << "线性表不存在!" << '\n';
return -1;
}
return L.length;
}
//6
int GetElem(SqList& L, int i, int& e)
{
if (i <= L.length)//利用指针直接保存第i个元素的值
{
e = L.elem[i - 1];
return true;
}
else
return false;
}
//7
int LocateElem(SqList L, int e) //在线性表中找到元素e在登记号位置上
{
int i;
for (i = 0; i < L.length; i++)
{
if (L.elem[i] == e) //遍历数组,若找到,返回具体位置
{
return i + 1;
}
}
return 0;//若未找到,返回0
}
//8
int Prioelem(SqList& L, int cur_e, int& pre_e)
{
int i;
for (i = 0; i < L.length; i++)
{
if (L.elem[i] == cur_e)
{
break;
}
}
if (i == 0)
{
cout << "第一个元素无前驱" << '\n';
}
else if (i < L.length && i>=1)
{
pre_e = L.elem[i - 1];
return true;
}
else
cout<<"无该元素"<<'\n';
}
//9
int Nextelem(SqList& L, int cur_e, int& next_e)
{
int i;
for (i = 0; i < L.length; i++)
{
if (L.elem[i] == cur_e)
{
break;
}
}
if (i == L.length-1)
{
cout << "最后一个元素无后继" << '\n';
}
else if (i < L.length - 1 && i >= 0)//则不需要考虑i小于零的情况
{
next_e = L.elem[i + 1];
return true;
}
else
cout<<"无该元素"<<'\n';
}
//10
Status ListInsert(SqList& L, int i, ElemType e)
{
ElemType* p, * q, * newelem;
if (L.length >= L.listsize)
{
newelem = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));
if (!newelem)
exit(-1);
L.elem = newelem;
L.listsize += LISTINCREMENT;
}
q = L.elem + i - 1;
for (p = L.elem + L.length - 1; p >= q; p--)
*(p + 1) = *p;
*q = e;
L.length++;
return true;
}
//11
int Listdelete(SqList& L, int i, int& e)//e为了保存删除的元素
{
int* p, * q;
p = &L.elem[i - 1];
e = L.elem[i - 1];
for (q = (&L.elem[L.length - 1]); q >= p; p++)
*p = *(p + 1);
L.length--;
return true;
}
//12
Status ListTraverse(SqList L)
{
ElemType* p;
cout<<"该线性表中数据元素如下:";
for (p = L.elem; p <= L.elem + L.length - 1; p++)
cout<<*p<<'\n';
return true;
}
//13
int Mergelist(SqList& L_a, SqList& L_b, SqList& L_c)
{
int* pa = L_a.elem;
int* pb = L_b.elem;
L_c.listsize = L_a.length + L_b.length;
L_c.length = L_c.listsize;
int* pc = L_c.elem = (int*)malloc(L_c.listsize * sizeof(int));
if (!L_c.elem)
{
printf("分配失败!");
exit(OVERFLOW);
}
int* pa_last = L_a.elem + L_a.length - 1;
int* pb_last = L_b.elem + L_b.length - 1;
while (pa <= pa_last && pb <= pb_last)
{
if (*pa < *pb)
*pc++ = *pa++;
else
*pc++ = *pb++;
}
while (pa <= pa_last) *pc++ = *pa++;
while (pb <= pb_last) *pc++ = *pb++;
return true;
}
int main()
{
int flag = 0;
SqList List,Lb,Lc;
List.elem = NULL;
while (1)
{
system("cls");//清屏
cout << "1.初始化一个线性表"<<'\n';
cout << "2.销毁线性表" << '\n';
cout << "3.清空线性表" << '\n';
cout << "4.判断线性表是否为空" << '\n';
cout << "5.求线性表长度" << '\n';
cout << "6.获取线性表中指定位置的元素" << '\n';
cout << "7.获取线性表元素的位置" << '\n';
cout << "8.求前驱" << '\n';
cout << "9.求后继" << '\n';
cout << "10.在线性表指定位置插入元素" << '\n';
cout << "11.删除线性表指定位置元素" << '\n';
cout << "12.显示线性表" << '\n';
cout << "13.合并两个非递减有序的线性表" << '\n';
cout << "输入-1退出程序。" << '\n';
int select;
cout<<"请输入你的选择:"<<'\n';
cin >> select;
switch (select)
{
case 1:
flag = InitList(List);
if (flag == 1)
cout<<"初始化成功!"<<'\n';
flag = 0;
break;
case 2:
flag = DestroyList(List);
if (flag == 1)
cout<<"顺序表销毁成功!"<<'\n';
flag = 0;
break;
case 3:
flag = ClearList(List);
if (flag == 1)
cout<<"顺序表清空成功!"<<'\n';
flag = 0;
break;
case 4:
flag=ListEmpty(List);
if (flag == 1)
cout << "该线性表为空表" << '\n';
else if(flag==0)
cout << "该线性表不为空表" << '\n';
flag = 0;
break;
case 5:
cout<<"该顺序表的长度是;"<<ListLength(List)<<'\n';
break;
case 6:
if (List.elem)
{
cout<<"请输入元素的指定位置:"<<'\n';
int i; int sen_x;
cin >> i;
flag = GetElem(List, i, sen_x);
if (flag == 1)
cout<<"元素的值是;"<< sen_x<<'\n';
else
cout<<"输入不合法!";
flag = 0;
}
else
cout<<"顺序表不存在!"<<'/n';
break;
case 7:
if (List.elem) {
cout << "请输入要查找的元素:" << '\n';
int i;
cin >> i;
flag = LocateElem( List, i);
if (flag == 0) {
cout << "无该元素" << '\n';
}
else
cout << "该元素的位置是:" <<flag<< '\n';
flag = 0;
}
break;
case 8://当前:current 之前的:previous
if (List.elem)
{
int cur_e; int pre_e1;
cout<<"请输入该元素:"<<'\n';
cin>>cur_e;
flag = Prioelem(List, cur_e, pre_e1);
if (flag == 1)
cout<<"得到的前驱是:" <<pre_e1;
flag = 0;
}
else
cout<<"顺序表不存在!"<<'\n';
break;
case 9:
if (List.elem)
{
int cur_e;
int next_e1;
cout<<"请输入该元素:"<<'\n';
cin>>cur_e;
flag = Nextelem(List, cur_e, next_e1);
if (flag == 1)
cout<<"得到的后继是:"<<next_e1;
flag = 0;
}
else
cout << "顺序表不存在!" << '\n';
break;
case 10:
cout << "插入位置输入-1,结束插入循环" << '\n';
while (true) {
if (List.elem)
{
int ten_x;
int i;
cout << "请输入插入位置:" << '\n';
cin >> i;
if (i == -1)break;
while (i<1 || i>List.length + 1)
{
cout << "输入不合法,请重新输入;" << '\n';
cin >> i;
}
cout << "请输入要插入的元素:" << '\n';
cin >> ten_x;
flag = ListInsert(List, i, ten_x);
if (flag == 1)
cout<<"插入元素成功!"<<'\n';
flag = 0;
}
else
cout << "顺序表不存在!" << '\n';
}
break;
case 11:
if (List.elem)
{
int i;
int el_x;
cout<<"请输入删除位置:"<<'\n';
cin>>i;
while (i<1 || i>List.length)
{
cout<<"输入不合法,请重新输入:"<<'\n';
cin>>i;
}
flag = Listdelete(List, i, el_x);
if (flag == 1)
cout<<"删除元素成功!"<<'\n';
flag = 0;
}
else
cout << "顺序表不存在!" << '\n';
break;
case 12:
if (List.elem)
ListTraverse(List);
else
cout << "顺序表不存在!" << '\n';
break;
case 13:
if (List.elem)
{
cout<<"请初始化一个新顺序表Lb:"<<'\n';
flag = InitList(Lb);
if (flag == 1)
cout<<"初始化成功!"<<'\n';
flag = 0;
//插入数据
cout << "插入位置输入-1,结束插入循环" << '\n';
while (true)
{
int ten_x = 0;
int i = 0;
cout << "请输入插入位置:" << '\n';
cin >> i;
if (i == -1)break;
while (i<1 || i>Lb.length + 1)
{
cout << "输入不合法,请重新输入;" << '\n';
cin >> i;
}
cout << "请输入要插入的元素:" << '\n';
cin >> ten_x;
flag = ListInsert(Lb, i, ten_x);
if (flag == 1)
printf("插入元素成功!");
flag = 0;
}
//合并
flag = Mergelist(List, Lb, Lc);
if (flag == 1)
cout<<"合并成功!"<<'\n';
flag = 0;
ListTraverse(Lc);
}
else
cout << "顺序表不存在!" << '\n';
break;
case -1:
cout<<"程序结束!"<<'\n';
exit(-1);
default:
cout<<"没有该选项,请重新选择:"<<'\n';
break;
}
system("pause");//暂停作用
}
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
线性表代码
最新推荐文章于 2023-12-05 09:14:17 发布
本文介绍了如何使用C++实现一个简单的顺序表数据结构,包括初始化、销毁、清空、判断空表、获取元素、定位元素、前驱后继操作、插入和删除元素,以及合并两个非递减有序线性表的功能。通过实例展示了顺序表的基本操作和维护技巧。
摘要由CSDN通过智能技术生成