数据结构线性表的顺序存储结构C语言实现
- 格式:doc
- 大小:215.01 KB
- 文档页数:13
数据结构经典题目及c语言代码一、线性表1. 顺序表顺序表是一种利用连续存储空间存储元素的线性表。
以下是一个顺序表的经典题目及C语言代码实现:```c#define MaxSize 50typedef struct {int data[MaxSize]; // 存储元素的数组int length; // 顺序表的当前长度} SeqList;// 初始化顺序表void initList(SeqList *L) {L->length = 0;}// 插入元素到指定位置void insert(SeqList *L, int pos, int elem) {if (pos < 1 || pos > L->length + 1) {printf("插入位置无效\n");return;}if (L->length == MaxSize) {printf("顺序表已满,无法插入\n"); return;}for (int i = L->length; i >= pos; i--) { L->data[i] = L->data[i - 1];}L->data[pos - 1] = elem;L->length++;}// 删除指定位置的元素void delete(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("删除位置无效\n");return;}for (int i = pos - 1; i < L->length - 1; i++) {L->data[i] = L->data[i + 1];}L->length--;}// 获取指定位置的元素值int getElement(SeqList *L, int pos) {if (pos < 1 || pos > L->length) {printf("位置无效\n");return -1;}return L->data[pos - 1];}```2. 链表链表是一种利用非连续存储空间存储元素的线性表。
C语⾔中都有哪些常见的数据结构你都知道⼏个?上次在⾯试时被⾯试官问到学了哪些数据结构,那时简单答了栈、队列/(ㄒoㄒ)/~~其它就都想不起来了,今天有空整理了⼀下⼏种常见的数据结构,原来我们学过的数据结构有这么多~⾸先,先来回顾下C语⾔中常见的基本数据类型吧O(∩_∩)OC语⾔的基本数据类型有:整型int,浮点型float,字符型char等等添加描述那么,究竟什么是数据结构呢?数据结构是计算机存储、组织数据的⽅式。
数据结构是指相互之间存在⼀种或多种特定关系的数据元素的集合⼤部分数据结构的实现都需要借助C语⾔中的指针和结构体类型下⾯,进⼊今天的重点啦O(∩_∩)O⼏种常见的数据结构(1)线性数据结构:元素之间⼀般存在元素之间存在⼀对⼀关系,是最常⽤的⼀类数据结构,典型的有:数组、栈、队列和线性表(2)树形结构:结点间具有层次关系,每⼀层的⼀个结点能且只能和上⼀层的⼀个结点相关,但同时可以和下⼀层的多个结点相关,称为“⼀对多”关系,常见类型有:树、堆(3)图形结构:在图形结构中,允许多个结点之间相关,称为“多对多”关系下⾯分别对这⼏种数据结构做⼀个简单介绍:1、线性数据结构:典型的有:数组、栈、队列和线性表(1)数组和链表a、数组:存放着⼀组相同类型的数据,需要预先指定数组的长度,有⼀维数组、⼆维数组、多维数组等b、链表:链表是C语⾔中⼀种应⽤⼴泛的结构,它采⽤动态分配内存的形式实现,⽤⼀组任意的存储单元存放数据元素链表的,⼀般为每个元素增设指针域,⽤来指向后继元素c、数组和链表的区别:从逻辑结构来看:数组必须事先定义固定的长度,不能适应数据动态地增减的情况;链表动态地进⾏存储分配,可以适应数据动态地增减的情况,且可以⽅便地插⼊、删除数据项(数组中插⼊、删除数据项时,需要移动其它数据项)从内存存储来看:(静态)数组从栈中分配空间(⽤NEW创建的在堆中), 对于程序员⽅便快速,但是⾃由度⼩;链表从堆中分配空间, ⾃由度⼤但是申请管理⽐较⿇烦从访问⽅式来看:数组在内存中是连续存储的,因此,可以利⽤下标索引进⾏随机访问;链表是链式存储结构,在访问元素的时候只能通过线性的⽅式由前到后顺序访问,所以访问效率⽐数组要低(2)栈、队列和线性表:可采⽤顺序存储和链式存储的⽅法进⾏存储顺序存储:借助数据元素在存储空间中的相对位置来表⽰元素之间的逻辑关系链式存储:借助表⽰数据元素存储地址的指针表⽰元素之间的逻辑关系a、栈:只允许在序列末端进⾏操作,栈的操作只能在栈顶进⾏,⼀般栈⼜被称为后进先出或先进后出的线性结构顺序栈:采⽤顺序存储结构的栈称为顺序栈,即需要⽤⼀⽚地址连续的空间来存储栈的元素,顺序栈的类型定义如下:添加描述链栈:采⽤链式存储结构的栈称为链栈:添加描述b、队列:只允许在序列两端进⾏操作,⼀般队列也被称为先进先出的线性结构循环队列:采⽤顺序存储结构的队列,需要按队列可能的最⼤长度分配存储空空,其类型定义如下:添加描述 链队列:采⽤链式存储结构的队列称为链队列,⼀般需要设置头尾指针只是链表的头尾结点:添加描述c、线性表:允许在序列任意位置进⾏操作,线性表的操作位置不受限制,线性表的操作⼗分灵活,常⽤操作包括在任意位置插⼊和删除,以及查询和修改任意位置的元素顺序表:采⽤顺序存储结构表⽰的线性表称为顺序表,⽤⼀组地址连续的存储单元⼀次存放线性表的数据元素,即以存储位置相邻表⽰位序相继的两个元素之间的前驱和后继关系,为了避免移动元素,⼀般在顺序表的接⼝定义中只考虑在表尾插⼊和删除元素,如此实现的顺序表也可称为栈表:添加描述线性表:⼀般包括单链表、双向链表、循环链表和双向循环链表单链表:添加描述 双向链表:添加描述线性表两种存储结构的⽐较:顺序表: 优点:在顺序表中,逻辑中相邻的两个元素在物理位置上也相邻,查找⽐较⽅便,存取任⼀元素的时间复杂度都为O(1) 缺点:不适合在任意位置插⼊、删除元素,因为需要移动元素,平均时间复杂度为O(n)链表: 优点:在链接的任意位置插⼊或删除元素只需修改相应指针,不需要移动元素;按需动态分配,不需要按最⼤需求预先分配⼀块连续空空 缺点:查找不⽅便,查找某⼀元素需要从头指针出发沿指针域查找,因此平均时间复杂度为O(n)2、树形结构:结点间具有层次关系,每⼀层的⼀个结点能且只能和上⼀层的⼀个结点相关,但同时可以和下⼀层的多个结点相关,称为“⼀对多”关系,常见类型有:树、堆(1)⼆叉树:⼆叉树是⼀种递归数据结构,是含有n(n>=0)个结点的有限集合,⼆叉树具有以下特点:⼆叉树可以是空树;⼆叉树的每个结点都恰好有两棵⼦树,其中⼀个或两个可能为空;⼆叉树中每个结点的左、右⼦树的位置不能颠倒,若改变两者的位置,就成为另⼀棵⼆叉树(2)完全⼆叉树:从根起,⾃上⽽下,⾃左⽽右,给满⼆叉树的每个结点从1到n连续编号,如果每个结点都与深度为k的满⼆叉树中编号从1⾄n的结点⼀⼀对应,则称为完全⼆叉树a、采⽤顺序存储结构:⽤⼀维数组存储完全⼆叉树,结点的编号对于与结点的下标(如根为1,则根的左孩⼦为2*i=2*1=2,右孩⼦为2*i+1=2*1+1=2)添加描述b、采⽤链式存储结构:⼆叉链表:添加描述三叉链表:它的结点⽐⼆叉链表多⼀个指针域parent,⽤于执⾏结点的双亲,便于查找双亲结点添加描述两种存储结构⽐较:对于完全⼆叉树,采⽤顺序存储结构既能节省空间,⼜可利⽤数组元素的下标值确定结点在⼆叉树中的位置及结点之间的关系,但采⽤顺序存储结构存储⼀般⼆叉树容易造成空间浪费,链式结构可以克服这个缺点(3)⼆叉查找树:⼆叉查找树⼜称⼆叉排序树,或者是⼀课空⼆叉树,或者是具有如下特征的⼆叉树:a、若它的左⼦树不空,则左⼦树上所有结点的值均⼩于根结点的值b、若它的右⼦树不空,则右⼦树上所有结点的值均⼤于根结点的值c、它的左、右⼦树也分别是⼆叉查找树(4)平衡⼆叉树:平衡⼆叉查找树简称平衡⼆叉树,平衡⼆叉树或者是棵空树,或者是具有下列性质的⼆叉查找树:它的左⼦树和右⼦树都是平衡⼆叉树,且左⼦树和右⼦树的⾼度之差的绝对值不超过1添加描述平衡⼆叉树的失衡及调整主要可归纳为下列四种情况:LL型、RR型、LR型、RL型(5)树:树是含有n(n>=0)个结点的有限集合,在任意⼀棵⾮空树种: a、有且仅有⼀个特定的称为根的结点b、当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,...,Tm,其中每⼀个集合本⾝⼜是⼀棵树,并且T1,T2,...,Tm称为根的⼦树(6)堆:堆是具有以下特性的完全⼆叉树,其所有⾮叶⼦结点均不⼤于(或不⼩于)其左右孩⼦结点。
实验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.归并顺序表(销毁或清空操作前)七、思考讨论题或体会或对改进实验的建议通过本次实验,我掌握了定义线性表的顺序存储类型,加深了对顺序存储结构的理解,进一步巩固和理解了顺序表的基本操作,如建立、查找、插入和删除等。
数据结构c 版第二版课后习题答案数据结构是计算机科学中的重要概念,它研究如何组织和存储数据,以便能够高效地进行操作和检索。
C语言是一种广泛应用于软件开发的编程语言,而数据结构C版第二版是一本经典的教材,它介绍了C语言中常用的数据结构和算法。
在学习这本教材时,课后习题是检验自己理解和掌握程度的重要方式。
下面我将为大家提供一些课后习题的答案,希望对大家的学习有所帮助。
1. 第一章:引论习题1:数据结构是什么?它的作用是什么?答案:数据结构是一种组织和存储数据的方式,它可以帮助我们更高效地进行数据操作和检索。
它的作用是提供一种合理的数据组织方式,使得我们可以快速地找到和处理需要的数据。
习题2:请举例说明数据结构的应用场景。
答案:数据结构可以应用于各个领域,比如在图像处理中,我们可以使用二维数组来表示图像的像素点;在网络通信中,我们可以使用链表来存储和管理网络节点之间的连接关系;在数据库中,我们可以使用树结构来组织数据的层次关系等等。
2. 第二章:算法分析习题1:什么是时间复杂度和空间复杂度?它们分别表示什么?答案:时间复杂度是衡量算法执行时间的度量,它表示随着输入规模的增加,算法执行时间的增长趋势。
空间复杂度是衡量算法所需内存空间的度量,它表示随着输入规模的增加,算法所需内存空间的增长趋势。
习题2:请解释最坏情况时间复杂度和平均情况时间复杂度的区别。
答案:最坏情况时间复杂度是指在最不利的情况下,算法执行的时间复杂度。
平均情况时间复杂度是指在所有可能输入情况下,算法执行的平均时间复杂度。
最坏情况时间复杂度是对算法性能的保证,而平均情况时间复杂度更能反映算法的平均性能。
3. 第三章:线性表习题1:请实现一个线性表的顺序存储结构。
答案:可以使用数组来实现线性表的顺序存储结构。
定义一个固定大小的数组,然后使用一个变量来记录线性表中元素的个数,通过数组下标来访问和操作元素。
习题2:请实现一个线性表的链式存储结构。
#include 〈stdio.h>#include <malloc。
h>#include 〈stdlib.h>/*数据结构C语言版线性表的单链表存储结构表示和实现P28—31编译环境:Dev-C++ 4。
9。
9。
2日期:2011年2月10日*/typedef int ElemType;// 线性表的单链表存储结构typedef struct LNode{ElemType data; //数据域struct LNode *next;//指针域}LNode, *LinkList;// typedef struct LNode *LinkList;// 另一种定义LinkList的方法// 构造一个空的线性表Lint InitList(LinkList *L){/*产生头结点L,并使L指向此头结点,头节点的数据域为空,不放数据的。
void *malloc(size_t)这里对返回值进行强制类型转换了,返回值是指向空类型的指针类型.*/(*L)= (LinkList)malloc(sizeof(struct LNode) );if( !(*L))exit(0);// 存储分配失败(*L)-〉next = NULL;// 指针域为空return 1;}// 销毁线性表L,将包括头结点在内的所有元素释放其存储空间。
int DestroyList(LinkList *L){LinkList q;// 由于单链表的每一个元素是单独分配的,所以要一个一个的进行释放while(*L ){q = (*L)—〉next;free(*L );//释放*L = q;}return 1;}/*将L重置为空表,即将链表中除头结点外的所有元素释放其存储空间,但是将头结点指针域置空,这和销毁有区别哦。
不改变L,所以不需要用指针。
*/int ClearList( LinkList L ){LinkList p,q;p = L—〉next;// p指向第一个结点while( p ) // 没到表尾则继续循环{q = p—>next;free( p );//释放空间p = q;}L—>next = NULL; // 头结点指针域为空,链表成了一个空表return 1;}// 若L为空表(根据头结点L—〉next来判断,为空则是空表),则返回1,// 否则返回0.int ListEmpty(LinkList L){if(L—>next ) // 非空return 0;elsereturn 1;}// 返回L中数据元素个数。
数据结构线性表实验报告数据结构线性表实验报告实验目的:本次实验主要是为了学习和掌握线性表的基本操作和实现方式。
通过实验,我们可以加深对线性表的理解,并能够熟悉线性表的基本操作。
实验设备与环境:本次实验所需的设备包括计算机和编程环境。
我们选择使用C语言来实现线性表的操作,并在Visual Studio Code编程软件中进行编写和调试。
实验内容:1.线性表的定义和基本操作1.1 线性表的定义:线性表是一种有序的数据结构,其中的元素按照一定的顺序存储,可以插入、删除和访问元素。
1.2 线性表的基本操作:1.2.1 初始化线性表:创建一个空的线性表。
1.2.2 判断线性表是否为空:判断线性表是否不含有任何元素。
1.2.3 获取线性表的长度:返回线性表中元素的个数。
1.2.4 在线性表的指定位置插入元素:在线性表的第i个位置插入元素x,原第i个及其之后的元素依次后移。
1.2.5 删除线性表中指定位置的元素:删除线性表中第i个位置的元素,原第i+1个及其之后的元素依次前移。
1.2.6 获取线性表中指定位置的元素:返回线性表中第i个位置的元素的值。
1.2.7 清空线性表:将线性表中的元素全部删除,使其变为空表。
2.线性表的顺序存储结构实现2.1 线性表的顺序存储结构:使用数组来实现线性表的存储方式。
2.2 线性表的顺序存储结构的基本操作:2.2.1 初始化线性表:创建一个指定长度的数组,并将数组中的每个元素初始化为空值。
2.2.2 判断线性表是否为空:判断线性表的长度是否为0。
2.2.3 获取线性表的长度:返回线性表数组的长度。
2.2.4 在线性表的指定位置插入元素:将要插入的元素放入指定位置,并将原位置及其之后的元素依次后移。
2.2.5 删除线性表中指定位置的元素:将指定位置的元素删除,并将原位置之后的元素依次前移。
2.2.6 获取线性表中指定位置的元素:返回指定位置的元素的值。
2.2.7 清空线性表:将线性表数组中的每个元素赋空值。
修改内容:重新排版《数据结构》试验报告-------------线性表的插入和删除康一飞地理信息系统08-208014208一,实验目的掌握线性表的顺序存储结构的定义及C语言实现插入,删除操作掌握线性表的链式存储结构的定义及C语言实现插入,删除操作二,实验内容1定义数据元素之间的关系在计算机中又两种不同的表示方式:顺序映像和非顺序映像,由此得到两种不同的存储结构:顺序存储结构和链式存储结构。
顺序映像的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系非顺序映像的特点是借助指针元素存储地址的指针表示数据元素之间的逻辑关系2顺序表的插入#include<stdio.h>#include<malloc.h>typedef struct{int elem;int length;int listsize;}SqList,* SqL;SqL CreateList_S(){int n;SqList *p,*S;S=(SqL) malloc (sizeof(SqList));S->listsize=100;printf("input the length of the list:");scanf("%d",&(S->length));printf("input the element of the list:");for(n=1,p=S;n<=(S->length);n++,p+=sizeof(SqList)) scanf("%d",&p->elem);return(S);}SqL ListInsert_S(SqL S){int e,i,m,n;loop: printf("input the place you want to insert:");scanf("%d",&i);if(i<1||i>S->length+1){printf("ERROR input again\n");goto loop;}printf("iuput the element you want to insert:");scanf("%d",&e);m=S->length;for(n=i;n<=S->length;n++){(S+m*sizeof(SqList))->elem=(S+(m-1)*sizeof(SqList))->elem;m=m-1;}(S+(i-1)*sizeof(SqList))->elem=e;S->length++;return(S);}void main(){SqList *Sa,*p;int n,i,e;Sa=CreateList_S();printf("the list is:");for(n=1,p=Sa;n<=(Sa->length);n++,p+=sizeof(SqList))prin tf("%d ",p->elem);printf("\n\n");Sa= ListInsert_S(Sa);printf("the list is:");for(n=1,p=Sa;n<=(Sa->length);n++,p+=sizeof(SqList))prin tf("%d ",p->elem);printf("\n");}3单链表的删除#include<stdio.h>#include<malloc.h>#define NULL 0typedef struct LNode{int data;struct LNode *next;}LNode,*LiL;LiL CreatList_L(){int i,n;LNode *p,*L;L=(LiL)malloc(sizeof(LNode));L->next=NULL;printf("please input the length of the list:");scanf("%d",&n);printf("input the element of the list:");for(i=0;i<n;i++){p=(LiL)malloc(sizeof(LNode));scanf("%d",&p->data);p->next=L->next,L->next=p;}return(L);}LiL ListDelete_L(LiL L){LNode *p;int j,e,i;loop:printf("input the place you want to delited:");scanf("%d",&i);for(j=0, p=L;j<i-1&&p->next!=NULL;j++) p=p->next;if(p->next==NULL){printf("ERROR input again\n");goto loop;}e=p->next->data;p->next=p->next->next;printf("the element you want to delited is:%d\n",e);return(L);}void main(){LNode *La,*p;int n,i,e;La=CreatList_L();printf("the list is:");for(p=La->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n\n");La= ListDelete_L(La);printf("the list is:");for(p=La->next;p!=NULL;p=p->next)printf("%d ",p->data);printf("\n");}三、实验体会1,由于《数据结构》课本上给出的示例函数并不是完全由C语言写出,包含了一些伪代码,所以不可以直接拿来使用,一定要结合具体的程序设计实际例题用严格的C语言编写出才能通过编译2. 程序中用了大量的指针,在定义和使用它时要分清楚哪些是代表指针,哪些是代表指针所指向的地址,以及哪些是其他的类型,我在编程中就因为没有把握好这几种类型,耗费了许多时间来检查错误3. 在调用和创建函数时,注意函数使用的各种规则,注意函数类型和返回值,参见C语言课本4. 编写两个程序时,要注意两种存储结构的线性表的不同,不要把二者的一些东西混淆5 一些小细节,比如:单链表输出时令p=La->next,而不是p=La;以及程序中作为计数器使用的一些int型变量的起始值,可能以为一个数的差别导致程序运行错误,要反复检查实验才能得到正确结果6 由于能力有限,除了“插入/删除位置有误”外,没有对其他复杂情况分析,值编写了简单的数字线性表的操作康一飞地理信息系统08-2班 08014208。
c语言顺序表实验报告C语言顺序表实验报告引言:C语言是一种广泛应用于软件开发领域的编程语言,其灵活性和高效性备受开发者青睐。
在本次实验中,我们将探索C语言中的一种数据结构——顺序表。
顺序表是一种线性表的存储结构,通过数组实现,具有快速访问元素的特点。
本实验将通过实际操作,深入了解顺序表的创建、插入、删除和查找等基本操作,并对其性能进行评估。
实验目的:1. 掌握顺序表的创建和初始化方法;2. 熟悉顺序表的插入、删除和查找等基本操作;3. 评估顺序表在不同操作下的性能。
实验步骤:1. 创建顺序表在C语言中,可以通过定义一个结构体来表示顺序表,其中包含一个数组和一个记录当前元素个数的变量。
通过动态内存分配,可以根据需要调整顺序表的大小。
```ctypedef struct {int* data; // 数组指针int length; // 当前元素个数int capacity; // 顺序表的容量} SeqList;```在主函数中,可以通过调用malloc函数为顺序表分配内存空间,并对其进行初始化。
```cSeqList* createSeqList(int capacity) {SeqList* list = (SeqList*)malloc(sizeof(SeqList));list->data = (int*)malloc(capacity * sizeof(int));list->length = 0;list->capacity = capacity;return list;}```2. 插入元素顺序表的插入操作需要考虑插入位置的合法性以及顺序表是否已满的情况。
在插入元素时,需要将插入位置之后的元素后移一位,为新元素腾出空间。
```cvoid insert(SeqList* list, int position, int element) {if (position < 0 || position > list->length) {printf("插入位置非法!");return;}if (list->length >= list->capacity) {printf("顺序表已满,无法插入!");return;}for (int i = list->length - 1; i >= position; i--) {list->data[i + 1] = list->data[i];}list->data[position] = element;list->length++;}```3. 删除元素顺序表的删除操作需要考虑删除位置的合法性以及顺序表是否为空的情况。
数学与信息技术学院2016~2017(下)学年
计科专业2015级《数据结构》实验报告 1 学号:2015201018 姓名:汪继超
fflush(stdin);//清空在此前输入缓冲区
a=getchar();
if(a=='y'||a=='Y')
{
flag=1;
system("cls"); /*清屏*/
Menu(); /*调用菜单函数*/
printf("请再次选择你需要操作的步骤(0--7): ");
fflush(stdin);//清空在此前输入缓冲区
scanf("%d",&n);
}
else
{
free(L);//释放顺序表
exit(0);
}
}
}
实验结果:
1.表初始化:
2.建表:
注:若以空格键隔开数据,多输入无影响,计算机读取完指定数目数据后,自动结束读取。
3-1.插入位置合法:
3-2.插入位置不合法:4.删除:
5-1.查找成功:
5-2.查找-没有相应数据:
6-1.找到修改元素,并确定修改:6-2.找到修改元素,不修改:
6-3.没找到修改元素:
问题讨论:
1.元素插入及删除过程中,计算机储存结构中元素位置从0开始,但面向用户时,应考虑人的自然思维,即面向用户时应以1为第一个元素位置,计算机实现需要把位置i=i+1.。