zoukankan      html  css  js  c++  java
  • 线性表的顺序表示和实现

    线性表的顺序表示和实现

    线性表的定义和特点

    定义:由n个数据特性相同的元素构成的有限序列。
    特点:

    1. 存在唯一的一个被称作“第一个”的数据元素。
    2. 存在唯一的一个被称作“最后一个”的数据元素。
    3. 除第一个外,结构中的每个数据元素均只有一个前驱。
    4. 除最后一个外,结构中的每个元素均只有一个后驱。

    线性表的类型定义

    ADT List{
    数据对象:D={ai|ai∈Element,i=1,2,...,n,n>=0}
    数据关系:R={<ai-1,ai>|ai-1,ai∈D,i=2,...,n}
    基本操作:
    Initlist(&L)
    操作结果:构造一个空表L
    DestroyList(&L)
    初始条件:线性表L已存在
    操作结果:将L置为空表
    ListEmpty(L)
    初始条件:线性表L已存在
    操作结果:若L为空表,返回true,否则返回false
    GetElem(L,i,e)
    初始条件:线性表L已存在,且1<=i<=ListLength(L)
    操作结果:用e返回L中第i个数据元素的值
    LocateElem(L,e)
    初始条件:线性表L已存在
    操作结果:返回L中第1个与e相同的元素的在L中的位置。若无则返回0
    PriorElement(L,cur_e,&pre_e)
    初始条件:线性表L已存在
    操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回其前驱,否则操作失败
    NextElement(L,cur_e,&next_e)
    初始条件:线性表L已存在
    操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回其后继,否则操作失败
    ListInsert(&L,i,e)
    初始条件:线性表L已存在,且1<=i<=ListLength(L)+1
    操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1
    ListDelete(&L,i)
    初始条件:线性表L存在且非空,且1<=i<=ListLength(L)
    操作结果:删除L中第i个元素,L的长度减1
    TraverseLsit(L)
    初始条件:线性表L已存在
    操作结果:对线性表L进行遍历
    }ADT List
    

    顺序表实现图书馆里系统

    #include<iostream>
    #include<fstream>
    #include<string>
    #include<iomanip>
    using namespace std;
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
    typedef int ElemType; //ElemType 为可定义的数据类型,此设为int类型
    
    #define MAXSIZE 100			//顺序表可能达到的最大长度
    struct Book {
    	string id;//ISBN
    	string name;//书名
    	double price;//定价
    };
    typedef struct {
    	Book *elem; //存储空间的基地址
    	int length; //当前长度
    } SqList;
    
    Status InitList_Sq(SqList &L) { //算法2.1 顺序表的初始化
    	//构造一个空的顺序表L
    	L.elem = new Book[MAXSIZE]; //为顺序表分配一个大小为MAXSIZE的数组空间
    	if (!L.elem)
    		exit(OVERFLOW); //存储分配失败退出
    	L.length = 0; //空表长度为0
    	return OK;
    }
    
    Status GetElem(SqList L, int i, Book &e) {//算法2.2 顺序表的取值
    	if (i < 1 || i > L.length)
    		return ERROR; //判断i值是否合理,若不合理,返回ERROR
    	e = L.elem[i - 1]; //elem[i-1]单元存储第i个数据元素
    	return OK;
    }
    
    int LocateElem_Sq(SqList L, double e) { //算法2.3 顺序表的查找
    	//顺序表的查找
    	for (int i = 0; i < L.length; i++)
    		if (L.elem[i].price == e)
    			return i + 1;//查找成功,返回序号i+1
    	return 0;//查找失败,返回0
    }
    
    Status ListInsert_Sq(SqList &L, int i, Book e) { //算法2.4 顺序表的插入
    	//在顺序表L中第i个位置之前插入新的元素e
    	//i值的合法范围是1<=i<=L.length+1
    	if ((i < 1) || (i > L.length + 1))
    		return ERROR; //i值不合法
    	if (L.length == MAXSIZE)
    		return ERROR; //当前存储空间已满
    	for (int j = L.length - 1; j >= i - 1; j--)
    		L.elem[j + 1] = L.elem[j]; //插入位置及之后的元素后移
    	L.elem[i - 1] = e; //将新元素e放入第i个位置
    	++L.length; //表长增1
    	return OK;
    }
    
    Status ListDelete_Sq(SqList &L, int i) { //算法2.5 顺序表的删除
    	//在顺序表L中删除第i个元素,并用e返回其值
    	//i值的合法范围是1<=i<=L.length
    	if ((i < 1) || (i > L.length))
    		return ERROR; //i值不合法
    	for (int j = i; j <= L.length-1; j++)
    		L.elem[j - 1] = L.elem[j]; //被删除元素之后的元素前移
    	--L.length; //表长减1
    	return OK;
    }
    
    int main() {
    	SqList L;
    	int i = 0, temp, a, c, choose;
    	double price;
    	Book e;
    	string head_1, head_2, head_3;
    	cout << "1. 建立
    ";
    	cout << "2. 输入
    ";
    	cout << "3. 取值
    ";
    	cout << "4. 查找
    ";
    	cout << "5. 插入
    ";
    	cout << "6. 删除
    ";
    	cout << "7. 输出
    ";
    	cout << "0. 退出
    
    ";
    
    	choose = -1;
    	while (choose != 0) {
    		cout << "请选择:";
    		cin >> choose;
    		switch (choose) {
    		case 1://创建顺序表
    			if (InitList_Sq(L))
    				cout << "成功建立顺序表
    
    ";
    			else
    				cout << "顺序表建立失败
    
    ";
    			break;
    		case 2: {//顺序表信息输入
    			i = 0;
    			L.elem = new Book[MAXSIZE];
    			if (!L.elem)
    				exit(OVERFLOW);
    			L.length = 0;
    			fstream file;
    			file.open("book.txt");
    			if (!file) {
    				cout << "错误!未找到文件!" << endl;
    				exit(ERROR);
    			}
    			file >> head_1 >> head_2 >> head_3;
    			while (!file.eof()) {
    				file >> L.elem[i].id >> L.elem[i].name >> L.elem[i].price;
    				i++;
    			}
    			cout << "输入 book.txt 信息完毕
    
    ";
    			L.length = i;
    			file.close();
    		}
    			break;
    		case 3://顺序表的取值
    			cout << "请输入一个位置用来取值:
    ";
    			cin >> i;
    			temp = GetElem(L, i, e);
    			if (temp != 0) {
    				cout << "查找成功
    ";
    				cout << "第" << i << "本图书的信息是:
    ";
    				cout << left << setw(15) << e.id << "	" << left << setw(50)
    						<< e.name << "	" << left << setw(5) << e.price << endl
    						<< endl;
    			} else
    				cout << "查找失败!位置超出范围
    
    ";
    			break;
    		case 4: //顺序表的查找
    			cout << "请输入所要查找价格:";
    			cin >> price;
    			temp = LocateElem_Sq(L, price);
    			if (temp != 0) {
    				cout << "查找成功
    ";
    				cout << "该价格对应的书名为:" << L.elem[temp - 1].name << endl << endl;
    			} else
    				cout << "查找失败!没有这个价格对应的书籍
    
    ";
    			break;
    		case 5: //顺序表的插入
    			cout << "请输入插入的位置和书本信息,包括:编号 书名 价格(用空格隔开):";
    			cin >> a;
    			cin >> e.id >> e.name >> e.price; //输入a和b,a代表插入的位置,b代表插入的数值(书本信息)
    			if (ListInsert_Sq(L, a, e))
    				cout << "插入成功.
    
    ";
    			else
    				cout << "插入失败.
    
    ";
    			break;
    		case 6: //顺序表的删除
    			cout << "请输入所要删除的书籍的位置:";
    			cin >> c;
    			if (ListDelete_Sq(L, c))
    				cout << "删除成功.
    
    ";
    			else
    				cout << "删除失败.
    
    ";
    			break;
    		case 7: //顺序表的输出
    			cout << "当前图书系统信息(顺序表)读出:
    ";
    			for (i = 0; i < L.length; i++)
    				cout << left << setw(15) << L.elem[i].id << "	" << left
    						<< setw(50) << L.elem[i].name << "	" << left
    						<< setw(5) << L.elem[i].price << endl;
    			cout << endl;
    			break;
    		}
    	}
    	return 0;
    }
    

    算法分析

    • 查找平均移动次数:(n+1)/2
    • 插入平均移动次数:移动n-i+1,n/2
    • 插入平均移动次数:移动n-i,(n-1)/2
  • 相关阅读:
    flask 跨域问题
    pip 命令参数说明
    关于ASP.NET动态加载控件的几点实用总结
    记录代码运行耗时的写法
    DevExpress AspxGridView数据绑定
    发现一个Membership的bug
    asp.net页面中文件下载的2种方式
    【部分转】innerText 跟 innerHTML区别
    gridview 的添加删除等技巧 全部按名称取值
    关于Linq to DataTable not in的写法
  • 原文地址:https://www.cnblogs.com/thrseven/p/15196236.html
Copyright © 2011-2022 走看看