数据结构实验一 顺序表


//数据结构学什么?是解决非数值型数据计算问题的,那要建模,建什么模?ADT:1是对象建模,一般需要写结构体,处理元素是原子类型的就无需定义建模;2是关系建模,数据元素间的关系要么1对1,1对多,多对多,概括这些模型名曰:线性表,栈,队列等,就是2-6章的标题;3是操作建模,就是对象及关系上的函数。从实验一到实验十二都是这样来写代码的,心中要有这三个建模,按顺序写,心有所想来写,不要操课本代码,当然不会时可以参考。

#include <iostream>
#include "stdio.h"
#include "stdlib.h"
using namespace std;

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量
typedef int Status;
//00定义两个数据元素为int 原子类型,数据结构含两个域的结构体变量表示。
//定义数据元素
typedef int ElemType;
//定义数据结构
typedef struct {
ElemType *elem; // 存储空间基址,指针,故初始化需开辟空间new一个数组
int length; // 当前表的长度
}SqList;

//01初始化一个线性表
Status InitSqList(SqList &L);
//02创建一个包含n个正整数值的线性表(线性表的长度n和表中元素的值随机输入)
Status CreateSqList(SqList &L);
//03将一个数x插在第i个元素前
Status SqListInsert(SqList &L, int i, ElemType x);
//04删除第i个元素,并在删除结束后输出删除元素的值
Status SqListDelete(SqList &L, int i);
//05查找指定元素e是否在线性表中存在,若存在返回此元素的位序,否则返回0
int LocateElem(SqList L, ElemType e);
//06查找指定位置元素的值并输出
Status Getelem(SqList L, int i, ElemType &e);
//07输出线性表中所有元素
Status TraverseSqList(SqList L);
//08 合并两个顺序表,将LB合并到LA中(重复元素不合并进去)
Status SqList_Merge(SqList &LA, SqList LB);

