数据结构顺序表
数据结构算法经典 -顺序表
insertsort(struct sqlist *p,int n)
{
int i,j;
for(i=2;i<=n;i++)
{
p->sqlist[0]=p->sqlist[i];
j=i-1;
while(j>0 && p->sqlist[0]<p->sqlist[j])
printf("\n");
for(i=1;i<=n;i++)
printf("%d",p->sqlist[i]);
printf("\n");
}
}
display(struct sqlist *p)
{
int j;
if (p->size==0)
printf("此表为空无法显示!");
else
{
for (j=i;j<p->size;j++)
p->sqlist[j]=p->sqlist[j+1];
p->size--;
}
printf("此线性表为:");
for (i=1;i<=p->size;i++)
printf("%d->",p->sqlist[i]);
printf("%d",p->sqlist[j]);
}
}
main()
{
int i,select,a,j;int w;
数据结构实验报告-线性表(顺序表实现)
实验1:线性表(顺序表的实现)一、实验项目名称顺序表基本操作的实现二、实验目的掌握线性表的基本操作在顺序存储结构上的实现。
三、实验基本原理顺序表是由地址连续的的向量实现的,便于实现随机访问。
顺序表进行插入和删除运算时,平均需要移动表中大约一半的数据元素,容量难以扩充四、主要仪器设备及耗材Window 11、Dev-C++5.11五、实验步骤1.导入库和一些预定义:2.定义顺序表:3.初始化:4.插入元素:5.查询元素:6.删除元素:7.销毁顺序表:8.清空顺序表:9.顺序表长度:10.判空:11.定位满足大小关系的元素(默认小于):12.查询前驱:13.查询后继:14.输出顺序表15.归并顺序表16.写测试程序以及主函数对顺序表的每一个操作写一个测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。
实验完整代码:#include <bits/stdc++.h>using namespace std;#define error 0#define overflow -2#define initSize 100#define addSize 10#define compareTo <=typedef int ElemType;struct List{ElemType *elem;int len;int listsize;}L;void init(List &L){L.elem = (ElemType *) malloc(initSize * sizeof(ElemType)); if(!L.elem){cout << "分配内存失败!";exit(overflow);}L.len = 0;L.listsize = initSize;}void destroy(List &L){free(L.elem);L.len = L.listsize = 0;}void clear(List &L){L.len = 0;}bool empty(List L){if(L.len == 0) return true;else return false;}int length(List L){return L.len;}ElemType getElem(List L,int i){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}return L.elem[i - 1];}bool compare(ElemType a,ElemType b) {return a compareTo b;}int locateElem(List L,ElemType e) {for(int i = 0;i < L.len;i++){if(compare(L.elem[i],e))return i;}return -1;}int check1(List L,ElemType e){int idx = -1;for(int i = 0;i < L.len;i++)if(L.elem[i] == e)idx = i;return idx;}bool check2(List L,ElemType e){int idx = -1;for(int i = L.len - 1;i >= 0;i--)if(L.elem[i] == e)idx = i;return idx;}int priorElem(List L,ElemType cur_e,ElemType pre_e[]) {int idx = check1(L,cur_e);if(idx == 0 || idx == -1){string str = "";str = idx == 0 ? "无前驱结点" : "不存在该元素";cout << str;exit(error);}int cnt = 0;for(int i = 1;i < L.len;i++){if(L.elem[i] == cur_e){pre_e[cnt ++] = L.elem[i - 1];}}return cnt;}int nextElem(List L,ElemType cur_e,ElemType next_e[]){int idx = check2(L,cur_e);if(idx == L.len - 1 || idx == - 1){string str = "";str = idx == -1 ? "不存在该元素" : "无后驱结点";cout << str;exit(error);}int cnt = 0;for(int i = 0;i < L.len - 1;i++){if(L.elem[i] == cur_e){next_e[cnt ++] = L.elem[i + 1];}}return cnt;}void insert(List &L,int i,ElemType e){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}if(L.len >= L.listsize){ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize + addSize) * sizeof(ElemType));if(!newbase){cout << "内存分配失败!";exit(overflow);}L.elem = newbase;L.listsize += addSize;for(int j = L.len;j > i - 1;j--)L.elem[j] = L.elem[j - 1];L.elem[i - 1] = e;L.len ++;}void deleteList(List &L,int i,ElemType &e){if(i < 1 || i > L.len + 1){cout << "下标越界!";exit(error);}e = L.elem[i - 1];for(int j = i - 1;j < L.len;j++)L.elem[j] = L.elem[j + 1];L.len --;}void merge(List L,List L2,List &L3){L3.elem = (ElemType *)malloc((L.len + L2.len) * sizeof(ElemType)); L3.len = L.len + L2.len;L3.listsize = initSize;if(!L3.elem){cout << "内存分配异常";exit(overflow);}int i = 0,j = 0,k = 0;while(i < L.len && j < L2.len){if(L.elem[i] <= L2.elem[j])L3.elem[k ++] = L.elem[i ++];else L3.elem[k ++] = L2.elem[j ++];}while(i < L.len)L3.elem[k ++] = L.elem[i ++];while(j < L2.len)L3.elem[k ++] = L2.elem[j ++];}bool visit(List L){if(L.len == 0) return false;for(int i = 0;i < L.len;i++)cout << L.elem[i] << " ";cout << endl;return true;}void listTraverse(List L){if(!visit(L)) return;}void partion(List *L){int a[100000],b[100000],len3 = 0,len2 = 0; memset(a,0,sizeof a);memset(b,0,sizeof b);for(int i = 0;i < L->len;i++){if(L->elem[i] % 2 == 0)b[len2 ++] = L->elem[i];elsea[len3 ++] = L->elem[i];}for(int i = 0;i < len3;i++)L->elem[i] = a[i];for(int i = 0,j = len3;i < len2;i++,j++) L->elem[j] = b[i];cout << "输出顺序表:" << endl;for(int i = 0;i < L->len;i++)cout << L->elem[i] << " ";cout << endl;}//以下是测试函数------------------------------------void test1(List &list){init(list);cout << "初始化完成!" << endl;}void test2(List &list){if(list.listsize == 0)cout << "线性表不存在!" << endl;else{int len;ElemType num;cout << "选择插入的元素数量:" << endl;cin >> len;cout << "依次输入要插入的元素:" << endl;for(int i = 1;i <= len;i++){cin >> num;insert(list,i,num);}cout << "操作成功!" << endl;}}void test3(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{cout << "请输入要返回的元素的下标" << endl;int idx;cin >> idx;cout << "线性表中第" << idx << "个元素是:" << getElem(L,idx) << endl;}}void test4(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{int idx;ElemType num;cout << "请输入要删除的元素在线性表的位置" << endl;cin >> idx;deleteList(L,idx,num);cout << "操作成功!" << endl << "被删除的元素是:" << num << endl; }}void test5(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{destroy(L);cout << "线性表已被销毁" << endl;}}void test6(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{clear(L);cout << "线性表已被清空" << endl;}}void test7(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else cout << "线性表的长度现在是:" << length(L) << endl;}void test8(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else if(empty(L))cout << "线性表现在为空" << endl;else cout << "线性表现在非空" << endl;}void test9(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num;cout << "请输入待判定的元素:" << endl;cin >> num;cout << "第一个与目标元素满足大小关系的元素的位置:" << locateElem(L,num) << endl;}}void test10(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num,num2[initSize / 2];cout << "请输入参照元素:" << endl;cin >> num;int len = priorElem(L,num,num2);cout << num << "的前驱为:" << endl;for(int i = 0;i < len;i++)cout << num2[i] << " ";cout << endl;}}void test11(){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{ElemType num,num2[initSize / 2];cout << "请输入参照元素:" << endl;cin >> num;int len = nextElem(L,num,num2);cout << num << "的后继为:" << endl;for(int i = 0;i < len;i++)cout << num2[i] << " ";cout << endl;}}void test12(List list){if(L.listsize == 0)cout << "线性表不存在!" << endl;else{cout << "输出线性表所有元素:" << endl;listTraverse(list);}}void test13(){if(L.listsize == 0)cout << "初始线性表不存在!" << endl; else{List L2,L3;cout << "初始化一个新线性表" << endl;test1(L2);test2(L2);cout << "归并两个线性表" << endl;merge(L,L2,L3);cout << "归并成功!" << endl;cout << "输出合并后的线性表" << endl;listTraverse(L3);}}void test14(){partion(&L);cout << "奇偶数分区成功!" << endl;}int main(){std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int op = 0;while(op != 15){cout << "-----------------menu--------------------" << endl;cout << "--------------1:初始化------------------" << endl;cout << "--------------2:插入元素----------------" << endl;cout << "--------------3:查询元素----------------" << endl;cout << "--------------4:删除元素----------------" << endl;cout << "--------------5:销毁线性表--------------" << endl;cout << "--------------6:清空线性表--------------" << endl;cout << "--------------7:线性表长度--------------" << endl;cout << "--------------8:线性表是否为空----------" << endl;cout << "--------------9:定位满足大小关系的元素--" << endl;cout << "--------------10:查询前驱---------------" << endl;cout << "--------------11:查询后继---------------" << endl;cout << "--------------12:输出线性表-------------" << endl;cout << "--------------13:归并线性表-------------" << endl;cout << "--------------14:奇偶分区---------------" << endl;cout << "--------------15: 退出测试程序-----------" << endl;cout << "请输入指令编号:" << endl; if(!(cin >> op)){cin.clear();cin.ignore(INT_MAX,'\n');cout << "请输入整数!" << endl;continue;}switch(op){case 1:test1(L);break;case 2:test2(L);break;case 3:test3();break;case 4:test4();break;case 5:test5();break;case 6:test6();break;case 7:test7();break;case 8:test8();break;case 9:test9();break;case 10:test10();break;case 11:test11();break;case 12:test12(L);break;case 13:test13();break;case 14:test14();break;case 15:cout << "测试结束!" << endl;default:cout << "请输入正确的指令编号!" << endl;}}return 0;}六、实验数据及处理结果1.初始化:2.插入元素3.查询元素(返回的是数组下标,下标从0开始)4.删除元素(位置从1开始)5.销毁顺序表6.清空顺序表7.顺序表长度(销毁或清空操作前)8.判空(销毁或清空操作前)9.定位满足大小关系的元素(销毁或清空操作前)说明:这里默认找第一个小于目标元素的位置且下标从0开始,当前顺序表的数据为:1 4 2 510.前驱(销毁或清空操作前)11.后继(销毁或清空操作前)12.输出顺序表(销毁或清空操作前)13.归并顺序表(销毁或清空操作前)七、思考讨论题或体会或对改进实验的建议通过本次实验,我掌握了定义线性表的顺序存储类型,加深了对顺序存储结构的理解,进一步巩固和理解了顺序表的基本操作,如建立、查找、插入和删除等。
codeblock数据结构算法实现-顺序表基本操作
数据结构算法实现-顺序表基本操作序号一、引言二、顺序表的定义三、顺序表的基本操作1.初始化操作2.插入操作3.删除操作4.查找操作四、顺序表的实现五、总结一、引言数据结构是计算机科学中非常重要的一部分,它是计算机存储、组织数据的方式。
而顺序表是其中的一种基本数据结构,它采用一组位置区域连续的存储单元依次存放线性表中的元素。
本文将着重介绍顺序表的基本操作及其算法实现。
二、顺序表的定义顺序表是一种基本的线性表,顺序表中元素的逻辑顺序和物理顺序是一致的。
顺序表的特点是利用一组连续的存储单元依次存放线性表中的元素。
顺序表可以用数组实现,其元素在内存中是连续存储的,可以通过下标直接访问元素。
由于顺序表的存储方式,使得其在查找、插入和删除等操作上具有较好的性能。
三、顺序表的基本操作顺序表的基本操作包括初始化、插入、删除和查找等。
下面分别介绍这些操作的实现方法。
1.初始化操作初始化操作是指将一个空的顺序表初始化为一个具有初始容量的顺序表,并为其分配内存空间。
初始化操作的实现方法主要有两种,一种是静态分配内存空间,另一种是动态分配内存空间。
静态分配内存空间时,需要预先指定顺序表的容量大小,然后在程序中创建一个数组,并为其分配指定大小的内存空间。
动态分配内存空间时,可以根据需要动态创建一个数组,并为其分配内存空间。
下面是一个简单的初始化操作的实现示例:```C代码#define MAXSIZE 100 // 定义顺序表的最大容量typedef struct {ElementType data[MAXSIZE]; // 定义顺序表的元素数组int length; // 定义顺序表的当前长度} SeqList;2.插入操作插入操作是指将一个新元素插入到顺序表的指定位置。
插入操作的实现方法主要包括在指定位置插入元素,同时对其他元素进行后移操作。
下面是一个简单的插入操作的实现示例:```C代码Status Insert(SeqList *L, int i, ElementType e) {if (i < 1 || i > L->length + 1) { // 判断插入位置是否合法return ERROR;}if (L->length >= MAXSIZE) { // 判断顺序表是否已满return ERROR;}for (int j = L->length; j >= i; j--) { // 插入位置及之后的元素后移L->data[j] = L->data[j - 1];}L->data[i - 1] = e; // 插入新元素L->length++; // 顺序表长度加1return OK;}```3.删除操作删除操作是指将顺序表中指定位置的元素删除。
数据结构-顺序表和链表之间优缺点
数据结构-顺序表和链表之间优缺点
1、顺序表存储
原理:将表中元素⼀个个存⼊⼀组连续的存储单元中,这种存储结构是顺序结构。
采⽤顺序存储结构的线性表简称为“ 顺序表”。
优点:简单易⽤使⽤的是联系的内存空间可以借助CPU的缓存机制预读取数组中的数据所以访问效率⽐较⾼
缺点:1.插⼊和删除⽐较慢
2.不可以增长长度
3:如果申请的过⼤系统可能没有⾜够的内存空间给分配,会导致内存不⾜,如果声明过⼩就会导致不够⽤如果不够⽤只能申请⼀个更⼤的空间还要把原数组的数据copy 过去影响效率
⽐如:插⼊或者删除⼀个元素时,整个表需要遍历移动元素来重新排⼀次顺序 C# 中如 ArrayList List 等
2、链式表存储
原理:链表存储是在程序运⾏过程中动态的分配空间,只要存储器还有空间,就不会发⽣存储溢出问题
优点:插⼊和删除速度快,保留原有的物理顺序
缺点:查找速度慢,因为查找时,需要循环链表访问并且链式存储在内存中不连续这样对CPU的缓存不友好没办法做到预先读取链表除了要存储本⾝数据外还要额外维护前后节点的指针,对内存要求的严格的程序是不友好的~⽽且链表频繁的删除和新增会导致内存也频繁的申请释放容易产⽣内存碎⽚导致GC 频繁的去回收
⽐如:插⼊或者删除⼀个元素时,只需要改变指针指向即可 C# 中 LinkedList<T>
总结在实际开发中我们还是要权衡⾃⼰的使⽤场景来决定使⽤什么样的数据结构。
chap2数据结构,顺序表,树,图,链表,排序
2.4 一元多项式的表示
ADT List { 数据对象: D={ ai | ai ∈ElemSet, i=1,2,...,n, n≥0 } { 称 n 为线性表的表长; 称 n=0 时的线性表为空表。} 数据关系:
R1={ <ai-1 ,ai >|ai-1 ,ai∈D, i=2,...,n }
{ 设线性表为 (a1,a2, . . . ,ai,. . . ,an), 称 i 为 ai 在线性表中的位序。}
i = 1; found = TRUE; while ( i<= La_len && found ) {
GetElem(LA, i, e); // 取得LA中一个元素
if (LocateElem(LB, e, equal( ))
i++;
// 依次处理下一个
else found = FALSE;
// LB中没有和该元素相同的元素
{加工型操作} ClearList( &L ) ( 线性表置空 ) PutElem( &L, i, &e ) ( 改变数据元素的值 ) ListInsert( &L, i, e ) ( 插入数据元素 ) ListDelete( &L, i, &e ) ( 删除数据元素 )
ClearList( &L ) 初始条件:线性表 L 已存在。 操作结果:将 L 重置为空表。 PutElem( &L, i, e ) 初始条件: 线性表 L 已存在, 且 1≤i≤LengthList(L)。 操作结果:L 中第 i 个元素赋值和 e 相同。
线性结构的基本特征: 线性结构 是 一个数据元素的有序(次序)集 1.集合中必存在唯一的一个“第一元素” 2.集合中必存在唯一的一个 “最后元素”
数据结构实验一顺序表
数据结构实验一1、实验目的∙掌握线性表的逻辑特征∙掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算2、实验内容:建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:∙创建一个新的顺序表,实现动态空间分配的初始化;∙根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;∙根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);∙利用最少的空间实现顺序表元素的逆转;∙实现顺序表的各个元素的输出;∙彻底销毁顺序线性表,回收所分配的空间;∙对顺序线性表的所有元素删除,置为空表;∙返回其数据元素个数;∙按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;∙按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;∙判断顺序表中是否有元素存在,对判断结果进行返回;.编写主程序,实现对各不同的算法调用。
2.实现要求:∙“初始化算法”的操作结果:构造一个空的顺序线性表。
对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;∙“位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;∙“位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;∙“逆转算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;∙“输出算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行输出;∙“销毁算法”初始条件:顺序线性表L 已存在;操作结果:销毁顺序线性表L;∙“置空表算法”初始条件:顺序线性表L 已存在;操作结果:将L 重置为空表;∙“求表长算法”初始条件:顺序线性表L 已存在;操作结果:返回L 中数据元素个数;∙“按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:返回L 中第i 个数据元素的值∙“按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;操作结果:返回L 中数据元素值为e 的元素位置;∙“判表空算法”初始条件:顺序线性表L 已存在;操作结果:若L 为空表,则返回TRUE,否则返回FALSE;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
顺序表类型定义
顺序表类型定义
顺序表类型定义是一种数据结构,由相同类型的元素连续存储在内存中形成一个逻辑上有序的序列。
顺序表又称为线性表,它是一种可以容纳任意类型的数据的数据结构,也是计算机中最常用的数据结构之一。
顺序表的特点是:存储方式简单,因为它只需要连续的内存单元就可以存储元素;查找快,因为它具有索引,可以快速查找到需要的元素;插入和删除方便,因为顺序表本身就是一个有序的结构,只需要移动一小部分元素就可以实现插入和删除;可以随机访问,因为它具有索引,可以根据索引快速访问到指定位置的元素。
顺序表的缺点是:容量有限,因为它需要连续的内存空间,如果存储的元素太多,就会导致内存空间不够用;插入和删除效率较低,因为顺序表本身是一个有序的结构,插入和删除时需要移动大量的元素,所以效率较低。
顺序表在程序设计中有着广泛的应用,它可以用来存储数据、实现算法、实现抽象数据类型(ADT)等。
在算法设计中,顺序表可以用来实现查找、排序、插入、删除等常见的算法;在数据结构设计中,顺序表可以用来实现栈、队列、双端队列等复杂的数据结构;在ADT设计中,顺序表可以用来实现字符串、集合、图等常见的ADT。
总之,顺序表类型定义是一种简单易用的数据结构,它可以用来实现各种常见的算法和数据结构,而且可以满足大多数应用场景的需求。
顺序表的建立与基本算法
顺序表的建立与基本算法
顺序表是数据结构中最基本、最常见的存储结构。
它是一组在一起的有组织地存储在内存中的相关数据项,以便快速访问和修改。
顺序表的建立与基本算法主要包括以下几点:
一、建立顺序表
1.定义存储空间大小:首先要确定存储空间大小,根据实际情况来确定。
2.申请内存空间:将需要的内存空间分配给顺序表,用于存放后面的数据元素。
3.初始化顺序表:将顺序表的长度初始化为0,表示此时顺序表是空表,然后给顺序表的数据元素赋初值,例如-1、0、NULL等。
4.插入数据元素:在指定位置插入数据元素到顺序表上。
5.释放内存空间:当顺序表使用完毕,需要释放顺序表所申请的内存空间,回收内存。
二、顺序表的基本算法
1.查找算法:在顺序表中查找特定的数据元素,通过遍历顺序表的方式来查找,可以通过比较元素的特征值来区分,查找的时间复杂度为O(n)。
2.插入算法:在顺序表中插入数据元素,需要先判断顺序表是否已满,如果未满则在指定位置插入数据元素,需要将插入位置后面的元素都后移一个位置,插入的时间复杂度为O(n)。
3.删除算法:在顺序表中删除数据元素,需要先判断顺序表是否为空,如果非空则在指定位置删除数据元素,需要将删除位置后面的元素都前移一个位置,删除的时间复杂度为O(n)。
4.更新算法:更新顺序表中的数据元素,需要先查找到特定的元素,然后根据需要更新数据元素,更新的时间复杂度也是O(n)。
总的来说,顺序表的建立与基本算法包括建立顺序表,查找算法,插入算法,删除算法,更新算法等几个方面,都要结合实际情况具体
操作,时间复杂度都是O(n)。
数据结构中顺序表的基本操作
数据结构中顺序表的基本操作
顺序表是一种线性表的存储结构,使用一组连续的存储单元来存储元素,其基本操作包括:
1. 初始化:创建一个空顺序表,设置其长度为0。
2. 插入元素:在顺序表的指定位置插入一个元素,需要将插入位置之后的元素依次向后移动,然后将新元素放入插入位置,并更新顺序表的长度。
3. 删除元素:删除顺序表中的指定位置的元素,需要将删除位置之后的元素依次向前移动,然后更新顺序表的长度。
4. 查找元素:根据元素的值,查找顺序表中第一个与该值相等的元素,并返回其位置。
如果不存在,则返回-1。
5. 获取元素:根据位置,返回顺序表中指定位置的元素。
6. 修改元素:根据位置,修改顺序表中指定位置的元素。
7. 清空顺序表:将顺序表的长度设置为0,即清空元素。
这些基本操作可以根据具体需求进行使用和扩展。
数据结构-顺序表-实验报告
实验报告课程数据结构及算法实验项目 1.顺序表的建立和基本运算成绩专业班级*** 指导教师***姓名*** 学号*** 实验日期***实验一顺序表的建立和基本运算一、实验目的1、掌握顺序表存储结构的定义及C/C++语言实现2、掌握顺序表的各种基本操作及C/C++语言实现3、设计并实现有序表的遍历、插入、删除等常规算法二、实验环境PC微机,Windows,DOS,Turbo C或者Visual C++三、实验内容1、顺序表的建立和基本运算(1)问题描述顺序表时常进行的运算包括:创建顺序表、销毁顺序表、求顺序表的长度、在顺序表中查找某个数据元素、在某个位置插入一个新数据元素、在顺序表中删除某个数据元素等操作。
试编程实现顺序表的这些基本运算。
(2)基本要求实现顺序表的每一个运算要求用一个函数实现。
(3)算法描述参见教材算法2.3、算法2.4、算法2.5等顺序表的常规算法。
(4)算法实现#include<malloc.h> // malloc()等#include<stdio.h> // NULL, printf()等#include<process.h> // exit()// 函数结果状态代码#define OVERFLOW -2#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等typedef int Boolean; // Boolean是布尔类型,其值是TRUE或者FALSE//-------- 线性表的动态分配顺序存储结构-----------#define LIST_INIT_SIZE 10 // 线性表存储空间的初始分配量#define LIST_INCREMENT 2 // 线性表存储空间的分配增量typedef int ElemType;struct SqList{ElemType *elem; // 存储空间基址int length; // 当前长度int listsize; // 当前分配的存储容量(以sizeof(int)为单位)};void InitList(SqList &L) // 算法2.3{ // 操作结果:构造一个空的顺序线性表LL.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)exit(OVERFLOW); // 存储分配失败L.length=0; // 空表长度为0L.listsize=LIST_INIT_SIZE; // 初始存储容量}void DestroyList(SqList &L){ // 初始条件:顺序线性表L已存在。
【数据结构】线性表顺序表详解和代码实例
【数据结构】线性表顺序表详解和代码实例线性表(List)是零个或者多个数据元素的有限序列.⾸先它是⼀个序列.⾥⾯的元素是有顺序的,如果有多个元素,除开头和结尾以外的元素都有⼀个前驱和⼀个后继.⽽开头元素只有后继,结尾元素只有前驱.其次线性表是有限的,也就是⾥⾯的元素个数是有限的。
1ADT 线性表(List)2Data3线性表的数据对象集合为{a1, a2, a3, ......, an},每个元素类型为DataType。
4Operation5InitList(L); //初始化线性表6 IsEmptyList(L); //判断线性表是否为空7 ClearList(L); //清空线性表8 GetElemList(L, i, *e); //获取第i个位置的数据9 SearchList(L, e); //查找与数据e相等的元素10 InsertNodeList(L, i, e);//在第i个位置插⼊元素11 DeleteNodeList(L, i, *e);//删除第i个位置的元素,e获取删除元素12 GetLengthList(L); //获取线性表的长度13endADT关于线性表的基本操作就上⾯⼏种,还有⼏个例如线性表的排序,合并,逆序等等操作。
为了⽂章篇幅,就下次再介绍了。
线性表的顺序存储结构,就是指 ⽤⼀段地址连续的存储单元⼀次存储线性表的数据元素。
学过⾼级语⾔的朋友,相信对数组这玩意⼉都不会陌⽣吧。
数组就是⼀种顺序存储结构。
链式存储结构就是可以⽤⼀组任意的内存单元存储线性表中的元素。
与顺序存储不同的是,这组内存单元可以是连续的,也可以是不连续的。
这就意味着,元素可以存储在内存的任意位置。
正因为如此,在链式结构中,每个元素不仅要存它的信息,还需要存储它后继元素的存储地址。
我们把存储元素信息的域称为数据域,⽽把存储后继元素地址的域称为指针域。
由这两部分共同组成的数据元素ai,则可以称之为节点(Node)。
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顺序表的优点:读取元素时可直接定位,所以在某些操作(⽐如将顺序表元素反转合围)中,不需要完全遍历,循环次数(即时间复杂度)相对完全遍历⽽⾔能减少⼀半。
数据结构实验报告顺序表
数据结构实验报告顺序表(此⽂档为word格式,下载后您可任意编辑修改!)江西理⼯⼤学软件学院计算机类课程实验报告课程名称:数据结构班级:姓名:学号:江西理⼯⼤学软件学院实验⼆:顺序表2012年11⽉10⽇⼀. 实验⽬的掌握顺序表的逻辑结构、存储结构、以及操作。
⼆. 问题描述线性表是由n(n≥0)个元素(结点)a1, a2, …, a n组成的有限序列,其中a i中的i称为该数据元素的位置(序号),n为数据元素的个数(表的长度),当n等于0时称为空表。
按逻辑次序依次把数据元素存放在⼀组连续的地址存储单元⾥的线性表称为顺序表。
在这⾥,我们通过C++中的动态数组来实现顺序表的存放,并通过建⽴顺序表类实现它的各种操作。
三. 实验要求实现顺序表的三个框架操作:随机⽣成,⽤已有顺序表初始化另⼀个顺序表,输⼊顺序表。
以及⼗个基本操作:在第i个元素之前插⼊元素,判断是否为空,求元素个数,取第i个元素,查找第⼀个与e满⾜compare()关系的元素,返回元素的前驱,返回后继,删除第i个元素,把⼀个顺序表赋值给另⼀个顺序表,置空顺序表。
四. 实验环境3323机房OS:WxpC环境:1、TC2.02、VC++ 6.0 五.运⾏结果程序开始界⾯1.随机⽣成顺序表(元素值为0到99之间的整数)2. ⽤已有的顺序表初始化另⼀个顺序表3. 输⼊顺序表基本操作:1.在第i个元素之前插⼊⼀个元素2. 判断顺序表是否为空3. 求顺序表中元素的个数4. 取第i个元素5. 查找第⼀个与之满⾜compare()关系的元素序号6. 返回某元素的前驱7. 返回某元素的后继8. 删除第i个元素9. 把⼀个顺序表复制给另⼀个顺序表10. 把顺序表置空11.顺序表的运⽤六.实验⼼得熟悉最基本的数据类型——顺序表,同时我们让我们熟练C++的基本操作,模板的使⽤,以及模块化的设计思想。
同时也运⽤顺序表做⼀些简单的运⽤,⽐如顺序表的并交差运算,学⽣管理系统等等。
数据结构实验报告-实验一顺序表、单链表基本操作的实现
数据结构实验报告-实验⼀顺序表、单链表基本操作的实现实验⼀顺序表、单链表基本操作的实现l 实验⽬的1、顺序表(1)掌握线性表的基本运算。
(2)掌握顺序存储的概念,学会对顺序存储数据结构进⾏操作。
(3)加深对顺序存储数据结构的理解,逐步培养解决实际问题的编程能⼒。
l 实验内容1、顺序表1、编写线性表基本操作函数:(1)InitList(LIST *L,int ms)初始化线性表;(2)InsertList(LIST *L,int item,int rc)向线性表的指定位置插⼊元素;(3)DeleteList1(LIST *L,int item)删除指定元素值的线性表记录;(4)DeleteList2(LIST *L,int rc)删除指定位置的线性表记录;(5)FindList(LIST *L,int item)查找线性表的元素;(6)OutputList(LIST *L)输出线性表元素;2、调⽤上述函数实现下列操作:(1)初始化线性表;(2)调⽤插⼊函数建⽴⼀个线性表;(3)在线性表中寻找指定的元素;(4)在线性表中删除指定值的元素;(5)在线性表中删除指定位置的元素;(6)遍历并输出线性表;l 实验结果1、顺序表(1)流程图(2)程序运⾏主要结果截图(3)程序源代码#include<stdio.h>#include<stdlib.h>#include<malloc.h>struct LinearList/*定义线性表结构*/{int *list; /*存线性表元素*/int size; /*存线性表长度*/int Maxsize; /*存list数组元素的个数*/};typedef struct LinearList LIST;void InitList(LIST *L,int ms)/*初始化线性表*/{if((L->list=(int*)malloc(ms*sizeof(int)))==NULL){printf("内存申请错误");exit(1);}L->size=0;L->Maxsize=ms;}int InsertList(LIST *L,int item,int rc)/*item记录值;rc插⼊位置*/ {int i;if(L->size==L->Maxsize)/*线性表已满*/return -1;if(rc<0)rc=0;if(rc>L->size)rc=L->size;for(i=L->size-1;i>=rc;i--)/*将线性表元素后移*/L->list[i+=1]=L->list[i];L->list[rc]=item;L->size++;return0;}void OutputList(LIST *L)/*输出线性表元素*/{int i;printf("%d",L->list[i]);printf("\n");}int FindList(LIST *L,int item)/*查找线性元素,返回值>=0为元素的位置,返回-1为没找到*/ {int i;for(i=0;i<L->size;i++)if(item==L->list[i])return i;return -1;}int DeleteList1(LIST *L,int item)/*删除指定元素值得线性表记录,返回值为>=0为删除成功*/ {int i,n;for(i=0;i<L->size;i++)if(item==L->list[i])break;if(i<L->size){for(n=i;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return i;}return -1;}int DeleteList2(LIST *L,int rc)/*删除指定位置的线性表记录*/{int i,n;if(rc<0||rc>=L->size)return -1;for(n=rc;n<L->size-1;n++)L->list[n]=L->list[n+1];L->size--;return0;}int main(){LIST LL;int i,r;printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);while(1){printf("请输⼊元素值,输⼊0结束插⼊操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d",&i);if(i==0)break;printf("请输⼊插⼊位置:");scanf("%d",&r);InsertList(&LL,i,r-1);printf("线性表为:");OutputList(&LL);}while(1){printf("请输⼊查找元素值,输⼊0结束查找操作:");fflush(stdin);/*清空标准输⼊缓冲区*/scanf("%d ",&i);if(i==0)break;r=FindList(&LL,i);if(r<0)printf("没有找到\n");elseprintf("有符合条件的元素,位置为:%d\n",r+1);}while(1){printf("请输⼊删除元素值,输⼊0结束查找操作:");fflush(stdin);/*清楚标准缓存区*/scanf("%d",&i);if(i==0)break;r=DeleteList1(&LL,i);if(i<0)printf("没有找到\n");else{printf("有符合条件的元素,位置为:%d\n线性表为:",r+1);OutputList(&LL);}while(1){printf("请输⼊删除元素位置,输⼊0结束查找操作:");fflush(stdin);/*清楚标准输⼊缓冲区*/scanf("%d",&r);if(r==0)break;i=DeleteList2(&LL,r-1);if(i<0)printf("位置越界\n");else{printf("线性表为:");OutputList(&LL);}}}链表基本操作l 实验⽬的2、链表(1)掌握链表的概念,学会对链表进⾏操作。
数据结构实验报告之链表顺序表的操作
数据结构实验报告之链表顺序表的操作1、编写程序实现顺序表的各种基本运算:初始化、插⼊、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。
在此基础上设计⼀个主程序完成如下功能:(1)初始化顺序表L;(2)依次在表尾插⼊a,b,c,d,e五个元素;(3)输出顺序表L;(4)输出顺序表L的长度;(5)判断顺序表L是否为空;(6)输出顺序表L的第4个元素;(7)输出元素c的位置;(8)在第3个位置上插⼊元素f,之后输出顺序表L;(9)删除L的第2个元素,之后输出顺序表L;(10)销毁顺序表L。
2、编写程序实现单链表的各种基本运算:初始化、插⼊、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。
在此基础上设计⼀个主程序完成如下功能:(1)初始化单链表L;(2)依次在表尾插⼊a,b,c,d,e五个元素;(3)输出单链表L;(4)输出单链表L的长度;(5)判断单链表L是否为空;(6)输出单链表L的第4个元素;(7)输出元素c的位置;(8)在第3个位置上插⼊元素f,之后输出单链表L;(9)删除L的第2个元素,之后输出单链表L;(10)销毁单链表L。
1顺序表2 #include<stdio.h>3 #include<malloc.h>4 #include<stdlib.h>56#define TRUE 17#define FALSE 08#define OK 19#define ERROR 010#define INFEASIBLE -111#define OVERFLOW -212 typedef int Status;13 typedef char ElemType;1415#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量16#define LISTINCREMENT 10 //线性表存储空间的分配增量17 typedef struct {18 ElemType *elem; //存储空间基地址19int length; //当前长度20int listsize; //当前分配的存储容量21 } SqList;2223 Status InitList_Sq(SqList &L) { //算法2.324 L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));25if (!L.elem) exit(OVERFLOW); //存储分配失败26 L.length = 0; //空表长度为027 L.listsize = LIST_INIT_SIZE; //初始存储容量28return OK;29 }//InitList_Sq3031 Status ListInsert_Sq(SqList &L, int i, ElemType e) { //算法2.432 ElemType *newbase, *p, *q;33if (i<1 || i>L.length + 1) return ERROR; //i值不合法34if (L.length >= L.listsize)35 { //当前存储空间已满,增加分配36 newbase = (ElemType*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(ElemType));37if (!newbase) exit(OVERFLOW); //存储分配失败38 L.elem = newbase; //新基址39 L.listsize += LISTINCREMENT; //增加存储容量40 }41 q = &(L.elem[i - 1]); //q为插⼊位置42for (p = &(L.elem[L.length - 1]); p >= q; --p) *(p + 1) = *p; //元素右移43 *q = e; //插⼊e44 ++L.length; //表长增145return OK;46 }4748void DispSqList(SqList L)49 {50int i;51for (i = 0; i < L.length; i++)52 printf("%c ", L.elem[i]);53 }5455 Status ListDelete(SqList &L, int i, ElemType &e)56 {57 ElemType *p,*q;58if ((i < 1) || (i > L.length)) return ERROR;59 p = &(L.elem[i - 1]);60 e = *p;61 q = L.elem + L.length - 1;62for (++p; p <= q; ++p)63 *(p - 1) = *p;64 --L.length;65return OK;66 } //ListDelete_Sq6768 Status GetElem(SqList L, int i, ElemType &e)69 {70if (L.length == 0 || i<1 || i>L.length)71return ERROR;72 e = L.elem[i - 1];73return OK;74 }7576int ListLength(SqList L)77 {78return(L.length);79 }8081 Status DestroyList(SqList &L)82 {83 free(L.elem);84 L.length = 0;85return OK;86 }8788 Status ListEmpty(SqList L)89 {90return(L.length == 0);91 }9293int LocateElem(SqList L, ElemType e)94 {95int i = 0;96while (i < L.length && L.elem[i] != e) i++;97if (i >= L.length) return0;98else return i + 1;99 }100101void main()102 {103 SqList h;104 ElemType e;105 InitList_Sq(h);106 ListInsert_Sq(h, h.length + 1, 'a');107 ListInsert_Sq(h, h.length + 1, 'b');108 ListInsert_Sq(h, h.length + 1, 'c');109 ListInsert_Sq(h, h.length + 1, 'd');110 ListInsert_Sq(h, h.length + 1, 'e');111 DispSqList(h);112 printf("%d\n\n",ListLength(h));113 ListEmpty(h);114if (ListEmpty(h))116 printf("Empty\n\n");117 }118else119 {120 printf("Not empty\n\n");121 }122 GetElem(h, 4, e);123 printf("%c\n", e);124 printf("%d\n",LocateElem(h, 'c'));125 ListInsert_Sq(h,3,' f');126 DispSqList(h);127 ListDelete(h, 2, e);128 DispSqList(h);129 DestroyList(h);130 }131132133134135136单链表137138139140 #include<stdio.h>141 #include<malloc.h>142 #include<stdlib.h>143144#define TRUE 1145#define FALSE 0146#define OK 1147#define ERROR 0148#define INFEASIBLE -1149#define OVERFLOW -2150 typedef int Status;151152 typedef char ElemType;153154155 typedef struct LNode {156 ElemType data;157int length;158struct LNode *next;159 }LNode, *LinkList;160161162 Status InitList_L(LinkList &L) {163 L = (LinkList)malloc(sizeof(LNode));164 L->next = NULL;165return OK;166 }167168 Status ListInsert_L(LinkList L, int i, ElemType e) { 169 LinkList p = L,s;170int j = 0;171while (p && j < i - 1)172 {173 p = p->next;174 ++j;175 }176if (!p || j > i - 1)177 {178return ERROR;179 }180else181 {182 s = (LinkList)malloc(sizeof(LNode));183 s->data = e;184 s->next = p->next;185 p->next = s;186return OK;187 }188 }189190void DispList_L(LinkList L)191 {192 LinkList p = L->next;193while (p != NULL)194 {195 printf("%c\n", p->data);196 p = p->next;197 }198200201void DestoryList(LinkList &L)202 {203 LinkList p = L, q = p->next;204while (q != NULL)205 {206 free(p);207 p = q;208 q = p->next;209 }210 free(p);211 }212213 Status ListLength_L(LinkList L) {214 LinkList p = L; int n = 0;215while (p->next != NULL)216 {217 n++;218 p = p->next;219 }220return (n);221 }222223 Status ListDelete(LinkList L, int i, ElemType &e){ 224int j;225 LinkList p, q;226 p = L;227 j = 1;228while (p->next && j < i)229 {230 p = p->next;231 ++j;232 }233if (!(p->next) || j > i)234 {235return ERROR;236 }237 q = p->next;238 p->next = q->next;239 e = q->data;240 free(q);241return OK;242 }243244 Status ListEmpty_L(LinkList L)245 {246return(L->length == 0);247 }248249 Status GetElem(LinkList L, int i, ElemType &e) 250 {251int j;252 LinkList p;253 p = L->next;254 j = 1;255while (p&&j<i)256 {257 p = p->next;258 ++j;259 }260if (!p || j > i)261 {262return ERROR;263 }264 e = p->data;265return OK;266 }267268 Status LocateElem(LinkList L, int e)269 {270 LinkList p = L;271int n=0;272//p->length = 0;273while (p != NULL)274 {275if(p->data != e)276 {277 p = p->next;278 n++;279 }280else281 {282break;283 }284 }285if(p != NULL)286 {287return n;288 }289else290 {291return ERROR;292 }293 }294295void main()296 {297 LinkList h;298 ElemType e;299 InitList_L(h);300 ListInsert_L(h, 1, 'a');301 ListInsert_L(h, 2, 'b');302 ListInsert_L(h, 3, 'c');303 ListInsert_L(h, 4, 'd');304 ListInsert_L(h, 5, 'e');305 DispList_L(h);306 printf("%d\n", ListLength_L(h)); 307if (ListEmpty_L(h))308 {309 printf("Empty\n\n");310 }311else312 {313 printf("Not empty\n\n");314 }315 GetElem(h, 4, e);316 printf("%c\n", e);317 printf("%d\n", LocateElem(h, 'c')); 318 ListInsert_L(h, 3, 'f');319 DispList_L(h);320 ListDelete(h, 2, e);321 DispList_L(h);322 DestoryList(h);323 }。
数据结构实验一 顺序表的实现
cout <<v.elem[i] <<' '; cout <<endl; }
} default: flag=0; cout <<"程序结束,按任意键退出!" <<endl; } } } //初始化线性表 void initial(seqlist &v) { int i; cout <<"请输入初始线性表长度:n="; cin >>st; cout <<"请输入各元素/字符[中间用空格隔开](例如:a b c d): "; for(i=0;i<st;i++) cin >>&v.elem[i]; } //插入一个元素,成功返回True,失败返回False bool insert (seqlist &v,int loc,char ch) { int i; if((loc<1)||(loc>st+1)) { cout <<"插入位置不合理!" <<endl; //位置错误 return false; } else if(st>=Max) { cout <<"超出线性表最大容量!" <<endl; //溢满 return false; } else { for(i=st-1;i>=loc-1;i--) v.elem[i+1]=v.elem[i]; //插入位置后的元素后移 v.elem[loc-1]=ch; //插入元素 st++; //表长度加1
四、程序的调试及运行结果
五、程序代码
数据结构顺序表课程设计
数据结构顺序表课程设计一、课程目标知识目标:1. 学生能理解顺序表的基本概念,掌握其存储结构和操作方法。
2. 学生能描述顺序表的特点,并与链表等其他数据结构进行对比分析。
3. 学生能掌握顺序表的相关算法,如插入、删除、查找等,并了解其时间复杂度。
技能目标:1. 学生能够运用顺序表解决实际问题,如实现学生信息管理系统等。
2. 学生能够独立编写顺序表的插入、删除、查找等操作的程序代码。
3. 学生能够分析顺序表操作的算法性能,并对其进行优化。
情感态度价值观目标:1. 学生培养对数据结构学习的兴趣,认识到数据结构在实际问题中的重要作用。
2. 学生在学习过程中,培养解决问题的耐心和毅力,提高团队合作能力。
3. 学生能够树立正确的编程观念,注重代码规范和程序优化。
课程性质:本课程为高二年级信息技术课程,属于数据结构章节的内容,旨在让学生掌握顺序表这一基本数据结构。
学生特点:高二年级学生已经具备了一定的编程基础,对数据结构有一定的了解,但可能对顺序表这种线性表结构掌握不深。
教学要求:结合学生特点,注重理论与实践相结合,通过实例分析和实际操作,使学生能够熟练掌握顺序表的操作方法,并培养其编程思维和解决问题的能力。
在教学过程中,关注学生的情感态度,激发学习兴趣,提高学习积极性。
二、教学内容1. 顺序表的基本概念与存储结构- 引入顺序表的定义,比较顺序表与数组、链表的区别。
- 讲解顺序表的内存存储结构,分析其优缺点。
2. 顺序表的操作方法- 介绍顺序表的插入、删除、查找等基本操作。
- 讲解顺序表长度变化时的动态扩容和缩容方法。
3. 顺序表算法分析- 分析顺序表操作的时间复杂度,如插入、删除、查找等操作的时间复杂度。
- 探讨优化顺序表操作算法的方法,如二分查找等。
4. 实践应用与案例分析- 结合实际问题,如学生信息管理系统,讲解如何使用顺序表进行数据管理。
- 分析实际案例,巩固顺序表的操作方法和算法优化。
5. 教学内容安排与进度- 教学内容按照上述四个方面进行安排,共计8个课时。
数据结构实验报告 顺序表基本操作
四、实验步骤
一 1. 编 写 头 文 件 。 定 义 数 据 类 型 。 分 别 写 各 个 函 数 如 ListInsern_Sq , ListDelete_Sq,LocateElem 等函数。 2.编写主函数。 在主函数里构造空的线性表, 然后利用 ListInsert 函数使用户 初始化线性表。然后调用函数操作,操作结果用 PrintList_Sq 打印出线性表的内 容 3.运行程序,完整代码见下:
-4-
else { printf("输入位置有错! \n"); printf("-------------------------------------\n"); }/**/ printf("请输入你要删除的元素的位置:\n");//删除元素 scanf("%d",&i); if(ListDelete_Sq(La,i,e)) { printf("你删除的元素为: %d,删除元素后线性表为:\n",e); PrintList_Sq(La); printf("-------------------------------------\n"); } else { printf("输入位置有错! \n"); printf("-------------------------------------\n"); } printf("请输入你要查找的元素:\n");//查找元素 scanf("%d",&e); if(i=LocateElem_Sq(La,e,cmp)) { printf("你要查找的元素在第 %d 个位置。\n",i); printf("-------------------------------------\n"); } else { printf("找不到这个元素: \n"); printf("-------------------------------------\n"); } if(ClearList_Sq(La))//清空线性表 { printf("线性表已清空。 \n"); printf("--------------------------------------\n"); } else { printf("线性表清空出错。 \n"); printf("--------------------------------------\n"); } if(Destroy_Sq(La))//撤销线性表
数据结构顺序表实验报告
《数据结构》课程实验报告实验名称顺序表实验序号 1 实验日期姓名院系班级学号专业指导教师成绩教师评语一、实验目的和要求(1)理解线形表的逻辑结构特征(2)理解并掌握顺序表(3)了解顺序表的各种基本运算二、实验项目摘要编写一个程序algo2-1.cpp,实现顺序表的各种基本运算,并在此基础上设计一个主程序并完成如下功能:(1)初始化顺序表L;(2)依次采用尾插法插入a,b,c,d,e元素;(3)输出顺序表L;(4)输出顺序表L长度;(5)判断顺序表L是否为空;(6)输出顺序表L的第3个元素;(7)输出元素’a’的位置;(8)在第4个元素位置上插入’f’元素;(9)输出顺序表L;(10)删除L的第3个元素;(11)输出顺序表L;(12)释放顺序表L。
三、实验预习内容顺序表基本运算,包括:建立顺序表、顺序表基本运算算法(初始化线形表、销毁线形表、判断线形表是否为空表、求线形表的长度、输出线形表、球现行表中某个数据元素值、按元素值查找、插入元素数据、删除数据元素)三、实验结果与分析#include <stdio.h>#include <malloc.h>#define MaxSize 50typedef int ElemType;typedef struct{ ElemType elem[MaxSize];int length;} SqList;void InitList(SqList *&L){ L=(SqList *)malloc(sizeof(SqList));L->length=0;}void DestroyList(SqList *L){free(L);}int ListEmpty(SqList *L){return(L->length==0);}int ListLength(SqList *L){return(L->length);}void DispList(SqList *L){ int i;if (ListEmpty(L)) return;for (i=0;i<L->length;i++)printf("%c",L->elem[i]);printf("\n");}int GetElem(SqList *L,int i,ElemType &e) { if (i<1 || i>L->length)return 0;e=L->elem[i-1];return 1;}int LocateElem(SqList *L, ElemType e) {int i=0;while (i<L->length && L->elem[i]!=e) i++; if (i>=L->length)return 0;elsereturn i+1;}int ListInsert(SqList *&L,int i,ElemType e) { int j;if (i<1 || i>L->length+1)return 0;i--;for (j=L->length;j>i;j--)L->elem[j]=L->elem[j-1];L->elem[i]=e;L->length++;}int ListDelete(SqList *&L,int i,ElemType &e){ int j;if (i<1 || i>L->length)return 0;i--;e=L->elem[i];for (j=i;j<L->length-1;j++)L->elem[j]=L->elem[j+1];L->length--;return 1;}void main(){SqList *L;ElemType e;printf("初始化顺序表L\n");InitList(L);printf("依次采用尾插法插入a,b,c,d,e元素\n"); ListInsert(L,1,'a');ListInsert(L,2,'b');ListInsert(L,3,'c');ListInsert(L,4,'d');ListInsert(L,5,'e');printf("输出顺序表L:");DispList(L);printf("顺序表L长度=%d\n",ListLength(L));printf("顺序表L为%s\n",(ListEmpty(L)?"空":"非空")); GetElem(L,3,e);printf("顺序表L的第3个元素=%c\n",e);printf("元素a的位置=%d\n",LocateElem(L,'a'));printf("在第4个元素位置上插入f元素\n"); ListInsert(L,4,'f');printf("输出顺序表L:");DispList(L);printf("删除L的第3个元素\n");ListDelete(L,3,e);printf("输出顺序表L:");DispList(L);printf("释放顺序表L\n");}注:空间不够,可以增加页码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return(TRUE);
}
void main()//主函数
{SeqList l,*la;
int p,q,r,k,j ,m,num;
printf("请输入线性表的长度:");
scanf("%d",&r);
st = r-1;
la=&l;
Input(la,la->last+1);
(4)创建顺序表的插入函数:int InsList(SeqList *L,int i,ElemType e);
(5)创建顺序表的删除函数:int DelList(SeqList *L,int i,ElemType *e);
(6)主函数:void main()
4.详细设计
#include <stdio.h>
{ElemTypeelem[MAXSIZE];
Intlast;
}SeqList;
3.模块划分
(1)创建顺序表输入函数:void Input(SeqList *L,int n);
(2)创建顺序表输出函数:void Output(SeqList *L);
(3)创建顺序表的内容查找函数:int Locate(SeqList L,ElemType e);
{printf("插入位置不合法\n");
return(ERROR);
}
if(L->last>= MAXSIZE-1)
{printf("表已满无法插入");
return(ERROR);
}
for(k=L->last;k>=i-1;k--) //为插入元素而移动位置
L->elem[k+1]=L->elem[k];
scanf("%d",&m);
DelList(la,m,&num);
printf("删除成功,删除的元素为%d",num);
printf("\n");
Output(la);
}
5.测试数据及结果
实验总结:
经过调试与测试,实验结果与测试预期一致。顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
#include <stdlib.h>
#include <malloc.h>
#define OK 1
#define ERROR -1
#define TRUE 1
#define FALSE 0
#define ElemType int
#defineMAXSIZE 100 //最大长度
typedef struct
printf("请输入要插入的位置:\n");
scanf("%d",&k);
printf("请输入要插入的元素值:\n");
scanf("%d",&j);
InsList(la,k,j); //调用插入函数
Output(la);
//删除元素 删除第i个元素
printf("请输入需要删除的元素的位置:\n");
{int k;
if((i<1)||(i>L->last+1))
{printf("删除位置不合法!\n");
return(ERROR);
}
*e = L->elem[i-1]; /* 将删除的元素存放到e所指向的变量中*/
for(k=i; k<=L->last; k++)
L->elem[k-1] = L->elem[k]; /*将后面的元素依次前移*/
数据结构顺序表实验报告
洛阳理工学院实验报告
系别
计算机
班级
学号
姓名
课程名称
数据结构
实验日期
10/23
实验名称
顺序表的基本操作
成绩
实验目的:
熟悉掌握线性表顺序存储结构,掌握与应用顺序表的查找、插入、删除等基本操作算法,训练和提高结构化程序设计能力及程序调试能力。
实验条件:
计算机一台,Visual C++6.0
L->elem[i-1]=e; //第i个元素的下标为i-1
L->last++;
return(OK);
}
int DelList(SeqList *L,int i,ElemType *e) //删除函数
/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值。i的合法取值为1≤i≤st+1 */
}
void Output(SeqList *L) //输出函数
{ int i;
for(i=0; i<=L->last; i++)
printf("%2d,",L->elem[i]);
printf("\n");
}
int Locate(SeqList L,ElemType e)//内容查找函数
{int i;
实验内容:
1.问题描述
以顺序表为存储结构实现以下基本操作:
(1)在第i个元素前插入一个新元素。
(2)查找值为x的某个元素。若成功,给出x在表中的位置;不成功给出提示信息。
(3)删除第i个元素,若成功,给出提示信息并显示被删元素的值;不成功给出失败的提示信息。
2.数据结构类型定义
typedef struct
Out请输入要查找的元素值:\n");
scanf("%d",&q);
p=Locate(l,q);
if(p == -1)
printf("在此线性表中没有该元素! \n");
else
printf("该元素在线性表中的位置为:%d \n",p);
//插入元素 (在i处插入元素e)
i=0;
while((i<=st)&&(L.elem[i])!=e)
i++;
if(i<=st)
return(i+1); //返回序号
else
return(-1);
}
int InsList(SeqList *L,int i,ElemType e)//插入数据
{int k;
if((i<1) || (i>L->last+2)) /*首先判断插入位置是否合法*/
{ElemType elem[MAXSIZE];
int last;
}SeqList;
void Input(SeqList *L,int n) //输入函数
{ int i;
printf("请输入线性表的各元素值:\n");
for(i=0; i<n; i++)
scanf("%d",&L->elem[i]);