SeqList
数据结构Seqlist.H头文件
数据结构Seqlist.H头文件/*使用方法:将下述的代码复制到C语言程序编辑窗口,将文件另存为Seqlist的文件名后缀为.h 的文件,在使用时可以先运行一下*///顺序表的实现#include "stdio.h"#include "math.h"typedef struct{DataType list[MaxSize];int size;} SeqList;//初始化列表void ListInitiate(SeqList *L){L->size = 0;}//得到列表的大小int ListLength(SeqList L){return L.size;}int ListInsert( SeqList *L, int i, DataType x){int j;if ( L->size >= MaxSize ){printf("顺序表已经满了无法插入!/n");return 0;}else if ( i<0 || i>L->size){printf("参数i不合格!");return 0;}else{for (j=L->size;j>i;j--)L->list[j] = L->list[j-1];L->list[i] = x;L->size++;return 1;}}int ListDelete( SeqList *L, int i , DataType *x) {int j;if ( L->size <=0 ){printf("顺序表已经空!/n");return 0;}else if ( i<0 || i>=L->size){printf("参数i不合格!");return 0;}else{*x = L->list[i];for ( j = i+1;j < L->size-1; j++ )L->list[j] = L->list[j+1];L->size--;return 1;}}int ListGet(SeqList L, int i, DataType *x) {if ( i<0 || i>L.size-1){printf("参数i不合格!");return 0;}else{*x=L.list[i];return 1;}}。
1.顺序表的定义、取值、查找、插入、删除的基本运算
1.顺序表的定义、取值、查找、插入、删除的基本运算顺序表是一种数据结构,通过数组的形式存储和组织数据。
顺序表中的元素在内存中是连续存储的,元素之间的顺序是由其在数组中的位置决定的。
1. 定义顺序表:顺序表可以通过定义一个数组和一个变量来表示。
数组用于存储元素,变量用于记录顺序表的长度。
例如,一个顺序表可以定义如下:```const int MAX_SIZE = 100; // 假设顺序表最大长度为100struct SeqList {int data[MAX_SIZE]; // 数组用于存储元素int length; // 记录顺序表的长度};```2. 取值:可以通过索引来访问顺序表中的元素。
索引从0开始,从左到右逐个增加。
例如,要访问第i个元素,可以使用`seqList.data[i]`来获取。
3. 查找:要查找顺序表中的某个元素,可以遍历顺序表,逐个比较元素的值与目标值是否相等。
如果找到了目标值,则返回该元素的索引;如果没有找到,则返回-1表示未找到。
```int search(SeqList seqList, int target) {for (int i = 0; i < seqList.length; i++) {if (seqList.data[i] == target) {return i; // 找到目标值,返回索引}}return -1; // 未找到目标值}```4. 插入:要在顺序表中插入一个元素,需要将插入位置之后的元素向后移动,然后将新元素插入到指定位置。
```bool insert(SeqList &seqList, int index, int value) {// 检查插入位置是否有效if (index < 0 || index > seqList.length) {return false; // 插入位置无效,插入失败}// 将插入位置之后的元素向后移动for (int i = seqList.length - 1; i >= index; i--) {seqList.data[i + 1] = seqList.data[i];}// 插入新元素seqList.data[index] = value;// 更新顺序表的长度seqList.length++;return true; // 插入成功}```5. 删除:要删除顺序表中的一个元素,需要将删除位置之后的元素向前移动,然后将顺序表的长度减1。
线性表实验报告
线性表实验报告一、实验目的本次实验的主要目的是深入理解线性表的基本概念和操作,通过实际编程实现线性表的存储和基本运算,掌握线性表在数据结构中的应用,提高对数据结构的理解和编程能力。
二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。
三、实验原理线性表是一种最基本、最简单的数据结构,它是由 n(n≥0)个数据元素组成的有限序列。
在这个序列中,每个数据元素的位置是按照其逻辑顺序排列的。
线性表有两种存储结构:顺序存储结构和链式存储结构。
顺序存储结构是用一组地址连续的存储单元依次存储线性表中的数据元素,使得逻辑上相邻的两个元素在物理位置上也相邻。
其优点是可以随机访问表中的任意元素,时间复杂度为 O(1);缺点是插入和删除操作需要移动大量元素,时间复杂度为 O(n)。
链式存储结构是通过指针将各个数据元素链接起来,每个数据元素由数据域和指针域组成。
其优点是插入和删除操作不需要移动大量元素,时间复杂度为 O(1);缺点是不能随机访问表中的元素,需要从头指针开始遍历,时间复杂度为 O(n)。
四、实验内容本次实验实现了顺序表和链表的基本操作,包括创建、插入、删除、查找、遍历等。
1、顺序表的实现定义顺序表的结构体,包括数据存储数组和表的长度。
实现顺序表的初始化函数,将表的长度初始化为 0。
实现顺序表的插入函数,在指定位置插入元素,如果插入位置非法或表已满,则返回错误。
实现顺序表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。
实现顺序表的查找函数,查找指定元素,如果找到则返回元素的位置,否则返回-1。
实现顺序表的遍历函数,输出表中的所有元素。
2、链表的实现定义链表的结构体,包括数据域和指向下一个节点的指针域。
实现链表的创建函数,创建一个空链表。
实现链表的插入函数,在指定位置插入元素,如果插入位置非法,则返回错误。
实现链表的删除函数,删除指定位置的元素,如果删除位置非法,则返回错误。
顺序表实验报告
顺序表实验报告实验名称:顺序表的实现与操作实验目的:1.理解顺序表的概念、特点和实现方式。
2.掌握顺序表的基本操作,包括初始化、插入、删除、查找、修改、清空等操作。
3.提高编程能力,加深对数据结构的理解。
实验原理:顺序表是数据结构中的一种线性表,采用连续的存储方式来存储元素,其具有访问速度快的特点。
在顺序表中,元素在物理存储上是连续的,每个元素占据一定的存储空间。
顺序表的实现需要使用数组,可以通过数组下标查找具体元素,也可以通过数组长度限定表的大小。
实验步骤:1.定义顺序表结构体struct SeqList{int size;//表的大小int length;//表的长度int *data;//存储数据的指针};2.初始化操作void initSeqList(SeqList &list,int size){list.size = size;list.length = 0;list.data = new int[size];}3.插入操作void insertSeqList(SeqList &list,int pos,int elem){ if(pos<1 || pos>list.length+1){cout<<"位置不合法"<<endl;return;}if(list.length>=list.size){cout<<"顺序表已满"<<endl;return;}for(int i=list.length-1; i>=pos-1; i--){list.data[i+1] = list.data[i];}list.data[pos-1] = elem;list.length++;}4.删除操作void deleteSeqList(SeqList &list,int pos){ if(pos<1 || pos>list.length){cout<<"位置不合法"<<endl;return;}for(int i=pos-1; i<list.length-1; i++){ list.data[i] = list.data[i+1];}list.length--;}5.查找操作int searchSeqList(SeqList list,int elem){for(int i=0; i<list.length; i++){if(list.data[i] == elem){return i+1;}}return 0;}6.修改操作void modifySeqList(SeqList &list,int pos,int elem){ if(pos<1 || pos>list.length){cout<<"位置不合法"<<endl;return;}list.data[pos-1] = elem;}7.清空操作void clearSeqList(SeqList &list){list.length = 0;}实验结果:经过上述实验操作,成功实现了顺序表的初始化、插入、删除、查找、修改、清空等操作,并能够正确输出结果。
数据结构编程实现顺序表的基本操作
数据结构编程实现顺序表的基本操作顺序表是一种基础的数据结构,它是线性表的一种实现方式,它采用连续存储结构来存储线性表的元素。
顺序表中的数据元素存储往往是数值型,它通常用于存储数组和队列等数据结构。
今天我们来学习顺序表的基本操作及其编程实现。
第一步:定义顺序表在编写顺序表的基本操作之前,我们需要先定义一个顺序表的数据结构。
这里我们可以使用结构体来定义一个顺序表的数据类型:```typedef struct {int *data; // 存储空间的基地址int length; // 顺序表的长度int max_size; // 顺序表可存储的最大元素个数} SeqList;```以上定义了一个SeqList结构体类型,包含三个成员:data表示存储空间的基地址,length表示顺序表的元素个数,max_size表示顺序表可存储的最大元素个数。
其中,data采用动态分配内存的方式,可以根据实际需要动态调整顺序表的大小,max_size则是由用户在创建顺序表时指定的。
第二步:实现顺序表的基本操作顺序表的基本操作包括初始化、插入、删除、查找、获取元素等。
下面分别介绍这些操作的实现方法。
1. 初始化操作初始化操作用于创建一个空的顺序表。
它的实现方法如下:```SeqList* init_seq_list(int max_size) {SeqList *list = (SeqList*)malloc(sizeof(SeqList)); // 申请存储空间if (!list) { // 内存申请失败printf("Error: Out of memory!\n");return NULL;}list->data = (int*)malloc(sizeof(int) * max_size); // 申请存储数据的空间if (!list->data) { // 内存申请失败printf("Error: Out of memory!\n");free(list); // 释放存储空间return NULL;}list->length = 0; // 空表长度为0list->max_size = max_size; // 顺序表可存储的最大元素个数 return list; // 返回顺序表指针}```在初始化过程中,我们先申请存储空间,然后再申请存储数据的空间,最后将顺序表的长度设为0,顺序表可存储的最大元素个数设为max_size,返回顺序表的指针。
数据结构实验报告—顺序表
《算法与数据结构》课程实验报告一、实验目的1、实现线性表的顺序存储结构。
2、熟悉C++程序的基本结构,掌握程序中的头文件、实现文件和主文件之间的相互关系及各自的作用。
3、熟悉顺序表的基本操作方式,掌握顺序表相关操作的具体实现。
二、实验内容及要求对顺序存储的线性表进行一些基本操作。
主要包括:(1)插入:操作方式为在指定元素前插入、在指定元素之后插入、在指定位置完成插入。
(2)删除:操作方式可分为删除指定元素、删除指定位置的元素等,尝试实现逻辑删除操作。
(3)显示数据。
(4)查找:查询指定的元素(可根据某个数据成员完成查询操作)。
(5)定位操作:定位指定元素的序号。
(6)更新:修改指定元素的数据。
(7)数据文件的读写操作等。
其它操作可根据具体需要自行补充。
要求线性表采用类的定义,数据对象的类型自行定义。
三、系统分析(1)数据方面:能够实现多种数据类型顺序表的创建,并进行操作,不同的数据类型数据使用不同的文本文件保存。
(2)功能方面:能够实现线性表的一些基本操作,主要包括:1.计算表最大可以容纳表项个数以及当前表的当前长度。
2.能够进行添加操作,在已有的数据文件中进行数据的添加。
3.能够进行搜索操作,返回搜索项在表中表项序号4.能够进行定位操作,定位到表中合理位置。
5.能够进行取值操作,根据用户需求取出表中某项的值。
6.能够进行修改操作,在用户选择修改项后将重新输入内容修改到对应位置。
7.能够进行插入操作,在用户选择合理位置并输入插入内容后即可。
8.能够进行删除操作,用户根据选择表中项数删除对应数据。
9.能够进行判断表空或表满。
四、系统设计(1)设计的主要思路根据实验要求,首先将顺序表模板类完成,并将需要实现的功能代码完善,在写实现各个功能的菜单并将模板类实例化为简单数据类型最后进行调试,由于还需使得顺序表能够存储自定义的学生类类型数据,故根据要求写出Student类,并将之前所写得模板类用学生类数据类型实例化,再进行调试。
考研数据结构真题2022
考研数据结构真题2022随着计算机科学的不断发展,数据结构作为计算机科学的基础概念之一,在考研中扮演着重要的角色。
为了帮助考研学子更好地备考数据结构,本文将为您提供2022年考研数据结构真题,并提供解析和解答。
第一题:1. 给出以下四个数据结构的定义和初始化操作:(1) 顺序表(2) 链表(3) 栈(4) 队列要求:给出上述四个数据结构的定义,并写出初始化操作的伪代码。
解析和解答:顺序表的定义:```ctypedef struct{int *data; // 用于存储数据元素的数组int length; // 当前顺序表的长度int capacity; // 顺序表的容量} SeqList;```链表的定义:```ctypedef struct Node{int data; // 数据域struct Node *next; // 指针域,指向下一个节点} LinkedList;```栈的定义:```ctypedef struct{int *data; // 用于存储数据元素的数组int top; // 栈顶指针,指向栈顶元素} Stack;```队列的定义:typedef struct{int *data; // 用于存储数据元素的数组int rear; // 队尾指针,指向队尾元素int front; // 队头指针,指向队头元素} Queue;```顺序表初始化操作伪代码:```cvoid InitSeqList(SeqList *L, int capacity){L->data = (int *)malloc(capacity * sizeof(int)); L->length = 0;L->capacity = capacity;}```链表初始化操作伪代码:```cvoid InitLinkedList(LinkedList **head){*head = NULL;```栈初始化操作伪代码:```cvoid InitStack(Stack *S, int capacity){S->data = (int *)malloc(capacity * sizeof(int)); S->top = -1;}```队列初始化操作伪代码:```cvoid InitQueue(Queue *Q, int capacity){Q->data = (int *)malloc(capacity * sizeof(int)); Q->rear = -1;Q->front = 0;}```第二题:2. 在数据结构中,常用的排序算法有冒泡排序、插入排序和快速排序。
SeqList
#include<iostream>#include<stdlib.h>#include<stdio.h>using namespace std;#define MAXSIZE 100 //表中元素的最大个数typedef int ElemType; //元素类型typedef struct list{ElemType elem[MAXSIZE];//静态线性表int length; //表的实际长度}SqList;//顺序表的类型名/*定义一个指向SeqList类型的指针*/typedef SqList *PSeqList;/*顺序表的初始化*/PSeqList Init_SeqList(){PSeqList SeqListPoint;SeqListPoint = new SqList();if(SeqListPoint){SeqListPoint->length = 0;}return SeqListPoint;}/*输入整型元素序列建立一个顺序表*/PSeqList Create_SeqList(int n){PSeqList SeqListPoint;SeqListPoint = Init_SeqList();cout<<"--------------------------------"<<endl;cout<<"输入一组整型元素序列,建立顺序表"<<endl;for(int i=0;i<n;i++){cout<<"输入第"<<(i+1)<<"个元素:";/*采用头插入方式for(int j= SeqListPoint->length-1;j>=0;j--){SeqListPoint->elem[j+1] = SeqListPoint->elem[j];} */cin>>SeqListPoint->elem[i]; //采用尾插入方式SeqListPoint->length++;}return SeqListPoint;}/*遍历元素输出*/void Traverse_SeqList(PSeqList SeqListPoint){cout<<"-------------------------"<<endl;cout<<"遍历元素:"<<endl;for(int i=0;i<SeqListPoint->length;i++){cout<<"输出第"<<(i+1)<<"个元素:"<<SeqListPoint->elem[i]<<endl;}cout<<"-------------------------"<<endl;cout<<endl;}/*查询元素指定的元素x,并用Locate记录该元素所在的位置*/int Locate_SeqList(PSeqList SeqListPoint,ElemType x,int *Locate){int i = 0;if(!SeqListPoint){cout<<"表不存在!无法查询!"<<endl;return -1;}while(i<SeqListPoint->length && SeqListPoint->elem[i] != x){i++;}if(i >= SeqListPoint->length){return 0;}else{*Locate = i;return SeqListPoint->elem[i];}}/*实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数*/void Sort_SeqList(PSeqList SeqListPoint){cout<<"实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数"<<endl; int i = 0;int j = 0;int k = 0;for(i=0;i<SeqListPoint->length;i++){for(j=0;j<SeqListPoint->length-i;j++){//判断是否为偶数if(SeqListPoint->elem[j] % 2 == 0){//使用临时变量保存值int temp = SeqListPoint->elem[j];//下面语句是将当前结点之后的元素整体前移for(k=j;k<SeqListPoint->length-1;k++){SeqListPoint->elem[k] = SeqListPoint->elem[k+1];}SeqListPoint->elem[SeqListPoint->length-1] = temp;break; //跳出循环j}}}}/*判断顺序表是否对称,返回值为布尔值,对称则返回,否则返回*/ int IsSymmetry_SeqList(PSeqList _PSeqList){int Low = 0; //低位int High = _PSeqList->length - 1; //高位int Flag = 0; //保存判断结果while(Low<High){if(_PSeqList->elem[Low] == _PSeqList->elem[High]){Flag = 1;Low++;High--;}else{Flag = 0;break;}}return Flag;}void main(){PSeqList SeqListPoint;int len = 0; //保存建立的线性表的元素长度int i = 0;int x = 0;int select;do{cout<<"******************选项菜单栏*******************"<<endl;cout<<"1.输入一组整型元素序列,建立顺序表"<<endl;cout<<"2.实现该顺序表的遍历"<<endl;cout<<"3.在该顺序表中进行顺序查找某一元素,查找成功显示查找元素,否则显示查找失败"<<endl;cout<<"4.判断该顺序表中元素是否对称,对称返回,否则返回"<<endl;cout<<"5.实现把该表中所有奇数排在偶数之前,即表的前面为奇数,后面为偶数"<<endl;cout<<"请输入菜单选项:"<<endl;cin>>select;switch(select){case 1: cout<<"设置要建立的顺序表的元素个数:";cin>>len; //用户设置元素数SeqListPoint = Create_SeqList(len); //创建顺序表cout<<endl;break;case 2: Traverse_SeqList(SeqListPoint); //遍历顺序表cout<<endl;break;case 3: cout<<"输入要查询的元素:";cin>>x;if(Locate_SeqList(SeqListPoint,x,&i))cout<<"查找成功,找到元素的值为:"<<Locate_SeqList(SeqListPoint,x,&i)<<endl;elsecout<<"查找失败"<<endl;cout<<endl;break;case 4: if(IsSymmetry_SeqList(SeqListPoint) == 1){cout<<"顺序表是对称的!"<<endl;}else{cout<<"顺序表不是对称的!"<<endl;}cout<<endl;break;case 5: Sort_SeqList(SeqListPoint); //实现把表中所有奇数排在偶数之前 Traverse_SeqList(SeqListPoint); //遍历元素cout<<endl;break;}}while(select);}。
第8章 查找 习题参考答案
习题八 参考答案一、选择题1.对线性表进行二分查找时,要求线性表必须( B )A.以顺序方式存储B.以顺序方式存储,且结点按关键字值有序排列C.以链接方式存储D.以链接方式存储,且结点按关键字值有序排列2. 用二分查找法查找具有n 个结点的顺序表时,查找每个结点的平均比较次数是( D )A.O(n 2)B.O(nlog 2n)C.O(n)D.O(log 2n)3. 对长度为4的顺序表进行查找,若查找第一个记录的概率为1/24, 查找第二个记录的概率为1/6, 查找第三个记录的概率为2/3, 查找第四个记录的概率为1/8,则查找任意一个记录的平均查找长度为( A )A.23/8B.20/8C.17/8D.14/84. 若有一个长度为64的有序表,现用二分查找方法查找某一记录,则查找不成功,最多需要比较( B )次。
A.9B.7C.5D.35. 当采用分块查找时,数据的组织方式为( C )A.数据必须有序B.数据不必有序C.数据分成若干块,每块内数据不必有序,但块间必须有序D.数据分成若干块,每块内数据必须有序,但块间不必有序6. 一棵深度为k 的平衡二叉树,其每个非终端结点的平衡因子均为0,则该平衡二叉树共有( C )个结点。
A.2k-1-1B.2k-1+1C.2k -1D.2k +17. 具有5层结点的平衡二叉树至少有( B )个结点。
A.10B.12C.15D.178. 若结点的存储地址与其关键字之间存在某种映射关系,则称这种存储结构为( D )A.顺序存储结构B.链式存储结构C.索引存储结构D.散列存储结构9. 以下有关m 阶B-树的叙述中,错误的是( B )。
A.根结点至多有m 棵子树B.每个结点至少有⎥⎥⎤⎢⎢⎡2m 棵子树 C.所有叶子结点都在同一层上 D.每个结点至多有m-1个关键字10.哈希表的地址区间为0~17,哈希函数为h(key)=K%17。
采用线性探测法处理冲突,并将关键字序列{26,25,72,38,8,18,59}依次存储到哈希表中,则在哈希表中查找元素59需要搜索的次数为( C )。
SeqList
SeqList 下⼀个是SeqList:顺序表#ifndef SQELIST_H#define SQELIST_H#include <iostream>using namespace std;const int Null = 0;template<class Type>class SeqList {private:Type *data; //sequence store in arrayint maxsize; //max store lengthint last; //the last position of sequence in current timepublic:SeqList(int sz = 0);~SeqList() { delete [] data;}int length() const { return last + 1; }void setLast(int last) { st = last; }int getLast() const { return last; }int find(const Type & x ) const;int isIn(const Type & x) const;int insert(int pos, const Type & x);int remove(const Type& x);int next(const Type& x);int prior(const Type& x);int isEmpty() const { return last == -1;}int isFull() const { return last == maxsize - 1; }Type get(int i) const { return (i < 0 || i > last) ? Null : data[i]; }};#endif#include "seqlist.h"template<class Type>SeqList<Type>::SeqList(int sz){if(sz < 0){cerr << "Invalid Array Size!" << endl;exit(1);}maxsize = sz;data = new Type[sz];for(int i = 0; i < sz; ++i)data[i] = 0; //initializationif(data == 0){cerr << "Memory Allocation Error!" << endl;exit(1);}last = -1;//initialization}template<class Type>int SeqList<Type>::find(const Type & x) const{int i = 0;while( i <= last && data[i] != x){++i;}if(i > last) return -1;return i;}template<class Type>int SeqList<Type>::isIn(const Type & x) const{int i = 0, found = 0;while( i <= last && found != 1){if(data[i] != x)++i;elsefound = 1;}return found;}template<class Type>int SeqList<Type>::insert(int pos, const Type & x){if(pos < 0 || pos > last + 1 || last == maxsize - 1) //must consider all of conditions {cerr << "Invalid position for insert!" << endl;return 0;}++last;for(int j = last; j > pos; --j){data[j] = data[j - 1];}data[pos] = x;return 1;}template<class Type>int SeqList<Type>::remove(const Type & x){int pos = find(x);if(pos == -1)return 0;for(int j = pos; j < last; ++j){data[j] = data[j + 1];}--last;return 1;}template<class Type>int SeqList<Type>::next(const Type & x){int pos = find(x);if(pos == -1 || pos == last)return -1;return pos + 1;}template<class Type>int SeqList<Type>::prior(const Type & x){int pos = find(x);if(pos == -1 || pos == 0)return -1;return pos - 1;}#include "seqlist.cpp"template<class Type>void Union(SeqList<Type> &LA, SeqList<Type> &LB){int i = 0;int n = LA.length();int m = LB.length();while(i <= m){Type element = LB.get(i);int pos = LA.find(element);if(pos == -1){LA.insert(n, element);++n;}++i;}}template<class Type>void Intersection(SeqList<Type> &LA, SeqList<Type> &LB) {int i = 0;int n = LA.length();int m = LB.length();while( i <= n){Type element = LA.get(i);int pos = LB.find(element);if(pos == -1){LA.remove(element);--n;}else++i;}}int main(){SeqList<int> list(5);cout << "list isEmpty: " << list.isEmpty() << endl;cout << "list length: " << list.length() << endl;cout << "list1: " << endl;for(int i = 0; i < 3; ++i){list.insert(i, i);cout << list.get(i) << " ";}cout << endl;SeqList<int> list2(3);cout << "list2: " << endl;for(int i = 0; i < 3; ++i){list2.insert(i, i + 1);cout << list2.get(i) << " ";}cout << endl;Union(list, list2);cout << "union list: " << endl;for(int i = 0; i < list.length(); ++i){cout << list.get(i) << " ";}cout << endl;Intersection(list, list2);cout << "intersection list: " << endl; for(int i = 0; i < list.length(); ++i){cout << list.get(i) << " ";}cout << endl;}。
数据结构--线性表的基本运算及多项式的算术运算
数据结构:线性表的基本运算及多项式的算术运算一、实验目的和要求实现顺序表和单链表的基本运算,多项式的加法和乘法算术运算。
要求:能够正确演示线性表的查找、插入、删除运算。
实现多项式的加法和乘法运算操作。
二、实验环境(实验设备)X64架构计算机一台,Windows 7操作系统,IDE: Dev C++ 5.11编译器: gcc 4.9.2 64bit二、实验原理及内容程序一:实现顺序表和单链表的实现本程序包含了四个文件,分别是LinearListMain.cpp,linearlist.h,seqlist.h,singlelist.h。
分别是主程序,线性表抽象类,顺序储存线性表的实现,链表储存顺序表的实现。
文件之间的关系图:本程序一共包含了三个类:分别是LinearList(线性表抽象类),SeqList(顺序储存的线性表),SingleList(链表储存的线性表)。
类与类之间的关系图如下:其实,抽象类LinearList规定了公共接口。
分别派生了SeqList类和SingleList。
SingleList类与SingleList类分别实现了LinearList类中的所有接口。
程序代码以及分析:Linearlist类:#include <iostream>using namespace std;template <class T>class LinearList{protected:int n; //线性表的长度public:virtual bool IsEmpty() const=0; //判读是否是空线性表virtual int Length() const=0; //返回长度virtual bool Find(int i,T& x) const=0; //将下标为i的元素储存在x中,成功返回true,否则返回falsevirtual int Search(T x) const=0; //寻找值是x的元素,找到返回true,否则返回falsevirtual bool Insert(int i,T x)=0; //在下标为i的元素后面插入xvirtual bool Delete(int i)=0; //删除下标为i的元素virtual bool Update(int i,T x)=0;//将下标为i的元素更新为x virtual void Output(ostream& out)const=0; //将线性表送至输出流};包含了一个保护数据成员n,和8种运算,具体说明见注释。
顺序表与单链表基本运算算法
顺序表的基本运算实现假设表中数据元素的值为整数;#define MAX 100 //定义表最大长度容量,实际用不到那么多//顺序表结构定义typedef struct{int data[MAX]; //存放表结点int length; //当前表长度} SeqList;//创建初始顺序表SeqList *createList(int size){int i;SeqList *list;list=(SeqList *)malloc(sizeof(SeqList)); //分配空间printf("请输入顺序表中的整数,元素个数为%d\n",size);for(i=0;i<size;i++)scanf("%d",&list->data[i]) ; //逐一向顺序表中输入元素 list->length=size; //顺序表的长度赋值return list;}//打印顺序表中的现有元素printList(SeqList *list){int i;printf("\n目前顺序表中有%d个元素\n", list->length);printf("这些元素分别是:\n");for(i=0;i<list->length;i++)printf("%d ",list->data[i]); //依次打印输出顺序表中的元素printf("\n");}//在顺序表中查找值为e的元素,并返回它在表中的位置Int locate(SeqList *list, int e){int i=0;while(i<list->length && list->data[i]!=e)i++ ; //依次比较顺序表中各个元素if(i<list->length) return i+1; //找到元素的处理else printf("找不到元素!\n",); //未找到元素的处理}//在表中第i个元素之前插入新元素einsert(SeqList *list, int i , int e){int j;if (i<1 || i>list->length+1 ) //检查插入位置的合法性printf("插入位置非法!不能插入\n!");else if (list->length==MAX)printf("表满,不能插入!\n"); //检查表空满情况 else {for(j=list->length-1;j>=i-1;j--)list->data[j+1]=list->data[j];//从第n个元素开始到第i个元素依次向后移动一个位置 list->data[i-1]=e; //新元素e插入i位置list->length++; //表长加1}}//删除表中第i个元素delete(SeqList *list, int i){int j;if (i<1 || i>list->length ) printf("删除位置非法!不能删除!\n");//检查删除位置的合法性else if (list->length==0) printf("表空,不能删除!\n");//检查表空满情况else{for(j=i;j<=list->length;j++)list->data[j-1]=list->data[j];//从第i个元素开始到第n个元素依次向前移动一个位置 list->length--; //表长减1}}单链表的基本运算实现以下算法都是带头结点的算法;假设表中数据元素的值为整数;//链表结点结构定义typedef struct node{int data; //存放表结点值struct node *next; //存放表结点的直接后驱元素的地址} ListNode,*LinkList;//头插法创建初始链表LinkList create_h(int size){LinkList head,p;int i;head=(LinkList)malloc(sizeof(ListNode));//申请头结点的存储空间 head->next=Null;//头结点的next域为Nullprintf("请输入这%d个元素的值:\n",size);for(i=0;i<size;i++) //将新增结点插入头结点之后{p=(LinkList)malloc(sizeof(ListNode));scanf("%d",&p->data);p->next=head->next;head->next=p;}return head;}//尾插法创建初始链表LinkList create_t(int size){LinkList head,p,r;int i;head=(LinkList)malloc(sizeof(ListNode)); //申请头结点的存储空间 head->next=Null; //头结点的next域为Nullr=head;//尾指针指向头结点printf("请输入这%d个元素的值:\n",size);for(i=0;i<size;i++) //将新增结点插入到表尾{p=(LinkList)malloc(sizeof(ListNode));scanf("%d",&p->data);p->next=Null;r->next=p;r=p;//尾指针指向新增结点} return head; }//求链表的长度int length(LinkList head){LinkList p;int i;p=head->next;//工作指针指向表中第一个结点i=0;//计数器置0while(p!=Null){i++;//计数器计数p=p->next;//工作指针后移到下一个结点}return i;}//打印链表中的现有元素printList(LinkList head){LinkList p;p=head->next;//工作指针指向表中第一个结点while(p!=Null){printf("%d ",p->data);//打印当前指针所指结点的值p=p->next;//工作指针后移到下一个结点}}//按位查找元素DataType get(LinkList head ,int i){LinkList p;int j;p=head->next; //工作指针指向表中第一个结点j=1; //计数器置1while(p!=Null && j<i)//定位第i个结点{p=p->next;j++;}if(p!=Null && j==i) return p->data;//查找成功,p指向第i个结点,返回第i个结点值else return Null;//i值非法,查找失败}//按值查找元素LinkList locate(LinkList head,int x){LinkList p;p=head->next;while(p!=Null && p->data!=x)p=p->next;if (p!=Null && p->data==x){printf("找到该元素!”);return p;}else{printf("找不到该元素!\n");return Null;}}//在链表中第i个元素前插入新元素insert(LinkList head,int i,int x){LinkList p,s;int j;p=head;//工作指针指向头结点,方便在第1个结点之前插入新元素j=0;//计数器置0while(p!=Null && j<i-1)//将p指针定位到第i个结点的直接前驱接点上{p=p->next;j++;}if (p!=Null && j==i-1)//定位成功{s=(LinkList)malloc(sizeof(ListNode));//申请新结点存储空间s->data=x;s->next=p->next;//新结点插入p->next=s;//新结点插入}Else//插入位置非法printf("插入位置非法!\n");}//在链表中删除第i个结点元素delete(LinkList head,int i){LinkList p,q;int j;p=head; //工作指针指向头结点j=0; //计数器置0while(p->next!=Null && j<i-1)//将p指针定位到第i个结点的直接前驱接点上;{p=p->next;j++;}if(p->next!=Null && j==i-1){q=p->next;//q指向要被删除的结点p->next=q->next;//删除结点free(q);//释放已被删除结点的存储空间}elseprintf("空表或删除位置不合法!\n"); }。
顺序表
顺序表1.顺序表的定义(1) 顺序存储方法即把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法。
(2) 顺序表(Sequential List)用顺序存储方法存储的线性表简称为顺序表(Sequential List)。
2.结点ai 的存储地址不失一般性,设线性表中所有结点的类型相同,则每个结点所占用存储空间大小亦相同。
假设表中每个结点占用c个存储单元,其中第一个单元的存储地址则是该结点的存储地址,并设表中开始结点a1的存储地址(简称为基地址)是LOC(a1),那么结点ai的存储地址LOC(ai)可通过下式计算:LOC(ai)= LOC(a1)+(i-1)*c 1≤i≤n注意:在顺序表中,每个结点ai的存储地址是该结点在表中的位置i的线性函数。
只要知道基地址和每个结点的大小,就可在相同时间内求出任一结点的存储地址。
是一种随机存取结构。
3.顺序表类型定义#define ListSize 100 //表空间的大小可根据实际需要而定,这里假设为100typedef int DataType; //DataType的类型可根据实际情况而定,这里假设为inttypedef struct {DataType data[ListSize];//向量data用于存放表结点int length;//当前的表长度}SeqList;注意:①用向量这种顺序存储的数组类型存储线性表的元素外,顺序表还应该用一个变量来表示线性表的长度属性,因此用结构类型来定义顺序表类型。
②存放线性表结点的向量空间的大小ListSize应仔细选值,使其既能满足表结点的数目动态增加的需求,又不致于预先定义过大而浪费存储空间。
③由于C语言中向量的下标从0开始,所以若L是SeqList类型的顺序表,则线性表的开始结点a1和终端结点an分别存储在L.data[0]和L.Data[L.length-1]中。
④若L是SeqList类型的指针变量,则a1和an分别存储在L->data[0]和L->data[L->length-1]中。
C语言顺序表基本函数
if(L->data[i]==x)
return i;
i++;
}
printf("顺序表中不存在此数据!\n");
return -2;
if(!(*L).elem) return OVERFLOW;
(*L).length=LIST_SEQLIST_INIT_SIZE;
(*L).last=0;
return OK;
}
int Initlist_Seqlist_2(Seqlist *L)
/*初始化链表:1.先决条件:初始化结构体数据;2.函数作用:删除已有链表,
break;
case 2:printf("请输入数据:");
scanf("%d",&e);
status=Increase_Seqlist(&L,e);
if(status==OK)
printf("成功增加数据!\n");
else if(status==OVERFLOW)
printf("申请空间失败,所有数据丢失!\n");
scanf("%d%d",&i,&k);
getchar();
if(i<1||i>(*L).last)
{
printf("删除起点越界!\n");
return ERROR;
}
if(k<0)
{
printf("删除个数有误!\n");
return ERROR;
}
if(i+k-1>(*L).last)
{
顺序表——精选推荐
顺序表1.顺序表的定义顺序表是线性表的顺序表⽰,即⽤⼀组地址连续的存储单元依次存储线性表的数据元素。
2.顺序表的存储结构为了使顺序表的空间分配尽可能不受限制,这⾥先让顺序表的初始化容量为8,当空间不⾜时再对容量进⾏扩展,每次容量的增量为3。
#define SEQLIST_INIT_SIZE 8 //初始化⼤⼩#define INC_SIZE 3 //空间的增量typedef int ElemType; //元素类型typedef struct SeqList{ElemType *base; //指向顺序表开辟的基准空间int capacity; //容量int size; //表的长度(⼤⼩)}SeqList;3.顺序表的常⽤操作1.初始化//顺序表的初始化void InitSeqList(SeqList *list){list->base = (ElemType *)malloc(sizeof(ElemType) * SEQLIST_INIT_SIZE);assert(list->base != NULL);list->capacity = SEQLIST_INIT_SIZE;list->size = 0;}2.容量扩展//空间不⾜,重新开辟bool Inc(SeqList *list){ElemType *newbase = (ElemType*)realloc(list->base,sizeof(ElemType)*(list->capacity+INC_SIZE));//空间开辟是否失败?if(newbase == NULL){printf("增配空间失败,内存不⾜.\n");return false;}list->base = newbase;list->capacity += INC_SIZE;return true;}3.尾插//在顺序表尾部插⼊数据void push_back(SeqList *list, ElemType x){//判断顺序表空间是否满且增加空间是否失败?if(list->size >= list->capacity && !Inc(list)){printf("顺序表空间已满,%d不能尾部插⼊数据.\n",x);return;}//数据尾插list->base[list->size] = x; //size的⼤⼩就是尾部插⼊时数组的下标list->size++;}4.头插//在顺序表头部插⼊数据printf("顺序表空间已满,%d不能头部插⼊数据.\n",x);return;}//将顺序表数据后移for(int i=list->size; i>0; --i){list->base[i] = list->base[i-1];}//数据头插list->base[0] = x;list->size++;}5.存储数据显⽰//显⽰顺序表内的数据void show_list(SeqList *list){for(int i=0; i<list->size; ++i){printf("%d ",list->base[i]);}printf("\n");}6.尾删//删除顺序表尾部数据void pop_back(SeqList *list){//判断顺序表是否为空?if(list->size == 0){printf("顺序表已空,不能尾部删除数据.\n");return;}//将size值减1,来达到删除的⽬的list->size--;}7.头删//删除顺序表头部数据void pop_front(SeqList *list){//判断表是否为空?if(list->size == 0){printf("顺序表已空,不能尾部删除数据.\n");return;}//将顺序表中的数据前移⼀位(第⼀个数据除外)for(int i=0; i<list->size-1; ++i){list->base[i] = list->base[i+1];}//将size值减1,来达到删除的⽬的list->size--;}8.按位置插⼊数据//按位置插⼊数据void insert_pos(SeqList *list, int pos, ElemType x){//判断位置是否合法?if(pos<0 || pos>list->size)//判断顺序表空间是否满且增加空间是否失败?if(list->size >= list->capacity && !Inc(list)){printf("顺序表空间已满,%d不能按位置插⼊数据.\n",x);return;}//将该位置及其之后的数据都向后移动⼀位for(int i=list->size; i>pos; --i){list->base[i] = list->base[i-1];}//将数据插⼊list->base[pos] = x;list->size++;}9.查找数据假定顺序表内的数据唯⼀。
实验03讲评、参考答案_顺序表SeqList的定义(2学时,2章)
实验03讲评、参考答案讲评未交实验报告的同学名单批改情况:普遍完成得不理想,原因:理论课还没讲到;课前没有充分准备。
专业实验课与基础实验课不同,实验内容量大,思考的问题多,需课前充分准备,尽量在课中解决难题。
即专业实验内容首先要把它当做安排的作业,先完成程序的编写,在课堂上调试程序,解决上机遇到的问题,可以与同学或指导老师交流。
题1:其中input函数需要修改。
用reSize函数解决空间不足,不使程序中断执行;注意数据成员data, last, maxSize是相互关联的,如果不一致,将导致错误。
题2:其中的=重载需要修改。
加上delete[]data;是细节,编程序千万要注意细节,这是经验,要理解return *this;题3:其中Insert函数需要修改,用reSize函数解决空间不足,不使程序中断执行。
题5:只有个别同学做。
是顺序表的应用题。
注意:在后续的实验中,书上有些程序可直接使用,有些程序需要修改后才能使用,要多思考,程序中不能有漏洞,编写程序的都有这个体验。
附参考答案:数据结构与算法实验王平实验03 顺序表SeqList的定义(2学时)(第02章线性表,第46~,52页)1. 基本成员函数(验证实验)1. 理解模板类。
2. 理解指针及NULL。
3. 理解cerr和exit(1)的使用。
4. 理解语句:const int defaultSize=100;术语:SeqList类,顺序表,改变数组空间大小函数,输入函数,输出函数,模板类,指针及NULL,cerr,exit,const int defaultSize=100下面是顺序表SeqList模板类的定义,有5个函数待实现,放在一个头文件(.h)中。
//顺序表的类//文件名:p046_SeqList.h#ifndef SEQLIST_H#define SEQLIST_H#include<iostream>#include<stdlib.h>//使用exit(1)using namespace std;const int defaultSize=100;template<class T>class SeqList{protected:T* data;//存放数组(Ⅰ) 完成以上程序,并给出要求的5个成员函数的实现。
C#数据结构之顺序表(SeqList)实例详解
C#数据结构之顺序表(SeqList)实例详解本⽂实例讲述了C#数据结构之顺序表(SeqList)实现⽅法。
分享给⼤家供⼤家参考,具体如下:线性结构(Linear Stucture)是数据结构(Data Structure)中最基本的结构,其特征⽤图形表⽰如下:即:每个元素前⾯有且只有⼀个元素(称为“前驱”),同样后⾯有且只有⼀个元素(称为"后继")--注:起始元素的前驱认为是空,末尾元素的后继认为也是空,这样在概念上就不冲突了。
线性表(List)是线性结构的⼀种典型实现,它⼜可以分为:顺序表(SeqList)和链表(LinkList)⼆⼤类.顺序表(SeqList)的基本特征为:元素在内部存储时是⼀个接⼀个在存储单元中按顺序存储的,所以只要知道"起始元素的存储地址"--称为顺序表的基地址(Base Address)以及顺序表中任何元素的位置(即它是第⼏个元素),就能直接定位到该元素的地址,从⽽直接访问到该元素的值。
也就是说存储/读取每个元素所⽤的时间是相同的,即所谓的“随机存取”C#语⾔中数组(Array)在内存中占⽤的就是⼀组连续的存储区域,所以⽤数组来实现顺序表再适⽤不过。
先来定义线性表的通⽤接⼝IListDS.cs(注:DS为DataStructure的缩写)namespace 线性表{public interface IListDS<T>{//取得线性表的实际元素个数int Count();//清空线性表void Clear();//判断线性表是否为空bool IsEmpty();//(在末端)追加元素void Append(T item);//在位置i“前⾯”插⼊元素itemvoid InsertBefore(T item, int i);//在位置i“后⾯”插⼊元素itemvoid InsertAfter(T item, int i);//删除索引i处的元素T RemoveAt(int i);//获得索引位置i处的元素T GetItemAt(int i);//返回元素value的索引int IndexOf(T value);//反转线性表的所有元素void Reverse();}}顺序表(SeqList)的实现:using System;using System.Text;namespace 线性表{/// <summary>/// 顺序表/// </summary>/// <typeparam name="T"></typeparam>public class SeqList<T> : IListDS<T>{private int maxsize;private T[] data;private int last;//类索引器public T this[int index]{get{return this.GetItemAt(index);}set{if (index < 0 || index > last + 1)Console.WriteLine("Position is error");return;}data[index] = value;}}//最后⼀个元素的下标public int Last{get { return last; }}//最⼤容量public int Maxsize{get { return this.maxsize; }set { this.maxsize = value; }}//构造函数public SeqList(int size){data = new T[size];maxsize = size;last = -1;}//返回链表的实际长度public int Count(){return last + 1;}//清空public void Clear(){last = -1;}//是否空public bool IsEmpty(){return last == -1;}//是否满public bool IsFull(){return last == maxsize - 1;}//(在最后位置)追加元素public void Append(T item){if (IsFull()){Console.WriteLine("List is full");return;}data[++last] = item;}/// <summary>///前插/// </summary>/// <param name="item">要插⼊的元素</param> /// <param name="i">要插⼊的位置索引</param> public void InsertBefore(T item, int i){if (IsFull()){Console.WriteLine("List is full");return;}if (i < 0 || i > last + 1){Console.WriteLine("Position is error");return;}if (i == last + 1){data[last + 1] = item;}{//位置i及i以后的元素,全部后移for (int j = last; j >= i; j--){data[j + 1] = data[j];}data[i] = item;}++last;}/// <summary>/// 后插/// </summary>/// <param name="item"></param>/// <param name="i"></param>public void InsertAfter(T item, int i){if (IsFull()){Console.WriteLine("List is full");return;}if (i < 0 || i > last){Console.WriteLine("Position is error");return;}if (i == last){data[last + 1] = item;}else{//位置i以后的元素(不含位置i),全部后移for (int j = last; j > i; j--){data[j + 1] = data[j];}data[i+1] = item;}++last;}/// <summary>/// 删除元素/// </summary>/// <param name="i">要删除的元素索引</param> /// <returns></returns>public T RemoveAt(int i){T tmp = default(T);if (IsEmpty()){Console.WriteLine("List is empty");return tmp;}if (i < 0 || i > last){Console.WriteLine("Position is error!");return tmp;}if (i == last){tmp = data[last];}else{tmp = data[i];//位置i以及i以后的元素前移for (int j = i; j <= last; j++){data[j] = data[j + 1];}}--last;return tmp;}/// <summary>/// 获取第⼏个位置的元素/// </summary>/// <param name="i">第⼏个位置</param>/// <returns></returns>public T GetItemAt(int i){if (IsEmpty() || (i < 0) || (i > last)){Console.WriteLine("List is empty or Position is error!"); return default(T);}return data[i];}/// <summary>/// 定位元素的下标索引/// </summary>/// <param name="value"></param>/// <returns></returns>public int IndexOf(T value){if (IsEmpty()){Console.WriteLine("List is Empty!");return -1;}int i = 0;for (i = 0; i <= last; i++){if (value.Equals(data[i])){break;}}if (i > last){return -1;}return i;}/// <summary>/// 元素反转/// </summary>public void Reverse(){T tmp = default(T);for (int i = 0; i <= last / 2; i++){tmp = data[i];data[i] = data[last-i];data[last-i] = tmp;}}public override string ToString(){StringBuilder sb = new StringBuilder();for (int i = 0; i <= last; i++){sb.Append(data[i].ToString() + ",");}return sb.ToString().TrimEnd(',');}}}测试代码⽚段:Console.WriteLine("顺序表测试开始...");SeqList<string> seq = new SeqList<string>(10);seq.Append("x");seq.InsertBefore("w", 0);seq.InsertBefore("v", 0);seq.Append("y");seq.InsertBefore("z", seq.Count());Console.WriteLine(seq.Count());//5Console.WriteLine(seq.ToString());//v,w,x,y,zConsole.WriteLine(seq[1]);//wConsole.WriteLine(seq[0]);//vConsole.WriteLine(seq[4]);//zConsole.WriteLine(seq.IndexOf("z"));//4Console.WriteLine(seq.RemoveAt(2));//xConsole.WriteLine(seq.ToString());//v,w,y,zseq.InsertBefore("x", 2);Console.WriteLine(seq.ToString());//v,w,x,y,zConsole.WriteLine(seq.GetItemAt(2));//xseq.Reverse();Console.WriteLine(seq.ToString());//z,y,x,w,vseq.InsertAfter("z_1", 0);seq.InsertAfter("y_1", 2);seq.InsertAfter("v_1", seq.Count()-1);Console.WriteLine(seq.ToString());//z,z_1,y,y_1,x,w,v,v_1顺序表的优点:读取元素时可直接定位,所以在某些操作(⽐如将顺序表元素反转合围)中,不需要完全遍历,循环次数(即时间复杂度)相对完全遍历⽽⾔能减少⼀半。
初始化顺序表代码
初始化顺序表代码顺序表的初始化是指在内存中为顺序表分配一定大小的存储空间,并将其初始状态设置为一个空表。
在C语言中,我们可以使用静态数组或动态数组来实现顺序表。
下面分别介绍这两种方法的初始化代码。
1. 使用静态数组初始化顺序表静态数组是在编译时就确定了大小的数组,它的大小是固定的。
我们可以通过定义一个具有固定大小的数组来实现顺序表的初始化。
```c#define MAX_SIZE 100 // 定义顺序表的最大容量typedef struct {int data[MAX_SIZE]; // 用数组存储顺序表的元素int length; // 顺序表的当前长度} SeqList;```上面的代码定义了一个SeqList结构体,其中data数组用来存储顺序表的元素,length表示顺序表的当前长度。
接下来我们可以编写初始化函数来初始化顺序表。
```cvoid init(SeqList *list) {list->length = 0; // 将顺序表的长度初始化为0}```在初始化函数中,我们将顺序表的长度初始化为0,表示顺序表为空表。
通过这种方式,我们就完成了静态数组的顺序表的初始化。
2. 使用动态数组初始化顺序表动态数组是在程序运行时根据需要动态分配内存空间的数组。
我们可以使用malloc函数来动态分配一块连续的内存空间,然后将其作为顺序表的存储空间。
```ctypedef struct {int *data; // 用指针存储顺序表的元素int length; // 顺序表的当前长度int maxSize; // 顺序表的最大容量} SeqList;```上面的代码定义了一个SeqList结构体,其中data指针用来存储顺序表的元素,length表示顺序表的当前长度,maxSize表示顺序表的最大容量。
接下来我们可以编写初始化函数来初始化顺序表。
```cvoid init(SeqList *list, int maxSize) {list->data = (int *)malloc(maxSize * sizeof(int)); // 动态分配存储空间list->length = 0; // 将顺序表的长度初始化为0list->maxSize = maxSize; // 设置顺序表的最大容量}```在初始化函数中,我们首先使用malloc函数动态分配了一块大小为maxSize的内存空间,然后将顺序表的长度初始化为0,最后设置顺序表的最大容量。
实验一.顺序表验证实验
实验一顺序表操作验证一、实验目的⑴掌握线性表的顺序存储结构;⑵验证顺序表及其基本操作的实现;⑶掌握数据结构及算法的程序实现的基本方法。
二、实验内容⑴建立含有若干个元素的顺序表;⑵对已建立的顺序表实现插入、删除、查找等基本操作。
三、设计与编码(a)本实验用到的理论知识首先定义顺序表的数据类型——顺序表类SeqList,包括题目要求的插入、删除、查找等基本操作,为便于查看操作结果,设计一个输出函数依次输出顺序表的元素。
(b)算法设计const int MaxSize=10;template <class T> //定义模板类SeqListclass SeqList{public:SeqList( ){length=0;} //无参构造函数SeqList(T a[ ], int n);//有参构造函数-可编辑修改-void Insert(int i, T x); //在线性表中第i个位置插入值为x的元素T Delete(int i); //删除线性表的第i个元素int Locate(T x ); //按值查找,求线性表中值为x的元素序号void PrintList( ); //遍历线性表,按序号依次输出各元素private:T data[MaxSize]; //存放数据元素的数组int length; //线性表的长度};其次,建立含有n个数据元素的顺序表,即设计构造函数。
算法如下:顺序表有参构造函数SeqListtemplate <class T>SeqList:: SeqList(T a[ ], int n){if (n>MaxSize) throw "参数非法";for (i=0; i<n; i++)data[i]=a[i];length=n;}最后,对建立的顺序表设计插入、删除、查找等基本操作的算法。
⑴插入算法顺序表插入算法Inserttemplate <class T>void SeqList::Insert(int i, T x){if (length>=MaxSize) throw "上溢";if (i<1 | | i>length+1) throw "位置";for (j=length; j>=i; j--)data[j]=data[j-1]; //注意第j个元素存在数组下标为j-1处data[i-1]=x;length++;}-可编辑修改- ⑵删除算法⑶查找算法template <class T>T SeqList::Delete (int i ){if (length==0) throw "下溢";if (i<1 | | i>length ) throw "位置";x=data[i -1];for (j=i; j<length; j++)data[j-1]=data[j];//注意此处j 已经是元素所在的数组下标length--;return x;}顺序表删除算法Deletetemplate <class T>int SeqList::Locate (T x ){for (i=0; i<length; i++)if (data[i]==x ) return i+1; //下标为i 的元素等于x ,返回其序号i+1return 0;//退出循环,说明查找失败}顺序表按值查找算法Locate(c)编码#include<iostream>#include<stdlib.h>using namespace std;const int MaxSize=50;class SeqList{public:SeqList(){length=0;}SeqList(char a[],int n){if(n>MaxSize)throw"参数非法";for(int i=0;i<n;i++)data[i]=a[i];length=n;}~SeqList(){}int Length(){return length;}char Get(int i){if(i<1&&i>length)throw"查找位置非法"; else return data[i-1];}int Locate(char x){for(int i=0;i<length;i++)if(data[i]==x)return i+1;return 0;}void Insert(int i,char x){if(length>=MaxSize)throw"上溢";if(i<1||i>length+1)throw"位置";for(int j=length;j>=i;j--)data[j]=data[j-1];data[i-1]=x;length++;-可编辑修改-}char Delete(int i){if(length==0) throw "下溢";if (i<1||i>length) throw "位置";char x=data[i-1];for (int j=i; j<length; j++)data[j-1]=data[j];length--;return x;}void PrintList(){for(int i=0;i<length;i++)cout<<data[i]<<endl;}private:char data[MaxSize];int length;};void main(){int xh1,xh2,xh3;char x[10],xm1,xm2;cout<<"输入需要记录的数据:"<<endl;for(int i=0;i<10;i++){cin>>x[i];}SeqList studentx(x,10);cout<<"表长为:"<<studentx.Length()<<endl;cout<<"输入数据位置:";cin>>xh1;cout<<"查找的数据为:"<<studentx.Get(xh1)<<endl;cout<<"输入需要查找的数据:";cin>>xm1;cout<<"该数据位置为:"<<studentx.Locate(xm1)<<endl;cout<<"添加数据,输入位置:";cin>>xh2;cout<<"输入数据:";cin>>xm2;-可编辑修改-studentx.Insert(xh2,xm2);cout<<"删除数据,输入位置:";cin>>xh3;cout<<"删除结果为:"<<studentx.Delete(xh3)<<endl;cout<<"输出数据:"<<endl;studentx.PrintList();}五、运行与调试(a)在调试程序的过程中遇到什么问题,是如何解决的?数据类型定义错误,将int改为char解决。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return OK;
}
Status ListTraverse(SqList L,Status(*visit)(ElemType e))
{
int i;
ElemType *p;
p=L.elem;
for(i=0;i<=L.length;i++)
{
int index;
for(index=1;index<=L.length;index++)
{
if(equal(e,L.elem[index]))
return index;
}
return 0;
}
Status PriorElem(SqList L,ElemType cur_e,ElemType *pre_e)
*pc++=*pa++;
else
*pc++=*pb++;
}
while(pa<=pa_last)*pc++=*pa++;
while(pb<=pa_last)*pc++=*pb++;
}
*/
//(p=L->elem+L->length-1;p>q;--p)
for(p=L->elem+L->length;p>q;--p)
*(p+1)=*p;
*q=e;
++(L->length);
return OK;
}
Status ListDelete(SqList *L,int i,ElemType *e)
if(L->length>=L->listsize)
{
if(!(newbase=(ElemType*)realloc(L->elem,L->listsize+LISTINCREMENT*sizeof(ElemType))))
r
L->elem=NULL;
L->length=0;
L->listsize=0;
return OK;
}
Status ListEmpty(SqList L)
{
return L.length=0?TRUE:FALSE;
}
Status GetElem(SqList L,int i,ElemType *e)
#include"SqList.h"
Status equal(ElemType e1,ElemType e2)
{
if(e1==e2)
return TRUE;
else
return FALSE;
}
Status visit(ElemType e)
{
printf("%d",e);
L->listsize=LIST_INIT_SIZE;
return OK;
}
Status ClearList(SqList *L)
{
L->length=0;
return OK;
}
Status DestoryList(SqList *L)
{
if(L->elem!=NULL)
{
int i=0;
for(i=2;i<L.length;i++)
if(cur_e==L.elem[i-1])
{
*pre_e=L.elem[i-2];
return OK;
}
return ERROR;
}
L->elem=newbase;
L->listsize+=LISTINCREMENT;
}
q=&(L->elem[i-1]);
// for(p=(L->elem[L->length-1]);p>q;--p); //错误,顺序表是空的,L->length=0,而L.elem[0-1]导致数组越界
return OK;
}
Status InitList(SqList *L)
{
L->elem=(ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L->elem)
return OVERFLOW;
L->length=0;
Lb_len=Lb.length;
for(i=1;i<=Lb_len;i++)
GetElem(Lb,i,e);
if(!LocateElem(La,e,equal))
ListInsert(La,++La_len,*e);
}
void MergeList(SqList La,SqList Lb,SqList *Lc)
if(!visit(*(p++)))
return ERROR;
return OK;
}
/*
void ListUnion(SqList *La,SqList Lb)
{
ElemType *e=0;
size_t i,La_len,Lb_len;
La_len=La->length;
{
if(i<1||i>L.length)
return FALSE;
*e=L.elem[i-1];
return OK;
}
int LocateElem(SqList L,ElemType e,Status (*compare)(ElemType e1,ElemType e2))
return OK;
}
return ERROR;
}
Status ListInsert(SqList *L,int i,ElemType e)
{
ElemType *p,*q,*newbase;
if(i<1||i>L->length+1)
return ERROR;
{
ElemType *p,*q;
if(i<1||i>L->length)
return ERROR;
p=&(L->elem[i-1]);
*e=*p;
q=L->elem+L->length-1;
for(++p;p<=q;++p)
*(p-1)=*p;
Status NextElem(SqList L,ElemType cur_e,ElemType *next_e)
{
int i=0;
for(i=1;i<L.length-1;i++)
{
if(cur_e==L.elem[i])
*next_e=L.elem[i+1];
{
ElemType *pa,*pb,*pc,*pa_last,*pb_last;
pa=La.elem;
pb=Lb.elem;
Lc->listsize=Lc->length=La.length+Lb.length;
pc=Lc->elem=(ElemType*)malloc(Lc->listsize*sizeof(ElemType))
if(!Lc->elem)
exit(OVERFLOW);
pa_last=La.elem+La.length-1;
pb_last=Lb.elem+Lb.length-1;
while(pa<=pa_last&&pb<=pa_last)
{
if(*pa<=*pb)