数据结构线性表 -顺序表练习Demo(稍作修改即为各种管理系统)
话不多说,直接上代码。
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef struct{
float p;
} Elem;
typedef struct{
Elem *elem;
int length;
}Sqlist;
int InitList_Sq(Sqlist &L)
{
float c = 0.0; int i;
L.elem = new Elem[MAXSIZE];
if (!L.elem)
exit(-1);
else
L.length = 0;
cout << "顺序表创建成功!请添加新建数据!按0结束!";
for (i = 0; i < MAXSIZE; i++)
{
if (L.elem[i-1].p == c)
{
break;
}
else
cin >> L.elem[i].p;
}
L.length = i-1;
return 1;
}
int DestoryList(Sqlist &L){
if (L.elem)
{
delete L.elem;
L.length = 0;
return 1;
}
else
return 0;
}
void ClearList(Sqlist &L){
L.length = 0;
}
int GetLength(Sqlist &L){
return L.length;
}
int IsEmpty(Sqlist &L){
if (L.length == 0)
{
return 1;
}
return 0;
}
int GetElem(Sqlist &L, int i, Elem e){
if (i<1 || i>L.length)
return 0;
else
e = L.elem[i - 1];
return 1;
}
void PrintList(Sqlist &L){
if (L.length == 0)
{
cout << "此顺序表不存在或无数据元素!";
exit(-2);
}
else
{
for (int i = 0; i < L.length; i++)
{
float e = L.elem[i].p;
cout << e;
}
}
}
int InsertList(Sqlist &L, int k, float a)
{
if (k<1 || k>L.length)
return 0;
else if (L.length == 0)
return 0;
else
for (int i = L.length; i > k; i--)
{
L.elem[i].p = L.elem[i - 1].p;
L.elem[k - 1].p = a;
}
L.length = L.length + 1;
return 1;
}
int DeleteList(Sqlist &L, float k)
{
if (k<1 || k>L.length-1)
return 0;
if (L.length == 0)
return 0;
for (int i = k; i < L.length; i++)
{
L.elem[i - 1].p = L.elem[i].p;
}
--L.length;
return 1;
}
int SearchList(Sqlist &L, int k)
{
if (k<1 || k>L.length - 1)
return 0;
else if (L.length == 0)
return 0;
else return k - 1;
}
void AddList(Sqlist &L)
{
float a = 1;
int i = L.length;
cout << "请输入数据,按0结束!";
while (a)
{
cin >> a;
L.elem[i].p = a;
++i;
if (a != 0)
{
L.length++;
}
}
cout << "添加成功!";
}
void Contents()
{
cout << "***************************************\n";
cout << "* 顺 序 表 练 习 *\n";
cout << "* *\n";
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 << "***************************************\n";
}
void main(){
Sqlist L;
Elem e;
int flag,a,n,k,b;
flag = 1;
while (flag)
{
system("cls");
Contents();
cin >> a;
switch (a)
{
case 1: if (InitList_Sq(L)){ cout << "数据录取完毕!"; system("PAUSE"); break; }
else{ cout << "失败!"; break; }
case 2: PrintList(L); system("PAUSE"); break;
case 3: exit(-1);
case 4: if (DestoryList(L)){ cout << "顺序表销毁成功!"; }else{cout << "书序表不存在,销毁失败!";} system("PAUSE"); break;
case 5: cout << GetLength(L); system("PAUSE"); break;
case 6: cout << "查找第几个位置上的数据?"; cin >> n; cout << L.elem[n - 1].p; system("PAUSE"); break;
case 7: ClearList(L); cout << "成功将顺序表置空!"; system("PAUSE"); break;
case 8: cout << "输入插入的数据的位置:"; cin >> k; cout << "\n"; cout << "请输入要插入的数据:"; cin >> b;
if (InsertList(L, k, b)){ cout << "插入成功!"; }else {cout<<"插入失败";}system("PAUSE"); break;
case 9: cout << "输入要删除第几个数据:"; cin >> k; if (DeleteList(L, k)){ cout << "删除成功!"; }
else { cout << "删除失败"; }system("PAUSE"); break;
case 10: cout << "输入你要第几个数据:"; cin >> k; if (SearchList(L, k)) { cout << "查找成功!" << L.elem[SearchList(L, k)].p; }
else { cout << "查找失败"; }system("PAUSE"); break;
case 11: AddList(L); system("PAUSE"); break;
default: printf("输入错误!请重新输入"); system("PAUSE"); break;
}
}
}
顺序表的话必须有两个自定义的抽象函数类型。 连续存储,用物理存储的位置来描述数据的逻位置关系(有唯一前趋和后继(除第一个和最后一个元素以外))。 存取元素方法:随机存取。 时间复杂度(查找、插入、删除):O(n) 空间复杂度:S(n)= O(1)
优点: 存取密度大 可以随机存取表中任意一个元素 缺点: 插入删除需要移动大量元素 浪费存储空间 不能自由分配存储空间
顺序表的Demo分享到这,不太会的同学可以留言问我,大家一同学习
。
|