int main()
{
ElemType e, x;
int i, k;
SqList L;
do {
cout << "\n=========顺序表的操作===========";
cout << "\n 1.初始化顺序表";
cout << "\n 2.创建顺序表";
cout << "\n 3.在第i个位置前插入元素x";
cout << "\n 4.删除元素";
cout << "\n 5.查找指定元素位置";
cout << "\n 6.查找指定位置元素";
cout << "\n 7.遍历当前顺序表";
cout << "\n 8.顺序表合并";
cout << "\n 0.结束程序运行";
cout << "\n================================";
cout << "\n 请输入您的选择(1,2,3,4,5,6,7,0)";
cin >> k;
switch (k)
{
case 1:
if (InitSqList(L))
cout << "初始化成功!";
else
cout << "初始化失败!";
break;
case 2:
if (CreateSqList(L))
cout << "创建成功!";
else
cout << "创建失败!";
break;
case 3:
cout << "请输入插入元素的位置i及值x:";
cin >> i >> x;
if (SqListInsert(L, i, x))
cout << "插入成功!";
else
cout << "插入失败!";
//TraverseSqList(L);
break;
case 4:
cout << "请输入要删除元素的位置i:";
cin >> i;
SqListDelete(L, i);
//TraverseSqList(L);
break;
case 5:
cout << "请输入要查找指定元素e:";
cin >> e;
cout << "该元素的位置是:" << LocateElem(L, e) << endl;
break;
case 6:
cout << "请输入要查找元素的位置:";
cin >> i;
Getelem(L, i, e);
cout << "第" << i << "个元素值是:" << e << endl;
break;
case 7:
cout << "当前线性表中的元素为:";
TraverseSqList(L);
break;
case 8:
SqList LA, LB;
InitSqList(LA);
InitSqList(LB);
cout << "请创建顺序表LA:";
CreateSqList(LA);
cout << "请创建顺序表LB:";
CreateSqList(LB);
cout << "LB合并到LA中(重复元素不合并进去):";
SqList_Merge(LA,LB);
TraverseSqList(LA);
break;
case 0:
break;
default:
cout << "无效选项,请重新输入!" << endl;
}/*switch*/
} while (k != 0);
system("pause");
return 0;
}/*main*/
//01初始化一个线性表L
Status InitSqList(SqList &L)
{
L.elem = new ElemType[LIST_INIT_SIZE];
if (!L.elem) exit(OVERFLOW); //储存空间分配失败
L.length = 0; //将线性表的表长置为0
return OK;
}
//02创建一个包含n个正整数值的线性表(线性表的长度n和表中元素的值随机输入)
Status CreateSqList(SqList &L)
{
if (!L.elem)InitSqList(L); //线性表不存在则初始化一个线性表
cout << "请输入线性表的长度n:";
int len;
cin >> len;
cout << "请输入 " << len << " 个正整数:";
int data, i;
for (i = 0; i < len; i++)
{
cin >> data;
L.elem[i] = data;
}
L.length = i;
return OK;
}
//03将一个数x插在第i个元素前
Status SqListInsert(SqList &L, int i, ElemType x)
{
if (!L.elem || L.length == LIST_INIT_SIZE)
{
cout << "表不存在或当前存储已满";
return ERROR; //表不存在或当前存储已满
}
if ((i<1) || (i>L.length + 1))
{
cout << "i值不合法,请输入1……" << L.length + 1 << "之间的整数";
return ERROR;
} //i值不合法,其中+1表示可以在表尾插入一个数据
for (int j = L.length - 1; j >= i - 1; j--) //将i及其后的值后移
{
L.elem[j + 1] = L.elem[j];
}
L.elem[i - 1] = x;
++L.length;
return OK;
}
//04删除第i个元素,并在删除结束后输出删除元素的值
Status SqListDelete(SqList &L, int i)
{
if (!L.elem)
{
cout << "表不存在!";
return ERROR; //表不存在
}
if ((i<1) || (i>L.length))
{
cout << "i值不合法,请输入1……" << L.length << "之间的整数";
return ERROR;
} //i值不合法
ElemType x = L.elem[i - 1];
for (int j = i; j <= L.length; j++)
L.elem[j - 1] = L.elem[j]; //被删除元素之后的元素前移
--L.length;
cout << "删除第" << i << "个元素的值为:" << x << endl;
return OK;
}
//05查找指定元素e是否在线性表中存在,若存在返回此元素的位序,否则返回0
int LocateElem(SqList L, ElemType e)
{
if (!L.elem)
{
cout << "表不存在!";
return ERROR; //表不存在
}
for (int i = 0; i < L.length; i++)
if (L.elem[i] == e) return i + 1;//是一条语句;不能写成if(L.elem[i]==e)return i+1;else return 0; LA1 2 3 LB1 2 3,后面2去和LA第一个1比较不等,else 0,意思2不在LA,就错了.return 0需在for循环外
return 0;
}
//06查找指定位置元素的值并输出
Status Getelem(SqList L, int i, ElemType &e)
{
if ((i<1) || (i>L.length))
{
cout << "i值不合法,请输入1……" << L.length << "之间的整数";
return ERROR;
}
e = L.elem[i - 1];
return OK;
}
//07遍历线性表中所有元素(数组下标遍历法)
Status TraverseSqList(SqList L)
{
if (!L.elem)
{
cout << "表不存在!";
return ERROR; //表不存在
}
for (int i = 0; i < L.length; i++)
cout << L.elem[i] << " ";
cout << endl;
return OK;
}
数组指针遍历法,仅供参考
LNode *pa=L.elem;//数组指针,不要用L.elem++,这样L就不是原来的顺序表了,因为L.elem值++后变了。
while(pa<pa+L.length)
{
    cout<<*pa<<" ";
    pa++;//指向下一个数据元素
}
//08 合并两个顺序表,将LB合并到LA中,学完要习,后面排序要用,还是要理顺逻辑,写出代码。
Status SqList_Merge(SqList &LA, SqList LB)//LA是一个结构体变量,里面的长度域变,则LA变,故加&。
{
int m, n;//m-->LA.lenght;n--->LB.lenght
ElemType e;
m = LA.length;
n = LB.length;
for (int i = 1; i <= n; i++)
{
Getelem(LB, i, e);
if (!LocateElem(LA, e))
SqListInsert(LA, ++m, e);//m是站在数据结构的角度(下标1开始)去看,新元素应插入LA的m+1的位置。
}
return OK;
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM