数组实现线性表的顺序存储

来源:互联网 发布:js获取对象的值 编辑:程序博客网 时间:2024/04/27 16:08

课本第一个习题吧

一、线性表的概念:
    1、线性表是一种最简单、最常用的数据结构,通常一个线性表是由n(n>=0)个性质相同的数据元素组成的有限序列,长度即为元素的个数n,当n=0时,称该表为空表。
    2、非空的线性结构的特点:它具有惟一的第一个数据元素和最后一个数据元素;并且除了第一个元素以外,其他数据元素都只有一个前驱和一个后继。
    3、线性表的主要存储结构:顺序存储结构 和 链式存储结构。(本篇主要总结顺序存储结构)
 
二、线性表的顺序表示和实现
   顺序存储结构的存储可以用一维数组表示,具有固定长度。
   也可以用动态分配的存储结构,可以合理地利用空间。

#include <iostream>#include <cstring>#include <cstdlib>#include <ctime>using namespace std;#define OK 1#define OVERFLOW -1#define ERROR -2#define MAXSIZE 100typedef int ElemType;typedef struct List{ElemType elem[MAXSIZE];int length;}List;List InitList(){List L;memset(L.elem, -1, sizeof(L.elem));L.length = 0;cout << "顺序表已初始化" << endl << endl;return L;}void ClearList(List *L){memset(L->elem, -1, sizeof(L->elem));L->length = 0;cout << "顺序表已清空" << endl << endl;}void EmptyList(List *L){if(L->length == 0){cout << "顺序表为空" << endl << endl;}else{cout << "顺序表不为空" << endl << endl;}}void FullList(List *L){if(L->length == MAXSIZE){cout << "顺序表已满" << endl << endl;}else{cout << "顺序表未满" << endl << endl;}}int ListLength(List *L){return L->length;}void TraverseList(List *L){if(L->length == 0){cout << "顺序表为空" << endl;}else{cout << "当前顺序表中的元素为:" << endl;for(int i = 1; i <= L->length; i++){cout << L->elem[i-1] << " ";}cout << endl << endl;}}ElemType GetList(List *L, int i){if(i < 1 || i > L->length){cout << "要查询的位置出错" << endl << endl;}else{return L->elem[i-1];}}int LocateList(List *L, ElemType e){int i;for(i = 0; i < L->length; i++){if(e == L->elem[i]){return i + 1;}}if(i >= L->length){return ERROR;}}void InsertList(List *L, int i, ElemType e){if(L->length == MAXSIZE){cout << "顺序表满,不能插入元素" << endl;}else if(i < 1 || i > L->length){cout << "插入位置不正确" << endl;}else{for(int j = L->length - 1; j >= i - 1; j--){L->elem[j+1] = L->elem[j];}L->elem[i-1] = e;L->length++;}}void DeleteList(List *L, int i){ElemType e;if(i < 1 || i > L->length){cout << "删除位置不正确" << endl << endl;}else{e = L->elem[i-1];for(int j = i; j <= L->length; j++){L->elem[j-1] = L->elem[j];}L->length--;cout << e << "元素已被删除" << endl << endl;}}void PreList(List *L, ElemType e){int i = 0;while(i < L->length && L->elem[i] != e){i++;}if(i == 0){cout << "第一个元素没有前驱" << endl << endl;}else if(i <= L->length - 1){cout << e << " 元素的前驱为 " << L->elem[i-1] << endl << endl;}else{cout << "不存在元素" << e << endl << endl;}}void NextList(List *L, ElemType e){int i = 0;while(i < L->length && L->elem[i] != e){i++;}if(i == 0){cout << "第一个元素没有前驱" << endl << endl;}else if(i <= L->length - 1){cout << e << " 元素的后继为 " << L->elem[i+1] << endl << endl;}else{cout << "不存在元素" << e << endl << endl;}}void RandomList(List *L){ClearList(L);srand((unsigned)time(NULL));int length;length= rand() % 100;L->length = length;for(int j = 0 ; j < length; j++){L->elem[j] = rand() % 100;}cout << "随机数据已生成" << endl << endl;}int scan(){int n;cout << "-----------------++++++++++++++++++-------------------" << endl;cout << "                请选择所要进行的操作                  " << endl;cout << "1.初始化  2.清空  3.求顺序表长度  4.检查顺序表是否为空" << endl;cout << "5.检查顺序表是否为满 6.遍历顺序表 7.从顺序表中查找元素" << endl;cout << "8.从顺序表中查找与给定元素值相同的元素在顺序表中的位置" << endl;cout << "9.向顺序表中插入元素            10. 从顺序表中删除元素" << endl;cout << "11.求元素的前驱     12.求元素的后继    13.生成随机数据" << endl;cout << "-----------------++++++++++++++++++-------------------" << endl;cin >> n;return n;}int main(){int quit = 0;int i;List L;ElemType e;while(!quit){switch (scan()){case 1 : L = InitList();break;case 2 : ClearList(&L);break;case 3 : cout << "顺序表的长度为:" << ListLength(&L) << endl << endl;break;case 4 : EmptyList(&L);break;case 5 : FullList(&L);break;case 6 : TraverseList(&L);break;case 7 : cout << " 请输入要查询的元素的位置" << endl; cin >> i; cout << GetList(&L,i) << endl << endl;break;case 8 : cout << "请输入要查询的元素的值" << endl; cin >> e; cout << LocateList(&L,e) << endl << endl;break;case 9 : cout << "请输入要插入的元素和位置" << endl; cin >> e >> i; InsertList(&L,i,e);break;case 10: cout << "请输入要删除的元素的位置" << endl; cin >> i; DeleteList(&L,i);break;case 11: cin >> e; PreList(&L,e);break;case 12: cin >> e; NextList(&L,e);break;case 13: RandomList(&L);break;default:quit = 1;}}return 0;}
----------------------------------------------------------------------------------------------------------------

写一算法,从顺序表中删除自第i个元素开始的k个元素。

void DeleteListFromI(List *L, int i, int k){ElemType e;if(i < 1 || i > L->length || k > L->length || i + k > L->length + 1){cout << "删除位置不正确" << endl << endl;}else{e = L->elem[i-1];for(int j = i + k - 1; j <= L->length; j++){L->elem[j-k] = L->elem[j];}L->length -= k;cout << "从" << e << "开始的" << k << "个元素已被删除" << endl << endl;


原创粉丝点击