数据结构实验C语言实现线性表
数据结构经典题目及c语言代码
数据结构经典题目及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. 链表链表是一种利用非连续存储空间存储元素的线性表。
数据结构实验报告-线性表(顺序表实现)
实验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.归并顺序表(销毁或清空操作前)七、思考讨论题或体会或对改进实验的建议通过本次实验,我掌握了定义线性表的顺序存储类型,加深了对顺序存储结构的理解,进一步巩固和理解了顺序表的基本操作,如建立、查找、插入和删除等。
《数据结构》实验报告模板(附实例)--实验一线性表的基本操作实现
《数据结构》实验报告模板(附实例)---实验一线性表的基本操作实现实验一线性表的基本操作实现及其应用一、实验目的1、熟练掌握线性表的基本操作在两种存储结构上的实现,其中以熟悉各种链表的操作为重点。
2、巩固高级语言程序设计方法与技术,会用线性链表解决简单的实际问题。
二、实验内容√ 1、单链表的表示与操作实现 ( * )2、约瑟夫环问题3、Dr.Kong的艺术品三、实验要求1、按照数据结构实验任务书,提前做好实验预习与准备工作。
2、加“*”题目必做,其他题目任选;多选者并且保质保量完成适当加分。
3、严格按照数据结构实验报告模板和规范,及时完成实验报告。
四、实验步骤(说明:依据实验内容分别说明实验程序中用到的数据类型的定义、主程序的流程以及每个操作(成员函数)的伪码算法、函数实现、程序编码、调试与分析、总结、附流程图与主要代码)㈠、数据结构与核心算法的设计描述(程序中每个模块或函数应加注释,说明函数功能、入口及出口参数)1、单链表的结点类型定义/* 定义DataType为int类型 */typedef int DataType;/* 单链表的结点类型 */typedef struct LNode{ DataType data;struct LNode *next;}LNode,*LinkedList;2、初始化单链表LinkedList LinkedListInit( ){ // 每个模块或函数应加注释,说明函数功能、入口及出口参数 }3、清空单链表void LinkedListClear(LinkedList L){// 每个模块或函数应加注释,说明函数功能、入口及出口参数}4、检查单链表是否为空int LinkedListEmpty(LinkedList L){ …. }5、遍历单链表void LinkedListTraverse(LinkedList L){….}6、求单链表的长度int LinkedListLength(LinkedList L){ …. }7、从单链表表中查找元素LinkedList LinkedListGet(LinkedList L,int i){ //L是带头结点的链表的头指针,返回第 i 个元素 }8、从单链表表中查找与给定元素值相同的元素在链表中的位置LinkedList LinkedListLocate(LinkedList L, DataType x){ …… }9、向单链表中插入元素void LinkedListInsert(LinkedList L,int i,DataType x) { // L 为带头结点的单链表的头指针,本算法// 在链表中第i 个结点之前插入新的元素 x}10、从单链表中删除元素void LinkedListDel(LinkedList L,DataType x){ // 删除以 L 为头指针的单链表中第 i 个结点 }11、用尾插法建立单链表LinkedList LinkedListCreat( ){ …… }㈡、函数调用及主函数设计(可用函数的调用关系图说明)㈢程序调试及运行结果分析㈣实验总结五、主要算法流程图及程序清单1、主要算法流程图:2、程序清单(程序过长,可附主要部分)说明:以后每次实验报告均按此格式书写。
数据结构线性表试验报告(最终定稿)
数据结构线性表试验报告(最终定稿)第一篇:数据结构线性表试验报告线性表上机实习1、实验目的(1)熟悉将算法转换为程序代码的过程。
(2)了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的C 语言描述方法。
(3)熟练掌握顺序表的基本运算:查找、插入、删除等,掌握顺序表的随机存取特性。
(4)了解线性表的链式存储结构,熟练掌握线性表的链式存储结构的C语言描述方法。
(5)熟练掌握线性链表(单链表)的基本运算:查找、插入、删除等,能在实际应用中灵活选择适当的链表结构。
2、实验要求(1)熟悉顺序表的插入、删除和查找。
(2)熟悉单链表的插入、删除和查找。
3、实验内容: ① 顺序表(1)抽象数据类型定义typedef struct {TypeData data[maxsize];//容量为maxsize的静态顺手表int n;//顺序表中的实际元素个数}SeqList;//静态顺序表的定义在本次实验中,首先建立一个空的静态顺序表,然后键盘输入数据存入表中,然后进入菜单选择界面,通过不同的数字输入,实现对顺序表,删除,插入,查找,显示等操作。
(2)存储结构定义及算法思想在顺序表结构体的定义中,typedef int TypeData 为整型,存储结构如下:for(n=0;ncout<<“请输入线性表数据”<cin>>L.data[n];//顺序将数据存入顺序表}//其他存储与此类似,都是直接赋值与数组的某一位插入版块子函数:void insert(SeqList &L)//插入数据 {int a,b,c,k;cout<<“请输入插入的数及其插入的位置”<cin>>a>>b;if(b<=0||b>(L.n+1)){cout<<“不能在该位置插入”<k=L.data[b-1];L.data[b-1]=a;c=L.n;L.n=L.n+1;while(c>b){L.data[c]=L.data[c-1];c--;//通过循环,实现插入位置后的数据挨个往后移动一位}L.data[b]=k;} 顺序表的插入与删除操作类似,在插入与删除后,都要循环调整后面数组的每一位元素,同时记录数据元素的长度的标示符也要跟着改变。
数据结构C语言版 线性表的单链表存储结构表示和实现
#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中数据元素个数。
数据结构实验报告线性表
数据结构实验报告线性表数据结构实验报告:线性表引言:数据结构是计算机科学中的重要概念,它涉及到如何组织和存储数据,以及如何有效地操作和管理这些数据。
线性表是数据结构中最基本的一种,它是一种有序的数据元素集合,其中的元素之间存在着一对一的关系。
一、线性表的定义和特点线性表是由n个数据元素组成的有限序列,其中n为表的长度。
这些数据元素可以是相同类型的,也可以是不同类型的。
线性表中的数据元素按照一定的顺序排列,并且每个数据元素都有唯一的前驱和后继。
线性表的特点有以下几个方面:1. 数据元素之间是一对一的关系,即每个数据元素只有一个直接前驱和一个直接后继。
2. 线性表中的元素是有序的,每个元素都有一个确定的位置。
3. 线性表的长度是有限的,它的长度可以是0,也可以是任意正整数。
二、线性表的实现方式线性表可以使用不同的数据结构来实现,常见的实现方式有数组和链表。
1. 数组实现线性表:数组是一种连续存储的数据结构,它可以用来存储线性表中的元素。
数组的优点是可以快速访问任意位置的元素,但是插入和删除操作需要移动其他元素,效率较低。
2. 链表实现线性表:链表是一种非连续存储的数据结构,它通过指针将线性表中的元素链接起来。
链表的优点是插入和删除操作简单高效,但是访问任意位置的元素需要遍历链表,效率较低。
三、线性表的基本操作线性表的基本操作包括插入、删除、查找和修改等。
1. 插入操作:插入操作用于向线性表中插入一个新元素。
具体步骤是先将插入位置后面的元素依次后移,然后将新元素插入到指定位置。
2. 删除操作:删除操作用于从线性表中删除一个元素。
具体步骤是先将删除位置后面的元素依次前移,然后将最后一个元素删除。
3. 查找操作:查找操作用于在线性表中查找指定元素。
具体步骤是从线性表的第一个元素开始逐个比较,直到找到匹配的元素或者到达线性表的末尾。
4. 修改操作:修改操作用于修改线性表中的某个元素的值。
具体步骤是先查找到要修改的元素,然后将其值更新为新值。
严蔚敏数据结构C语言版——线性表(初始化、插入、删除、遍历)
严蔚敏数据结构C语⾔版——线性表(初始化、插⼊、删除、遍历)1 #include<stdio.h>2 #include<malloc.h>3 #include<stdlib.h>45#define TRUE 16#define FALSE 07#define OK 18#define ERROR 09#define INFEASIBLE -110#define OVERFLOW -21112#define LIST_INIT_SIZE 100 //存储空间初始分配量13#define LISTINCREMENT 10 //存储空间不够时,动态增加的分配量1415 typedef int ElemType;16 typedef int Status;1718 typedef struct {19 ElemType *elem; //存储空间基地址20int length; //当前长度21int listsize; //当前分配的存储容量,即有多少个ElemType空间22 }SqList;2324 Status InitList_Sq(SqList *L); //初始化线性表25 Status ListInsert_Sq(SqList *L,int i,ElemType e); //插⼊操作26 Status ListDelete_Sq(SqList *L,int i,ElemType *e); //删除操作27void TraverseList_Sq(SqList L); //遍历线性表2829int main()30 {31 SqList L;32 ElemType e;33int i,n = 10;34 InitList_Sq(&L);35for(i= 1; i <= n; i++)36 {37 ListInsert_Sq(&L,i,i); //插⼊10个元素,1,2,3,...,1038 }39 TraverseList_Sq(L);4041 printf("输⼊要删除的位置:");42 scanf("%d",&i);43 ListDelete_Sq(&L,i,&e);44 TraverseList_Sq(L);45 printf("e=%d\n",e);4647 printf("输⼊要插⼊的位置和数值:");48 scanf("%d %d",&i,&e);49 ListInsert_Sq(&L,i,e);50 TraverseList_Sq(L);51return0;52 }5354 Status InitList_Sq(SqList *L)55 {56//分配存储空间100*sizeof(ElmeType),并把存储空间基地址返回给L->elem57 L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));58if(!L->elem) exit(OVERFLOW);59 L->length = 0;60//初始化存储空间容量为10061 L->listsize = LIST_INIT_SIZE;62return OK;63 }6465//在第i个位置前,插⼊新元素,i是从1开始变化的66 Status ListInsert_Sq(SqList *L,int i,ElemType e)67 {68//插⼊位置不合理69if(i < 1 || i> L->length+1) return ERROR;70//存储空间不⾜,增加分配71if(L->length >= L->listsize )72 {73 ElemType *newbase = (ElemType *) realloc (L->elem,74 (L->listsize + LISTINCREMENT)*sizeof(ElemType)); 75if(!newbase) exit(OVERFLOW);76 L->elem = newbase;77 L->listsize += LISTINCREMENT;78 }79 ElemType *q = &(L->elem[i-1]);80 ElemType *p;81for(p = &(L->elem[L->length-1]); p >= q; --p)82 {83 *(p+1)=*p;84 }85 *q = e;86 (L->length)++;87return OK;88 }8990 Status ListDelete_Sq(SqList *L,int i,ElemType *e)91 {92//删除位置不合理93if(i < 1 || i > L->length) return ERROR;94 ElemType *p = &(L->elem[i-1]);95 *e = *p;96 ElemType *q = &(L->elem[L->length-1]);97for(++p; p <= q; p++)98 {99 *(p-1) = *p;100 }101 (L->length)--;102return OK;103 }104105void TraverseList_Sq(SqList L)106 {107int i;108 printf("线性表元素为:");109for(i = 0; i <= L.length-1; i++)110 {111 printf("%d,",L.elem[i]);112 }113 printf("\n");114 }。
数据结构C语言版 实验报告
数据结构C语言版实验报告《数据结构 C 语言版实验报告》一、实验目的本次实验旨在通过使用 C 语言实现常见的数据结构,加深对数据结构基本概念和操作的理解,提高编程能力和问题解决能力。
二、实验环境操作系统:Windows 10编程环境:Visual Studio 2019三、实验内容1、线性表顺序表的实现链表的实现(包括单向链表、双向链表)2、栈和队列栈的实现(顺序栈、链栈)队列的实现(顺序队列、循环队列、链队列)3、数组和字符串数组的基本操作字符串的操作(字符串的存储、字符串的比较、字符串的连接等)4、树和二叉树二叉树的遍历(前序、中序、后序)二叉树的创建和基本操作5、图图的存储(邻接矩阵、邻接表)图的遍历(深度优先遍历、广度优先遍历)四、实验步骤1、线性表顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除、查找等操作。
编写测试程序,对顺序表的各种操作进行测试。
链表的实现定义单向链表和双向链表的数据结构,包括节点结构体。
实现链表的创建、插入、删除、查找等操作。
编写测试程序,验证链表操作的正确性。
栈的实现定义顺序栈和链栈的数据结构。
实现栈的入栈、出栈、栈顶元素获取等操作。
进行栈的操作测试。
队列的实现定义顺序队列、循环队列和链队列的数据结构。
实现队列的入队、出队、队头队尾元素获取等操作。
对队列的操作进行测试。
3、数组和字符串数组的操作实现数组的初始化、元素访问、数组元素的修改等。
测试数组的基本操作。
字符串的操作定义字符串的存储方式。
实现字符串的比较、连接、复制等操作。
编写测试用例,验证字符串操作的准确性。
二叉树的遍历采用递归方式实现二叉树的前序、中序、后序遍历。
输出遍历结果进行验证。
二叉树的创建和基本操作构建二叉树的数据结构。
实现二叉树的节点插入、删除等操作。
5、图图的存储分别用邻接矩阵和邻接表来存储图。
实现图的初始化操作。
图的遍历用深度优先遍历和广度优先遍历算法对图进行遍历。
数据结构实验报告(一)线性表的应用
数据结构实验报告(⼀)线性表的应⽤实验说明数据结构实验⼀ 线性表的实验——线性表的应⽤⼀、实验⽬的通过本实验使学⽣了解线性表的⼀种简单应⽤,熟悉线性表顺序存储与链式存储的特性,特别训练学⽣编程灵活控制链表的能⼒,为今后编程控制更为复杂的数据结构奠定基础。
⼆、实验内容1.⽤顺序表和链表分别分别编程实现教材中例⼦2-1与2-2。
要求:(1)只能⽤C语⾔编程实现;(2)完全保持书中算法2.1与算法2.2形式,不允许有任何变化,除⾮语法上不允许;所调⽤各函数参照书中19页的功能描述,其中函数名、参数个数及性质、函数功能必须与书中完全⼀致,不能有变化。
2.利⽤线性表表⽰⼀元多项式完成多项式的加、减、乘、求导、求值运算。
要求:(1)输⼊的⼀元多项式可以采⽤只输⼊各项的系数与指数这种简化的⽅式。
如对于多项式2x2+6x5,输⼊可为: 2,2 6,5 这样的简单形式。
(2)遇到有消项时应当处理,如2x2+6x5与3x2-6x5进⾏相加时,结果为5*x^2。
(3)当给定x的值时,能计算表达式相加或相减的结果。
(4)操作的结果放⼊⼀个新线性表中,原来的两个表达式存储表⽰不变,也可以不是产⽣新的线性表,⽽是将两上线性表合并为⼀个。
(5)要求程序功能模块划分合理(每个函数功能单⼀、可重⽤性好),使⽤空间尽可能少,算法尽可能⾼效。
实验报告1.实现功能描述使⽤线性表表⽰⼀元多项式完成多项式的加、减,乘,求导、求值运算。
2.⽅案⽐较与选择(1)因为使⽤的是线性表,所以主要⽅案有数组法和链表法。
(2)从时间复杂度来说,使⽤数组法更优;从空间复杂度来说,链表法更优。
因为数组法是指定好空间的,若式⼦⼤⼩超出设置⼤⼩,那程序必然出错;若式⼦⼤⼩⼩于设置⼤⼩,那就意味着有多余的空间被浪费了。
综合来讲,若计算式⼦较为庞⼤,使⽤链表法更佳;相反,若计算式⼦较⼩,数组法更佳。
3.设计算法描述(1)单个项式的数据存储使⽤了结构体,数组法是在⼀个结构体中定义两个⼀维数组;链表法是通过⼀个结构体作为⼀个节点,通过next指针连接起来。
数据结构线性表实验报告
实验一线性表一、实验目的1.掌握实现线性表的基本操作方法;2.掌握线性表的基本操作:建表、插入、删除、输出等运算在顺序存储结构和链式存储结构上的实现;3.通过本次实习加深对高级语言C语言的使用(特别是函数参数、指针类型、链表的使用)。
熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现。
二、实验环境装有VisualC++6.0的普通PC机三、源程序#include"string.h"#include "stdio.h"#include "stdlib.h"#include "conio.h"#define MaxLine 100 /*顺序存储的最大个数*/ typedef int ElemType;typedef struct SqList{ElemType data[MaxLine];/*存放顺序表的数组*/ int length;/*顺序表的长度*/} L;/*初始化顺序表*/void InitList(SqList&L){L.length = 0;//L.length =0;}/*得到顺序表的长度*/int GetLength(SqList &L){return L.length;}/*得到顺序表中的第i个元素*/ElemType GetElem(SqList &L,int i){if(i < 1 || i > L.length) 开始{printf("error");exit(1);}return L.data[i-1];}void ListInsert(SqList &L,int i,ElemType x)/*添加线性表中第i个位置上的元素,i从1开始*/{int j;if(i < 1 || i > L.length+1) /*检查添加位置的合法性*/{printf("error");exit(1);}if(L.length >= MaxLine){printf("overflow!");exit(1);}j = L.length;while(j>=i)/*此处语句相对参考语句有较大改变*/{L.data[j]=L.data[j-1];j--;}L.data[i-1] = x;L.length++;}void ListDelete(SqList &L,int i) /* 删除线性表中第i个位置上的元素*/ {int j;if(i<1 || i>L.length) /* 检查空表及删除位置的合法性*/ {printf ("不存在第i个元素");exit(0);}for(j=i;j<=L.length-1;j++)L.data[j-1]=L.data[j]; /* 向前移动元素*/L.length--;}int main(){FILE *fp;struct SqList A;InitList(A);/*初始化顺序表*/int Judge2=0;printf(" ***线性表操作实验***\n \n\n请输入0对长度为8的线性表输入数据或者其他任意数进行其他操作^_^\n");scanf("%d",&Judge2);if(Judge2==0){int t = 1,d=1;for(t=1;t<=8;t++)/*此处为顺序表首先输入8个元素*/{printf("请输入第%d个线性表元素:",t);scanf("%d",&d);ListInsert(A,t,d);}}int Judge=0;printf("输入0结束程序或者输入其他任意数继续对该表进行操作^_^\n");scanf("%d",&Judge);while(Judge)/*判断是结束程序还是要继续操作该顺序表*/{int a=0;int pos=0;int c=0;int Judge1=0;int P;/*给出顺序表操作选择菜单分别为输入,删除,显示长度,打印顺序表*/printf(" ***************\n *输入1进行插入*\n");printf(" *输入2进行删除*\n");printf(" *输入3显示长度*\n");printf(" *输入4打印该表*\n");printf(" *输入5保存数据*\n");printf(" *输入6进行排序*\n");printf(" *输入7查找数据*\n ***************\n");printf("请选择:");/*选择要进行的操作*/scanf("%d",&P);if(P==0)return 0;else if(P>=1&&P<=7)switch(P){case 1:printf("请输入想进行插入操作的位置:");/*选择待插入位置*/scanf("%d",&pos);int PP;printf("请输入待插入的元素:\n");/*输入要插入的元素*/scanf("%d",&PP);ListInsert(A,pos,PP);c=GetLength(A);printf("该线性表的长度为:%d!\n",c);/*此处选择是重新选择操作还是按顺序进行下一项操作*/printf("请输入0结束操作或者其他任意数继续其他操作^_^\n");scanf("%d",&Judge1);if(Judge1==1)continue;else break;case 2:printf("输入要删除元素的位置:");/*选择要删除的元素位置*/scanf("%d",&a);ListDelete(A,a);c=GetLength(A);printf("该线性表的长度为:%d!\n",c);/*此处选择是重新选择操作还是按顺序进行下一项操作*/printf("请输入0结束操作或者其他任意数继续进行其他操作^_^\n");scanf("%d",&Judge1);if(Judge1==1)continue;else break;case 3:c=GetLength(A);printf("该线性表的长度为:%d!\n",c);printf("请输入0结束操作或者其他任意数继续进行其他操作^_^\n");scanf("%d",&Judge1);if(Judge1==1)continue;else break;case 4:{c=GetLength(A);int d=0;printf("%s"," 该线性表数据记录如下\n");printf("%s","*****************************************************\n");for(int aa=0;aa<c;aa++){printf(" ");printf("%d \t",A.data[aa]); d++;/*打印该线性表*/if( d%4 ==0) printf("\n");}printf("\n");printf("%s","*****************************************************\n");printf("请输入0结束操作或者其他任意数继续进行其他操作^_^\n");scanf("%d",&Judge1);if(Judge1==1)continue;else break;}case 5:{fp=fopen("Test.txt","wt+");int i=0,j=0;fprintf(fp,"%s"," 文件Test数据记录\n");fprintf(fp,"%s","_________________________\n");for(i=0;i<GetLength(A);){fprintf(fp,"%d",A.data[i]);i++;fputc('\t',fp);j++;if(j%4==0) fputc(10,fp);} ;fprintf(fp,"%s","\n_________________________");fclose(fp);printf("相关数据已经存入文件Test.txt中^_^\n");printf("请输入0结束操作或者其他任意数继续进行其他操作^_^\n");scanf("%d",&Judge1);if(Judge1==1)continue;else break;}case 6:{int i,j,temp;for(i=0;i<GetLength(A)-1;i++)for(j=i+1;j<GetLength(A);j++) /*注意循环的上下限*/{if(A.data[i]>A.data[j]){temp=A.data[i];A.data[i]=A.data[j];A.data[j]=temp;}}c=GetLength(A);int d=0;printf("%s","排序后该线性表数据记录如下\n");printf("%s","**************************\n");for(int aa=0;aa<c;aa++){printf("%d \t",A.data[aa]); d++;/*打印该线性表*/if( d%4 ==0) printf("\n");}printf("\n");printf("%s","**************************\n");printf("请输入0结束操作或者其他任意数继续进行其他操作^_^\n");scanf("%d",&Judge1);if(Judge1==1)continue;else break;}case 7:{int value;printf("请输入待查找的数据:\n");scanf("%d",&value);for(int i=0;i<GetLength(A);){if(A.data[i] == value)printf("待查找的是表中第%d个数据%d^_^\n",i+1,value);else if(i>=(GetLength(A)-1)) printf("待查找的数据不存在+_+\n");i++;}printf("请输入0结束操作或者其他任意数继续进行其他操作^_^\n");scanf("%d",&Judge1);if(Judge1==1)continue;else break;}}printf("请输入0 结束程序或者输入其他任意数继续进行操作^_^\n");scanf("%d",&Judge);}return 0;}四、实验数据记录1,生成长度为8的线性表2,选择插入数据3,删除数据4,打印表5,保存数据6,排序7,查找数据五、实验总结实验在编写源程序是由于参考给的参考程序较多,但是参考程序存在一定的问题且相当不完善,走了弯路。
数据结构(C语言版) 线性表 详细举例介绍
}
} // union
O(ListLength2(Lb))
算法2.1’’
试改变结构, 选用有序表表示集合。
有序表: 其数据元素依值从小 到大(非递减)有序排列的 线性表。
例如: (2,3,3,5,6,6,6,8,12)
void purge(List &La, List Lb) {
(求数据元素的后继)
初始条件: 线性表L已存在。
若cur_e是L的元素,但不是 操作结果:
最后一个,则用next_e返回它 的后继,否则操作失败, next_e无定义。
GetElem( L, i, &e ) (求线性表中某个数据元素)
线性表L已存在, 初始条件: 且 1≤i≤LengthList(L)
算法2.1’’
InitList(LA); La_len = ListLength(La); Lb_len =ListLength(Lb); // 求线性表的长度
for (i = 1; i <= Lb_len; i++) { GetElem(Lb, i, e);
// 取Lb中第i个数据元素赋给e
if (ListEmpty(La) || !equal (en, e)) { ListInsert(La, ++La_len, e); 算法2.1’ en = e;
} // La中不存在和 e 相同的数据元素,则插入之
}
}
O(ListLength(Lb))
例2-2 (教材P.20)
归并两个“其数据元素按值非递减有 序排列”的线性表 LA 和 LB,求得线性 表 LC 也具有同样特性。
数据结构中的,线性表的c语言表示和插入,删除,查找操作程序
数据结构中的,线性表的c语言表示和插入,删除,查找操作程序#include#include#define MaxSize 100typedef struct {int data[MaxSize];int length;} SqList;void InitList(SqList *L) { // 传入的参数用指针L->length = 0;return;}int GetLength(SqList L) {return L.length;}int GetElem(SqList L, int i, int *e) {if (i < 1 || i > L.length){ /*无效的i值*/return 0;}else {*e = L.data[i - 1]; //改变指针的值前面用*return 1;}}int Locate(SqList L, int x) /*按值查找*/{int i = 0;while (L.data[i] != x){ /*查找值为x的第1个结点*/i++;}if (i > L.length){return (0); /*未找到*/}else{return (i+1);}}int InsElem(SqList *L, int x, int i) {int j;if (i < 1 || i > L->length +1){ /*无效的参数i*/return 0;}for (j = L->length; j >= i; j--) { /*将位置为i的结点及之后的结点后移*/ L->data[j] = L->data[j - 1];}L->data[i - 1] = x; /*在位置i处放入x*/L->length++; /*线性表长度增1*/return 1;}int DelElem(SqList *L, int i) {int j;if (i < 1 || i > L->length){ //删除时,i大于线性表的长度return 0;}for (j = i; j < L->length; j++){L->data[j - 1] = L->data[j];}L->length--;return 1;}void DispList(SqList L) {int i;for (i = 1; i <= L.length; i++){printf("%c", L.data[i - 1]);}printf("\n");}int main() {int i;int e;SqList L;InitList(&L); // 参数是指针时,实参应为地址int chr;memset(&L,0,sizeof(L));while ((chr = getchar())!= '\n'){InsElem(&L, chr, L.length+1); //连续插入元素} printf("线性表:");DispList(L);printf("长度:%d\n", GetLength(L));i = 3;GetElem(L, i, &e);printf("第%d个元素:%c\n", i, e);e = 'a';printf("元素%c是第%d个元素\n", e, Locate(L, e));i = 4;printf("删除第%d个元素\n", i);DelElem(&L, i);printf("线性表:");DispList(L);return 0; }。
数据结构——使用C语言版(朱战立)线性表
数据域 指针域 或
data next
数据域:存储元 素数值数据
指针域:存储直接后继的存
储位置
第二十一页,编辑于星期三:三点 分。
(2)头指针、头结点和首元结点的区别
示意图如下:
hea d
头指针
a0
a1
头结点
首元结点
…
an ^
第二十二页,编辑于星期三:三点 分。
头指针是指向链表中第一个结点(或为头结点、或为首元结点 )的指针;
struct Node *next;
} SLNode
(1)初始化ListInitiate(head)
void ListInitiate(SLNode **head)
{ *head = (SLNode *)malloc(sizeof(SLNode));
(*head)->next = NULL;
}
第三十页,编辑于星期三:三点 分。
L->list[j] = L->list[j-1];
L->list[i] = x;
L->size ++;
return 1;
}
}
第八页,编辑于星期三:三点 分。
0
1
2
3
4
5
list
10
11
12
14
15
16
6
7
... MaxSize-1
i=3
size=6
0
1
2
3
4
5
6
7
list
10
11 i=3 12
13
(1)单链表中构成链表的结点只有一个指向直接后继结点的指针域 。其结构特点:逻辑上相邻的数据元素在物理上不一定相邻。
数据结构实验报告--
数据结构实验报告--实验一、线性表的实现线性表是常用的数据结构之一,其中最常用的是顺序存储结构。
本实验使用C语言实现了顺序存储结构的线性表。
首先,定义了一个结构体来表示线性表:```#define MAXSIZE 100 //线性表最大长度typedef struct {int data[MAXSIZE]; //存放线性表元素int length; //线性表当前长度} SqList; //线性表类型定义```其中,data数组存放线性表元素,length表示线性表当前长度。
接着,定义了三个基本操作:1. 初始化线性表```void InitList(SqList *L) {L->length = 0;}```2. 插入元素```bool ListInsert(SqList *L, int i, int e) {if (i < 1 || i > L->length + 1) { //插入位置不合法}if (L->length >= MAXSIZE) { //线性表已满return false;}for (int j = L->length; j >= i; j--) { //将第i个位置之后的所有元素后移一位L->data[j] = L->data[j - 1];}L->data[i - 1] = e; //将元素e插入到第i个位置L->length++; //线性表长度加1return true;}```3. 删除元素以上三个操作就是线性表的基本操作,通过这三个操作就能完成线性表的所有操作。
实验二、栈和队列的实现2.1 栈的实现栈是一种后进先出(Last In First Out)的数据结构。
我们可以用线性表来实现栈,只需要对线性表的插入和删除操作进行限制就行了。
具体实现如下:void InitStack(Stack *S) {S->top = -1; //初始化栈顶指针}bool Push(Stack *S, int e) {if (S->top == STACK_SIZE - 1) { //栈已满,无法插入元素}S->top++; //栈顶指针加1S->data[S->top] = e; //插入元素e到栈顶return true;}以上代码实现了栈的初始化、入栈和出栈操作。
数据结构线性表操作实验报告
《数据结构》实验报告实验题目:线性表的操作实验目的:1.掌握上机调试线性表的基本方法;2.掌握线性表的一些基本操作;实验内容:将两个有序链表合并为一个有序链表一、需求分析1.实验程序中先创建两个有序链表,演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入两个链表中的相应数据。
2.将两个链表合并时可按数据从大到小或从小到大合并,用户根据提示可选择一种排序方式。
3.程序执行命令包括:(1)构造链表;(2)输入数据;(3)合并两个链表,根据用户需求选择一种排序方式;(4)将合并结果输出;(5)结束4.测试数据:链表1数据为:2,4,6,7,10链表2数据为:1,3,5,6,7,12按从小到达合并为:1,2,3,4,5,6,6,7,7,10,12;按从大到小合并为:12,10,7,7,6,6,5,4,3,2,1;二、概要设计1.基本操作Linklist creat ()操作结果:构造一个链表,并输入数据,返回头节点指针。
void print(Linklist head)初始条件:链表已存在;操作结果:将链表输出。
void MergeList_1(Linklist La,Linklist Lb)初始条件:有序线性链表La 和Lb 已存在;操作结果:将La 和Lb 两个链表按从小到大的顺序合并。
void MergeList_2(Linklist La,Linklist Lb)初始条件:有序线性链表La 和Lb 已存在;操作结果:将La 和Lb 两个链表按从大到小的顺序合并。
2.本程序包括四个模块:(1)主程序模块;(2)链表数据输入模块;(3)链表合并模块;(4)链表输出模块;三、详细设计1.元素类型,节点类型,指针类型主程序模块 数据输入 按从小到大合并两链表 按从大到小合并两链表 将新链表输出 将新链表输出typedef struct LNode //定义节点{int data;struct LNode *next;}LNode,* Linklist;2.每个模块的分析(1)主函数模块int main(){Linklist head1,head2;int i;printf("请输入链表1数据(由小到大,输入0表示输入结束):\n");head1=creat(); //创建链表1,将头结点指针返回为head1printf("请输入链表2数据(由小到大,输入0表示输入结束):\n");head2=creat();printf("请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并):");scanf("%d",&i); //创建链表2,将头结点指针返回为head2if(i==1) //选择两种排序方式,如果输入1,则合并后按从小到大输出;输入其它数,合成链表按从大到小输出{printf("按小到大将两表合并得:\n");MergeList1(head1,head2); //将创建好的两表的头结点地址head1,head2作为函数参数}else{ printf("按从大到小将两表合并得:\n");MergeList2(head1,head2); //将创建好的两表的头结点地址head1,head2作为函数参数}return 0;}(2)数据输入创建链表模块Linklist creat() //创建链表函数,并将创建链表的头结点指针返回{Linklist head,p,s;int z=1,x;head=(LNode *) malloc(sizeof(LNode));p=head;while(z){scanf("%d",&x);if(x!=0) //输入0表示链表数据输入结束{s=(LNode *)malloc(sizeof(LNode));s->data=x;p->next=s;s->next=NULL;p=s;}elsez=0;}return(head);}(3)合并链表模块,两个函数分别表示两种排序方式,将链表合并后直接在函数中调用链表输出函数void print(Linklist head)将链表输出void MergeList_1(Linklist La,Linklist Lb)//已知链表La和Lb元素都按从小到大排列,将La和Lb合并成新链表,其中元素也按从小到大排列{Linklist pa,pb,pc,Lc;pa = La->next; pb = Lb->next;Lc = pc = La; //把La的头节点作为新建链表Lc的头结点while (pa && pb){if (pa->data <= pb->data){pc->next = pa;pc = pa;pa = pa->next;}else{pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb; //插入剩余段print(Lc); //将链表Lc输出}void MergeList_2(Linklist La,Linklist Lb)//已知链表La和Lb的元素都按从小到大排列,合并La和Lb得到新链表,其中元素按照从大到小的顺序排列{Linklist pa,qa,pb,qb,Lc; //设指针qa,qb,分别作为pa,pb的前驱的指针pa=La->next;pb=Lb->next;Lc=La;Lc->next=NULL;while(pa&&pb){if(pa->data<=pb->data){qa=pa;pa=pa->next;qa->next=Lc->next;Lc->next=qa;}else{qb=pb;pb=pb->next;qb->next=Lc->next;Lc->next=qb;}}while(pa) //如果pa不为空,则将La链的剩余段倒叙插入到头节点的后面{qa=pa;pa=pa->next;qa->next=Lc->next;Lc->next=qa;}while(pb) //如果pb不为空,则将Lb链的剩余段倒叙插入到头结点的后面{qb=pb;pb=pb->next;qb->next=Lc->next;Lc->next=qb;}print(Lc); //将新合成的链表Lc输出}(4)链表输出模块,实现最终链表的输出void print(Linklist head) //链表输出函数,将链表输出{LNode *p;p=head->next;if(head!=NULL)do{printf("%d ",p->data);p=p->next;} while (p);printf("\n");四、程序使用说明及测试结果1.程序使用说明(1)本程序的运行环境为VC6.0;(2)进入演示程序后显示提示信息:请输入链表1数据(由小到大,输入0表示输入结束):按要求输入数据请输入链表2数据(由小到大,输入0表示输入结束):按要求输入数据请选择排序方式(输入1则从小到达合并,输入其它整数则按从大到小合并):输入数据选择合并方式2.测试结果对链表1输入数据2,4,6,7,10,0对链表2输入数据1,3,5,6,7,12,0输入数据选择排序方式:如果输入:1 输出结果为:1,2,3,4,5,6,6,7,7,10,12如果输入:3(整数非1)输出结果为:12,10,7,7,6,6,5,4,3,2,13.调试中遇到的错误分析第一次运行时有问题,看以看出它的排序方式是对的,但是输出是多出前面一个很大的数,可能是输出函数void print(Linklist head)有问题,检查程序:此处逻辑出错,直接将p指针指向head,然后就将p->data输出,因此第一个数是头指针head所对应节点的值,所以可将p=head;改为p=head->next;这样p就指向第一个节点。
数据结构实验 C语言版 线性表__C版
2. 求表长
L.length
3. 取第i个元素
L.elem[i-1]
(0<i<L.length+1)
18
4. 元素定位操作
分析:依次取出每个元素和给定值进行比较 int LocateElem_Sq (SqList L, ElemType e, Status (*compare)(ElemType, ElemType))
6. 删除操作
线性表的删除运算是指将表的第i(1≦i≦n)个元 素删除,使长度为n的线性表: (a1,…a i-1,ai,a i+1…,an) 变成长度为n-1的线性表 (a1,…a i-1,a i+1,…,an)
操作步骤: ① 判断线性表是否为空 ② 判断i值是否合法:1≦i≦n ③ 元素前移 ④ 表长减1
2
线性结构:数据元素之间存在1对1的关系。 四个特征: ① 存在惟一的一个“第一元素” ② 存在惟一的一个“最后元素” ③ 除最后元素外,其它元素均有惟一的“后继” ④ 除第一元素外,其它元素均有惟一的“前驱”
3
2.1 线性表的类型定义
一.定义
线性表(Linear List) :由n(n≧0)个数据元素组成的 有限序列。记作: (a1,a2,…an) 其中数据元素的个数n定义为表的长度。当n=0时称 为空表 这里的数据元素ai(1≦i≦n)只是一个抽象的符号, 其具体含义在不同的情况下可以不同。 例1、26个英文字母组成的字母表 (A,B,C、…、Z) 例2、某校从1978年到1983年各种型号的计算机拥 有量的变化情况。 4 (6,17,28,50,92,188)
思考:若要直接查相等的呢?
19
5. 插入操作
线性表的插入运算是指在表的第i(1≦i≦n+1)个位置上,插 入一个新元素e,使长度为n的线性表(a1,…a i-1,ai,…,an) 变成长度为n+1的线性表 (a1,…a i-1,e,ai,…,an) 操作步骤: ① 判断i是否符合要求:1≦i≦n+1 ② 判断表长是否溢出 ③ 元素右移 ④ 插入 ⑤ 表长增1
数据结构实验报告1线性表的顺序存储结构
数据结构实验报告1线性表的顺序存储结构一、实验目的本次实验的主要目的是深入理解线性表的顺序存储结构,并通过编程实现其基本操作,包括创建线性表、插入元素、删除元素、查找元素以及输出线性表等。
通过实际操作,掌握顺序存储结构的特点和优势,同时也了解其在不同情况下的性能表现。
二、实验环境本次实验使用的编程语言为C++,编译环境为Visual Studio 2019。
三、实验原理1、线性表的定义线性表是由 n(n≥0)个数据元素组成的有限序列。
在顺序存储结构中,线性表的元素存储在一块连续的存储空间中,通过数组来实现。
2、顺序存储结构的特点存储密度高,无需额外的指针来表示元素之间的关系。
可以随机访问表中的任意元素,时间复杂度为 O(1)。
插入和删除操作需要移动大量元素,平均时间复杂度为 O(n)。
四、实验内容及步骤1、定义线性表的数据结构```cppdefine MAX_SIZE 100 //定义线性表的最大长度typedef struct {int dataMAX_SIZE; //存储线性表元素的数组int length; //线性表的当前长度} SeqList;```2、初始化线性表```cppvoid InitList(SeqList L) {L>length = 0; //初始时线性表长度为 0}```3、判断线性表是否为空```cppbool ListEmpty(SeqList L) {return (Llength == 0);}```4、求线性表的长度```cppint ListLength(SeqList L) {return Llength;}```5、按位查找操作```cppint GetElem(SeqList L, int i) {if (i < 1 || i > Llength) {printf("查找位置不合法!\n");return -1;}return Ldatai 1;}```6、按值查找操作```cppint LocateElem(SeqList L, int e) {for (int i = 0; i < Llength; i++){if (Ldatai == e) {return i + 1;}}return 0; //未找到返回 0}```7、插入操作```cppbool ListInsert(SeqList L, int i, int e) {if (L>length == MAX_SIZE) {//表已满printf("表已满,无法插入!\n");return false;}if (i < 1 || i > L>length + 1) {//插入位置不合法printf("插入位置不合法!\n");return false;}for (int j = L>length; j >= i; j) {//移动元素L>dataj = L>dataj 1;}L>datai 1 = e; //插入元素L>length++;//表长加 1return true;}```8、删除操作```cppbool ListDelete(SeqList L, int i) {if (L>length == 0) {//表为空printf("表为空,无法删除!\n");return false;}if (i < 1 || i > L>length) {//删除位置不合法printf("删除位置不合法!\n");return false;}for (int j = i; j < L>length; j++){//移动元素L>dataj 1 = L>dataj;}L>length; //表长减 1return true;}```9、输出线性表```cppvoid PrintList(SeqList L) {for (int i = 0; i < Llength; i++){printf("%d ", Ldatai);}printf("\n");}```10、测试用例```cppint main(){SeqList L;InitList(&L);ListInsert(&L, 1, 10);ListInsert(&L, 2, 20);ListInsert(&L, 3, 30);ListInsert(&L, 4, 40);ListInsert(&L, 5, 50);printf("线性表的长度为:%d\n", ListLength(L));printf("查找第 3 个元素:%d\n", GetElem(L, 3));int loc = LocateElem(L, 30);if (loc) {printf("元素 30 的位置为:%d\n", loc);} else {printf("未找到元素 30\n");}ListDelete(&L, 3);printf("删除第 3 个元素后的线性表:");PrintList(L);return 0;}```五、实验结果及分析1、实验结果成功创建并初始化了线性表。
线性表实验报告
线性表实验报告实验目的:掌握线性表的基本概念和实现方式,熟悉线性表的各种操作。
实验原理:线性表是由同类型的数据元素构成的有序序列。
在线性表中,除了第一个元素外,每个元素都有且仅有一个直接前驱元素;除了最后一个元素外,每个元素都有且仅有一个直接后继元素。
本实验主要通过C语言的实现,实现了线性表的基本操作,包括初始化、插入、删除、查找等。
实验内容:1.初始化线性表:定义一个长度为n的结构体数组,用于存储线性表的元素,同时设置线性表的长度为0。
2.插入元素:在指定位置pos后插入元素elem,首先判断线性表是否已满,若已满则无法插入;若未满,则将pos后的所有元素往后移动一位,然后将elem插入到pos位置,最后将线性表的长度加1。
3.删除元素:删除指定位置pos的元素,首先判断线性表是否为空或pos是否合法,若为空或pos不合法则无法删除;若合法,则将pos后的所有元素往前移动一位,最后将线性表的长度减1。
4.查找元素:按照元素值查找元素在线性表中的位置,首先判断线性表是否为空,若为空则无法查找;若不为空,则遍历线性表,逐一比较元素值,找到则返回其位置,找不到则返回-1。
5.输出线性表:按顺序输出线性表中的元素值。
实验结果:经过测试,线性表的各种操作均实现了。
可以正确地初始化、插入、删除、查找元素,并成功输出线性表中的元素值。
实验总结:通过本实验,我对线性表的概念和实现方式有了更深入的了解,并通过C语言的实现掌握了线性表的各种操作。
线性表是数据结构中最基本、最简单的一种,但在实际应用中非常广泛。
掌握了线性表的操作,对于理解和应用其他更复杂的数据结构具有重要的意义。
C语言数据结构-线性表SqList
C语⾔数据结构-线性表SqList #ifndef __SQLLIST_H__#define __SQLLIST_H__#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLF -1#define OVERFLOW -2#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef int Status;typedef int ElemType;typedef struct {ElemType *elem;ElemType length;ElemType listsize;}SqList;#endif#include"SeqList.h"#include<stdlib.h>#include<stdio.h>Status initList_Sq(SqList &L) {L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));if(!L.elem) {exit(OVERFLOW);}L.length = 0;L.listsize = LIST_INIT_SIZE;return OK;}Status listInsert(SqList &L, int i, ElemType e) {if(i < 1 || i > L.length + 1){return ERROR;}if(L.length > L.listsize) {ElemType *newbase = (ElemType *)realloc(L.elem,(L.listsize + LISTINCREMENT) * sizeof(ElemType));if(!newbase) {exit(OVERFLOW);}L.elem = newbase;L.listsize += LISTINCREMENT;}ElemType *q = &(L.elem[i - 1]);for(ElemType *p = &(L.elem[L.length - 1]); p >= q; --p) {*(p + 1) = *p;}*q = e;++L.length;return OK;}void pShow(SqList L){printf("======= SqList ======\n");if(L.length != 0) {ElemType *t = L.elem;for(int i = 0; i < L.length; i++) {printf("L.elem[%d] = %d\n", i, t[i]);}} else {}printf("L.length = %d\n", L.length);printf("L.listsize = %d\n", L.listsize);}Status GetElem(SqList &L, int i, ElemType &e) {if(i > L.length || i < 1) {exit(OVERFLOW);}e = L.elem[i - 1];return OK;}Status LocateElem_Sq(SqList L, ElemType e) {ElemType i = 1;ElemType *p = L.elem;while(i <= L.length && *p++ != e) {++i;}if(i <= L.length) {return i;} else{return 0;}}Status ListLength(SqList L) {return L.length;}void Union(SqList &a, SqList b) {ElemType a_len = ListLength(a);ElemType b_len = ListLength(b);ElemType e;for (int i = 1; i <= b_len; ++i){/* code */GetElem(b, i, e);if(!LocateElem_Sq(a, e)) {listInsert(a, ++a_len, e);}}}void MergeList(SqList la, SqList lb, SqList &Lc) {initList_Sq(Lc);ElemType i = 1;ElemType j = 1;ElemType k = 0;ElemType La_len = ListLength(la);ElemType Lb_len = ListLength(lb);ElemType ai, bj;while((i <= La_len) && (j <= Lb_len)) {GetElem(la, i, ai);GetElem(lb, j, bj);if(ai <= bj) {listInsert(Lc, ++k, ai);++i;} else{listInsert(Lc, ++k, bj);++j;}}while(i <= La_len) {GetElem(la, i++, ai);listInsert(Lc, ++k, ai);}while(j <= Lb_len) {GetElem(lb, j++, bj);listInsert(Lc, ++k, bj);}}Status ListDelete_Sq(SqList &L, int i, ElemType &e) { if(i < 1 || (i > L.length)) {return ERROR;}ElemType *p = &(L.elem[i - 1]);e = *p;ElemType *q = L.elem + L.length - 1;for(++p; p <= q; ++p) {*(p -1) = *p;}--L.length;return OK;}int main() {ElemType e;SqList L;initList_Sq(L);for (int i = 0; i < 10; ++i){/* code */listInsert(L, i + 1, i);}SqList t;initList_Sq(t);for (int i = 0; i < 10; ++i){/* code */listInsert(t, i + 1, i + 10);}GetElem(L, 5, e);printf("l5 = %d\n", e);ElemType index = 6;ElemType value = LocateElem_Sq(L, index);printf("index = %d, value = %d\n", index, value); SqList r;MergeList(L, t, r);pShow(r);SqList a;initList_Sq(a);listInsert(a, 1, 3);listInsert(a, 2, 5);listInsert(a, 3, 8);listInsert(a, 4, 11);SqList b;initList_Sq(b);listInsert(b, 1, 2);listInsert(b, 2, 6);listInsert(b, 3, 8);listInsert(b, 4, 9);listInsert(b, 5, 11);listInsert(b, 6, 15);listInsert(b, 7, 20);SqList c;MergeList(a, b, c);pShow(c);Union(a, b);pShow(a);ListDelete_Sq(b, 6, e);pShow(b);return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
p=p->next; h=p->next; p->next=p->next->next; h->next=p->next->next; p->next->next=h; p->next->next->next=h->next; //free(h); //以下为链表的输出 p=L->next; printf("交换后输出\n"); while(p!=NULL) { printf("%d\n",p->num); p=p->next; } //以下为链表的倒置 p=L; while(p->next->next!=NULL) p=p->next; q=p->next; q->next=p; p->next=NULL; p=L; for(i=0;i<4;i++) {while(p->next->next!=NULL) p=p->next; k=p->next; k->next=p; p->next=NULL; p=L; } L->next=q;
课题一的具体实验内容 1、构造元素类型为整型的线性表,将以下元素插入分别插入线性 表: <34 56 20 9 15 5> 2、查找表中是否存在元素20,实现元素20与元素9的交换; 3、按照课题要求编写函数,实现线性表元素<34 56 9 20 15 5>的倒 置,即倒置后的表应为< 5 15 20 9 56 34 >。 #include<stdio.h> #include<stdlib.h> #define NULL 0 struct node { int num; struct node *next; }; void main() { int i; struct node *L,*s,*p,*h,*q,*k; L=(node*)malloc(sizeof(struct node)); //L->num=NULL; p=L; printf("请输入\n"); for(i=0;i<6;i++) { s=(node*)malloc(sizeof(struct node)); scanf("%d",&s->num); p->next=s; p=s; } p->next=NULL; //以上为链表的建立和输入 //以下为元素的交换 p=L; while(p->next->numgt;next; printf("倒置后输出\n"); while(p!=NULL) { printf("%d ",p->num); p=p->next; } }