(3)线性表:顺序表

线性表:
      是一个线性结构,它是一个含有n≥0个结点的有限序列,对于其中的结点,有且仅有一个开始结点没有前驱但有一个后继结点,有且仅有一个终端结点没有后继但有一个前驱结点,其它的结点都有且仅有一个前驱和一个后继结点。

优点:逻辑上相邻的元素在屋里存储位置上也相邻,随机存取,运算简单。

线性表由分为顺序表和链表两类。

顺序表:在内存中用地址连续有限的一块存储空间顺序存放线性表的各个元素。

缺点:插入删除需要大量移动元素,其次是要预先分配存储结构。

顺序表的基本操作:
     1)Init()同第一个,初始化线性表为空
2)Length(L) 返回表L的长度,即表中元素个数
3)Get(L,i) 这是一个函数,函数值为L中位置i处的元素(1≤i≤n)
4)Prior(L,i) 取位置i的前驱元素
5)Next(L,i) 取位置i的后继元素
6)Locate(L,x) 这是一个函数,函数值为元素x在L中的位置
7)Insert(L,i,x)在表L的位置i处插入元素x,将原占据位置i的元素及后面的元素都向后推一个位置
8)Delete(L,p) 从表L中删除位置p处的元素
9)IsEmpty(L) 如果表L为空表(长度为0)则返回true,否则返回false
10)Clear(L)清除所有元素
11)Traverse(L)遍历输出所有元素
12)Update(L,i,x)修改元素
13)Sort(L)对所有元素重新按给定的条件排序

14)Full(L)  检查顺序表是否为满

#include<iostream>
#include<cstdlib>
#define maxsize 100
using namespace std;
typedef int dataType;
typedef struct {
	dataType data[maxsize];
	int last;
}sqlList;
//初始化线性表为空
sqlList sqlListInit() {
	sqlList l;
	l.last = 0;
	return l;
}
//表中元素个数
int sqlListLength(sqlList l) {
	return l.last;
}
//函数值为L中位置i处的元素
void sqlListGet(sqlList l,int i) {
	if (i<1 || i>l.last) cout << "超出顺序表长度!请重新输入!" << endl;
	else cout << i << "位置的元素是:" << l.data[i - 1] << endl;
}
//取位置i的前驱元素
void sqlListPrior(sqlList l, int i) {
	if (i<1 || i>l.last) cout << "超出顺序表长度!请重新输入!" << endl;
	else if(i == 1) cout<<"首元素没有前驱!"<<endl;
	else cout <<"位置:"<<i<<"的前驱元素为:"<<l.data[i - 2] << endl;;
}
//取位置i的后继元素
void sqlListNext(sqlList l, int i) {
	if (i<1 || i>l.last) cout << "超出顺序表长度!" << endl;
	else if (i == l.last) cout<<"尾元素没有后驱!"<<endl;
	else cout<<"位置"<<i<<"的后驱是:"<<l.data[i]<<endl;
}
//元素x在L中的位置
void sqlListLocate(sqlList l, dataType x) {
	int i = 1;
	while (i <= l.last && l.data[i - 1] != x) {
		i++;
	}
	if (i <= l.last) cout<<x<<"在表中的位置是:"<<i<<endl;
	else cout<<"不在表中"<<endl;
}
//在表L的位置i处插入元素x
sqlList sqlListInsert(sqlList l,int i,dataType x) {
	if (l.last == maxsize) {
		cout << "表满!插入失败!" << endl;
		return l;
	}
	else if (i<1 || i>l.last) {
		cout << "超出顺序表长度!" << endl;
		return l;
	}
	else for (int m = l.last; m >= i;m--) {
		l.data[m] = l.data[m-1];
	}
	l.data[i-1] = x;
	++l.last;
	return l;
}
//删除位置i处的元素
sqlList sqlListDelete(sqlList l,int i) {
	if (i<1 || i>l.last) {
		cout << "超出顺序表长度!" << endl; 
		return l;
	}
	for (int m = i-1; m <l.last-1; m++) {
		l.data[m] = l.data[m+1];
	}
	--l.last;
	return l;
}
//表是否为空
void sqlListEmpty(sqlList l) {
	if (l.last == 0) {
		cout << "是空表!" << endl;
	}
	else cout << "不是空表!" << endl;
}
//清空表
sqlList sqlListClear(sqlList l) {
	l.last = 0;
	return l;
}
//遍历输出所有元素
void sqlListTraverse(sqlList l) {
	cout << "遍历结果是:";
	for (int m = 0; m <= l.last - 1; m++) {
		cout << l.data[m] << " ";
	}
	cout << endl;
}
//将位置i的元素修改为x
sqlList sqlListUpdate(sqlList l,int i,dataType x) {
	if (i<1 || i>l.last) {
		cout << "超出顺序表长度!" << endl;
		return l;
	}
	else l.data[i - 1] = x;
	cout << "修改成功!" << endl;
	return l;
}
//排序
sqlList sqlListSort(sqlList l) {
	dataType t;
	for (int i = 0; i < l.last;i++) {
		for (int j = i + 1; j < l.last; j++) {
			if (l.data[i] > l.data[j]) {
				t = l.data[i];
				l.data[i] = l.data[j];
				l.data[j] = t;
			}
		}
	}
	cout << "排序成功!" << endl;
	return l;
}
//表是否满
void sqlListFull(sqlList l) {
	if (l.last == maxsize) {
		cout << "表满!" << endl;
	}
	else cout << "表不是满表!" << endl;
}
void print() {
	cout <<	"*************************************************"<<endl;
	cout <<	"*	1.顺序表的长度	      2.取位置i的前驱	 *"<< endl;
	cout <<	"*	3.取位置i的后驱	      4.元素x的位置	 *"<< endl;
	cout <<	"*	5.位置i处插入元素x    6.删除位置i的元素  *"<< endl;
	cout << "*	7.取位置i的元素	      8.表是否为空	 *"<< endl;
	cout << "*	9.清空表	      10.遍历表	         *"<< endl;
	cout << "*	11.修改位置i的元素    12.排序	         *"<< endl;
	cout << "*	13.表是否满	      14.退出	         *"<< endl;
	cout << "*	15.清空命令行			    	 *"<< endl;
	cout << "*************************************************"<< endl;
}
void main() {
	sqlList l = sqlListInit();
	for (int i = 40; i > 0; i--) {
		l.data[i - 1] = i;
	}
	l.last = 40;
	int m=0,i = 0,n=0;
	print();
	while (1) {
		cin >> i;
		switch (i)
		{
		case 1:cout <<"顺序表的长度为:"<<sqlListLength(l) << endl; break;
		case 2:cin >> m;sqlListPrior(l, m); break;
		case 3:cin >> m; sqlListNext(l, m); break;
		case 4:cin >> m; sqlListLocate(l, m); break;
		case 5:cin >> m >> n;l=sqlListInsert(l, m, n); break;
		case 6:cin >> m;l=sqlListDelete(l, m); break;
		case 7:cin >> m; sqlListGet(l, m);break;
		case 8:sqlListEmpty(l);break;
		case 9:l = sqlListClear(l);break;
		case 10:sqlListTraverse(l);break;
		case 11:cin >> m; cin >> n;l = sqlListUpdate(l,m,n); break;
		case 12:l = sqlListSort(l);break;
		case 13:sqlListFull(l);break;
		case 14:exit(0);
		case 15:system("cls"); print();break;
		default:cout << "数字超出范围,请重新输入。" << endl; break;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值