实验一 线性表操作实验题目
实验01 线性表的基本操作

实验01 线性表的基本操作一、实验目的1. 了解线性表的结构特点及有关概念;2. 理解线性表的存储结构;3. 掌握顺序表及单链表的基本操作算法。
二、实验内容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.顺序表初始化:(1)为顺序表L动态分配一个预定大小的数组空间,使elem 指向这段空间的基地址。
(2)将表的当前长度设为0.2.顺序表的取值:(1)判断指定的位置序号i值是否合理(1<=i<=L.length),若不合理则返回ERROR.(2)若i值合理,则将i个数据元素L.elem[i]赋给参数e,通过e返回第i个数据元素的传值。
3.顺序表的查找:(1)从第一个元素起,依次和e相比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1.(2)若查遍整个顺序表都没要找到,则查找失败,返回0.4.顺序表的插入:(1)判断插入位置i是否合法(i值的合法范围是1<=i<=n+1),若不合法则返回值ERROR.(2)判断顺序表的存储空间是否已满,若满则返回值ERROR(3)将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动)。
实验一 线性表的应用

voidInitializeSource(SourceTp *source);
voidSeqInsertVote(VoteTp *vote,inti,ElemTp x);
intSeqLocate(VoteTp v,ElemTp x);
}
}
voidInitializeVote(VoteTp *vote)
{
vote->len=0;
}
voidInitializeSource(SourceTp *Source)
{/*初始化备选数表Source,在表中放入1~3 6共3 6个数,将表长置为36 */
inti;
for(i=1;i<=NN;i++)
#defineMM 7
#defineNN 36
typedefintElemTp;
typedefstruct
{ ElemTp elem[MM+1];
intlen;
} VoteTp;
typedefstruct
{ ElemTp elem[NN+1];
intlen;
} SourceTp;
SourceTp source;
判断中奖情况,就是先初始化猜对号码个数为0,再依次用中奖号码表中的每个号码,在一张彩票号码表中查找,若有,猜对号码个数加1。处理完毕,猜对号码个数即可反映中奖情况。
3.解决方案
(1)彩票号码表、备选数表的存储结构类型定义
#define MM 7/*彩票中号码的个数*/
#define NN 36/*选数的个数*/
备选数表的初始化,备选数表初始状态含有1~36这36个数,元素间的顺序没有意义。
实验一:线性表应用

实验报告学院(系)名称:计算机与通信工程学院 姓名**学号 ********专业计算机科学与技术班级 2015级*班 实验项目实验一:线性表应用课程名称 数据结构与算法 课程代码 0661013 实验时间2017年3月9日第一节实验地点 7-219 考核标准 实验过程 25分程序运行 20分回答问题15分 实验报告30分 特色 功能5分考勤违纪情况 5分 成绩成绩栏其它批改意见: 教师签字:考核内容 评价在实验课堂中的表现,包括实验态度、编写程序过程等内容等。
□功能完善,□功能不全□有小错□无法运行○正确 ○基本正确○有提示○无法回答○完整 ○较完整○一般 ○内容极少 ○无报告○有 ○无 ○有 ○无一、实验目的? (1)将多项式各项的系数和指数分别存在A、B两个链表的中。
? (2)用指针Pa、Pb分别指向连个链表的首元素。
? (3)遍历两个链表,比较各元素的指数,若相同则相加减,将结果插入新表中,若不相等则将指数较小的插入新表中,继续向后遍历,直到其中一个链表到达表尾。
? (4)将另一表中的剩余元素按指数大小顺序全部插入到新表中。
? (5)新表中的元素按规定格式输出既为相加或相减后的多项式。
? 3、?? (1)通过构造函数创建单链表? (2)通过循环变量temp找到第一个链表的尾部设为p。
? (3)使p的next指向第二个链表的第一个元素? (4)将连接后的两链表输出? 4、? (1)用两个变量minZ,maxZ分别存储输入的最小值和最大值? (2)遍历整个单链表,将小于minZ和大于maxZ的节点删除? (3)输出操作后的单链表? 算法的实现和测试结果:包括算法运行时的输入、输出,实验中出现的问题及解决办法等? 出现问题? 无法返回操作后的单链表? 解决办法? 经老师直到后,在相关函数前面加*成功返回操作后的单链表? 1、3、4、? 算法时间复杂度分析? 1、O(1表长度+2表长度)---------------可视为O(n)? 3、O(1表长度+2表长度)---------------可视为O(n)? 4、O(n)?四、收获与体会线性表分为顺序表和链表,其中顺序表已相当熟悉,主要练了新接触的链表,感觉现在才真正体会到指针的魅力之处。
实验一线性表的基本操作

实验⼀线性表的基本操作⼀、线性结构的顺序表基本操作实验⽬的1.学会定义单链表的结点类型、线性表的顺序存储类型,实现C程序的基本结构,对线性表的⼀些基本操作和具体的函数定义。
2.掌握顺序表的基本操作,实现顺序表的插⼊、删除、查找以及求并集等运算。
3.掌握对多函数程序的输⼊、编辑、调试和运⾏过程。
实验要求1.预习C语⾔中结构体的定义与基本操作⽅法。
2.对顺序表的每个基本操作⽤单独的函数实现。
3.编写完整程序完成下⾯的实验内容并上机运⾏。
实验内容1.编写程序实现顺序表的下列基本操作:(1)初始化顺序表La。
(2)将La置为空表。
(3)销毁La。
(4)在La中插⼊⼀个新的元素。
(5)删除La中的某⼀元素。
(6)在La中查找某元素,若找到,则返回它在La中第⼀次出现的位置,否则返回0。
(7)打印输出La中的元素值。
2.(选做)编写程序完成下⾯的操作:(1)构造两个顺序线性表La和Lb,其元素都按值⾮递减顺序排列。
(2)实现归并La和Lb得到新的顺序表Lc,Lc的元素也按值⾮递减顺序排列。
(3)假设两个顺序线性表La和Lb分别表⽰两个集合A和B,利⽤union_Sq操作实现A=A∪B。
⼆、单链表基本操作(选做)实验⽬的1. 学会定义单链表的结点类型、线性表的链式存储类型,实现对单链表的⼀些基本操作和具体的函数定义,了解并掌握单链表的类定义以及成员函数的定义与调⽤。
2. 掌握单链表基本操作及两个有序表归并、单链表逆置等操作的实现。
实验要求1.预习C语⾔中结构体的定义与基本操作⽅法。
2.对单链表的每个基本操作⽤单独的函数实现。
3.编写完整程序完成下⾯的实验内容并上机运⾏。
实验内容1.编写程序完成单链表的下列基本操作:(1)初始化单链表La。
(2)在La中插⼊⼀个新结点。
(3)删除La中的某⼀个结点。
(4)在La中查找某结点并返回其位置。
(5)打印输出La中的结点元素值。
2.构造⼀个单链表L,其头结点指针为head,编写程序实现将L逆置。
《软件技术基础》实验指导

说明每个实验题目含有一个main函数和一些函数, 与实验题目相关的基本运算的函数定义和main函数定义的代码在附录以及对应的文件夹中给出, 供上机实验参考使用。
对于每个题目, 只需要根据题目要求设计算法, 补充函数定义, 然后对程序进行编译、调试。
实验一线性表一、实验目的1.熟悉线性表的顺序和链式存储结构2.掌握线性表的基本运算3.能够利用线性表的基本运算完成线性表应用的运算二、实验内容设有一个线性表E={e1, e2, …, en-1, en}, 设计一个算法, 将线性表逆置, 即使元素排列次序颠倒过来, 成为逆线性表E’={ en , en-1 , …, e2 , e1 }, 要求逆线性表占用原线性表空间, 并且用顺序表和单链表两种方法表示, 分别用两个程序来完成。
(文件夹: 顺序表逆置、单链表逆置)已知由不具有头结点的单链表表示的线性表中, 含有三类字符的数据元素(字母、数字和其他字符), 试编写算法构造三个以循环链表表示的线性表, 使每个表中只含有同一类的字符, 且利用原表中的结点空间, 头结点可另辟空间。
(文件夹: 分解单链表)实验二栈和队列一、实验目的1.熟悉栈和队列的顺序和链式存储结构2.掌握栈和队列的基本运算3.能够利用栈和队列的基本运算完成栈和队列应用的运算二、实验内容1.设单链表中存放有n个字符, 试编写算法, 判断该字符串是否有中心对称的关系, 例如xyzzyx是中心对称的字符串。
(提示: 将单链表中的一半字符先依次进栈, 然后依次出栈与单链表中的另一半字符进行比较。
)(文件夹: 判字符串中心对称)假设以数组sequ[m]存放循环队列的元素, 同时设变量rear和quelen 分别指示循环队列中队空的条件:sq->quelen==0;队满的条件:sq->quelen==m。
(文件夹:循环队列)实验三串一、实验目的1.熟悉串的顺序存储结构2.掌握串的基本运算及应用二、实验内容1. 串采用顺序存储结构, 编写朴素模式匹配算法, 查找在串中是否存在给定的子串。
数据结构实验一线性表的顺序

数据结构实验一线性表的顺序存储结构实验一:线性表的顺序存储结构实验学时:2验证实验类型:、实验目的:1.熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;2.以线性表的各种操作(建立、插入、删除等)的实现为重点;3.掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;二、实验内容:1•输入一组整型数据,建立顺序表。
2•实现该线性表的删除。
3.实现该线性表的插入。
4.实现线性表中数据的显示。
5.实现线性表数据的查找和定位5、编写一个主函数,调试上述算法。
三、实验原理、方法和手段1•根据实验内容编程,上机调试、得出正确的运行程序。
2.编译运行程序,观察运行情况和输出结果3.写出实验报告(包括源程序和运行结果)。
四、实验条件运行Visual C++的微机一台五、实验步骤(程序清单):(一)、程序代码:#include "stdafx.h"#include <iostream>using namespace std;typedef int elemtype;struct list{elemtype *p;int size;int maxsize;};void buildlist(list &a, int b) /* 建立顺序表*/{if (b<=0){cout« "数据有误"<<endl;}a.p= new elemtype[b];if (a.p==NULL){coutvv "动态可分配的空间用完,退出运行!" vvendl;}a.size=0;a.maxsize=b;}void clearlist(list &a) /* 清空线性表*/{if (a.p!=NULL){delete []a.p;a.p=NULL;}a.maxsize =0;a.size=0;}bool insertlist(list &a, int pos,elemtype b) /*向线性表中按给定的位置插入一个元素*/ int i;if (pos<=0||pos-1>a.size){cout« "位置无效"《endl;return false ;}if (a.maxsize<=a.size){a.p=(elemtype*)realloc(a.p,2*a.maxsize * sizeof (b));a.maxsize=2*a.maxsize;}for ( i=a.size;i>=pos;i--)a.p[i]=a.p[i-1];a.p[i]=b;a.size++;return true ;}bool deletelist(list &a, int pos) /*向线性表中按给定的位置删除一个元素*/{if (a.size==0){coutvv "线性表为空,删除无效!" vvendl;return false ;}if (pos<=0||pos>a.size){coutvv "位置无效"vvendl;return false ;}for (int i=pos-1;iva.size-1;i++)a.p[i]=a.p[i+1];a.size--;if (float (a.size)va.maxsize*0.4&&a.maxsize>10){a.p=(elemtype*)realloc(a.p,a.maxsize*0.5* sizeof (*(a.p)));a.maxsize=a.maxsize*0.5;}return true ;}bool getlist(list a, int pos,elemtype &item) /* 得到线性表中指定位置的元素*/{if (posv=0||pos>a.size){cout« "位置无效"《endl;return false ;} item=a.p[pos-1]; return true ;}int findlist(list a,elemtype b) /*从线性表中查找具有给定值的第个元素*/{for (int i=O;i<a.size;i++)if (a.p[i]==b)return i+1;return 0;}void display(list a) /*线性表中数据的显示*/{coutvv "顺序表元素个数为:"vva.size <<endl<< "所占内存单元为:"vva.maxsize* sizeof (*(a.p)) <<'字节"vvendlvv"数据为:";for (int i=0;iva.size;i++)coutvva.p[i]vv " ";coutvvendl;}void main(){list L;int i=10;int pos;elemtype a,b,c;buildlist(L,5);for (int j=0;jv10;j++){insertlist(L,j+1,i);i--;}display(L);coutvvendl;coutvv " 一、插入操作:"vvendl;coutvv "位置:";cin»pos;coutvv "数据:";cin>>a;if (insertlist(L,pos,a))coutvv "插入成功"vvendl;elsecout« "插入失败"《endl;display(L);cout<<endl;coutvv "二、删除操作:"vvendl;coutvv "位置:";cin»pos;if (deletelist(L,pos))coutvv "删除成功"vvendl;elsecoutvv "删除失败"vvendl;display(L);coutvvendl;coutvv "三、定位操作:"vvendl;coutvv "位置:";cin»pos;if (getlist(L,pos,b))coutvv "该位置数据为"vvbvvendl;elsecoutvv "定位失败"vvendl;coutvv "四、查找操作:"vvendl;coutvv "数据:";cin>>c;if (findlist(L,c))coutvv "线性表中第一个等于该数据的位置为"vvfindlist(L,c)vvendl;elsecoutvv "线性表中没有等于该数据的元素"vvendl;clearlist(L);}(二)、程序运行结果六、实验分析与总结:通过本次实验,我发现了自己身上很多的不足:1•不知道什么时候才需要将函数的返回类型弄成bool类型;2•在编写函数体的时候,对排除非法情况考虑不周;3•对申请、追加及删除动态空间的语法不熟悉;4.没有思路对算法进行优化,例如,不知道怎样将所申请的动态空间适当缩小或放大。
数据结构-实验一 线性表操作

实验一线性表操作
(一)实验内容
单链表的创建、合并和输出。
(二)实验目的
1.熟悉用Visual C++进行程序设计的方法。
2.掌握单链表的创建、查找、插入和合并等运算。
(三)实验题目
本实验要求实现以下功能:
1.从键盘输入顺序任意的5个整数,按有序插入的要求生成第一个有序
单链表,将该链表输出显示。
2.再从键盘输入顺序任意的5个整数,按有序插入的要求生成第二个有
序单链表,将该链表输出显示。
3.将这两个有序单链表合并成一个有序单链表,要求使用两个单链表
的原有空间进行合并,将生成的有序单链表输出显示。
(四)实验仪器设备
1.学生每个一台PC机
2.已安装环境。
实验一 线性表操作实验题目

实验一线性表操作实验目的:(1)掌握在顺序、链式存储结构上实现线性表的各种基本运算。
(2)重点掌握单链表的基本操作及应用。
(3)学会综合运用C语言中函数、指针、结构体等知识进行编程。
本次实验中,下列实验项目选做一。
1、顺序表的综合操作[问题描述]设计算法,实现线性结构上的顺序表的建立以及元素的查找、插入、删除等操作。
[基本要求及提示](1)从键盘输入10个整数,建立顺序表。
(2)从键盘输入1个整数,在顺序表中查找该结点的位置。
若找到,输出结点的位置;若找不到,则显示“找不到”。
(3)从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。
(4)从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。
(5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
2、线性表的逆置[问题描述](1)以顺序存储结构实现线性表的就地逆置。
(2)以链式存储结构实现线性表的就地逆置。
注:线性表的就地逆置就是在原表的存储空间内将线性表(a1,a2,a3,…,an)逆置为(an,an-1,…,a2,a1)。
[基本要求及提示](1)从键盘输入10个整数,建立顺序表。
(2)实现顺序表逆置,并将结果输出。
(3)从键盘输入10个整数,建立链表。
(4)实现链表逆置,并将结果输出。
(5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
也可以将顺序表和链表上的操作分开,做成两个程序。
3、线性表的元素分类[问题描述]已知线性表中元素均为正整数,设计算法将其调整为前后两部分,前边均为奇数,后边均为偶数。
即实现线性表的元素的分类。
[基本要求及提示](6)从键盘输入10个整数,建立顺序表。
(7)实现顺序表上的元素分类,并输出结果。
(8)从键盘输入10个整数,建立链表。
(9)实现链表的元素分类,并输出结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一线性表操作实验目的:(1)掌握在顺序、链式存储结构上实现线性表的各种基本运算。
(2)重点掌握单链表的基本操作及应用。
(3)学会综合运用C语言中函数、指针、结构体等知识进行编程。
本次实验中,下列实验项目选做一。
1、顺序表的综合操作[问题描述]设计算法,实现线性结构上的顺序表的建立以及元素的查找、插入、删除等操作。
[基本要求及提示](1)从键盘输入10个整数,建立顺序表。
(2)从键盘输入1个整数,在顺序表中查找该结点的位置。
若找到,输出结点的位置;若找不到,则显示“找不到”。
(3)从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。
(4)从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。
(5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
2、线性表的逆置[问题描述](1)以顺序存储结构实现线性表的就地逆置。
(2)以链式存储结构实现线性表的就地逆置。
注:线性表的就地逆置就是在原表的存储空间内将线性表(a1,a2,a3,…,an)逆置为(an,an-1,…,a2,a1)。
[基本要求及提示](1)从键盘输入10个整数,建立顺序表。
(2)实现顺序表逆置,并将结果输出。
(3)从键盘输入10个整数,建立链表。
(4)实现链表逆置,并将结果输出。
(5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
也可以将顺序表和链表上的操作分开,做成两个程序。
3、线性表的元素分类[问题描述]已知线性表中元素均为正整数,设计算法将其调整为前后两部分,前边均为奇数,后边均为偶数。
即实现线性表的元素的分类。
[基本要求及提示](6)从键盘输入10个整数,建立顺序表。
(7)实现顺序表上的元素分类,并输出结果。
(8)从键盘输入10个整数,建立链表。
(9)实现链表的元素分类,并输出结果。
(10)要求程序通过一个主菜单进行控制。
也可以将顺序表和链表上的操作分开,做成两个程序。
(11)要求程序的时间复杂度为O(n),空间复杂度为O(1)。
4、线性表的有序合并[问题描述]已知有两个非递减的线性表,设计算法将其有序合并为一个线性表,元素值是非递增排序。
[基本要求及提示](1)从键盘输入两个非递减的整数序列,建立两个非递减的顺序表L1,L2。
(2)将顺序表L1,L2有序合并,结果非递增,输出合并后的结果。
(3)从键盘输入两个非递减的整数序列,建立两个非递减的链表L3,L4。
(4)将链表L3,L4有序合并,结果非递增,输出合并后的结果(采用头插法)。
(5)要求程序通过一个主菜单进行控制。
也可以将顺序表和链表上的操作分开,做成两个程序。
(6)要求程序的时间复杂度为O(n),空间复杂度为O(1)。
5、链表的综合操作[问题描述]设计算法,实现线性结构上的链表的建立、元素的查找、插入、删除等操作。
[基本要求及提示](1)从键盘输入10个字符以$结束,建立链表。
(2)从键盘输入1个序号,在链表中查找该结点的位置。
若找到,输出结点的位置;若找不到,则显示“找不到”。
(3)从键盘输入1个整数,表示欲插入的位置i,再输入一个字符x,将x插入在i 位置上,输出链表所有结点值,观察输出结果。
(4)从键盘输入一个整数,表示欲删除结点的位置,删除该结点,然后输出链表所有结点值,观察输出结果。
(5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
6、在顺序表上删除自第i个开始的k个元素[问题描述]建立一个非空的值域为整数的顺序表,从键盘输入i和k的值,编程实现删除自第i 个元素开始的k个元素。
[基本要求](1)建立长度至少为10的顺序表;(2)从键盘输入两个整数i和k,进行删除运算,删除成功显示“OK”,不成功显示“ERROR”。
注意讨论i和k的合法性。
(3)显示顺序表的内容;(4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
7、在顺序表上删除所有值为item的数据元素[问题描述]建立一个非空的值域为整数的顺序表,从键盘输入一个整数item,编程实现删除表中所有值为item的数据元素。
[基本要求](1)建立长度至少为10的顺序表;(2)从键盘输入一个整数item,删除表中所有与item相同的元素,删除成功显示“OK”,不成功显示“ERROR”。
(3)显示顺序表的内容;(4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
8、在顺序表上删除所有值相等的多余元素[问题描述]建立一个非空的值域为整数的顺序表,编程实现删除表中值相等的多余元素。
[基本要求](1)建立长度至少为10的顺序表;(2)删除表中值相等的多余元素。
(3)显示顺序表的内容;9、在单链表上,删除所有值在[mink,maxk]内元素[问题描述]建立一个非空的值域为整数的表头结点的单链表,从键盘输入两个整数mink,naxk;编程实现删除表中值域大于等于mink,同时小于等于maxk的数据元素。
[基本要求](1)建立长度至少为10的单链表;(2)删除单链表中表中,值域大于等于mink,同时小于等于maxk的结点。
(3)显示单链表的内容;(4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
10、查找单链表倒数第k个结点[问题描述]设有一个值域为整数有头结点的非空单链表,从键盘输入正整数k;在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置的结点,若查找成功,输出该节点的数据域的值,并返回1,否则显示“ERROR”,并返回0。
[基本要求及提示](1)编写非空的值域为整数的单链表的建立函数;(2)设工作指针p和q,当p从首节点开始沿链向前走到第k个节点(参考教材P50-2.8算法);此时使q指向首节点q=L->next;如此q与p是相距k个节点两个指针;再一同向前走,当p走到表尾时,q即指向倒数第k个结点。
11、在无头结点的循环链表上,删除s结点之前驱结点[问题描述]假设有一个循环链表的长度大于1,数据域为整数,且表中既无头结点也无头指针。
已知s为指向链表的某一结点的指针,试编写程序在循环链表中删除s的前驱结点。
[基本要求及提示](1)编写建立无头结点循环链表函数,也无头指针,返回该循环链表的某结点的指针(可以是尾指针);(2)编写删除s结点的前驱结点函数,while(p->next->next!=s)p=p->next;(3)编写输出链表函数;(4)要求程序通过一个主菜单(1.建立;2.删除;3.输出;4.退出)调用各功能函数。
12、单链表上元素的分类[问题描述]已知单链表表示的线性表中含有三类字符(如字母字符、数字字符和其他字符),试编写程序来构造三个以循环链表表示的线性表,使每个表中只含有某一类的字符,且利用原表中的节点空间,作为这三个表的结点空间,头结点可以另辟空间。
[基本要求及提示](1)编写建立无头结点尾指针标识的循环链表函数;(2)从键盘输入一个整数key,编写删除链表中值域等于key的结点的前驱结点函数。
(3)编写显示单链表的内容函数;(4)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
13、双向链表的综合操作[问题描述]设计算法,实现双向链表的建立、元素的查找、插入、删除等操作。
[基本要求及提示](1)从键盘输入10个整数以-999结束,建立数据域为整数的双向链表。
(2)从键盘输入1个序号,在双向链表中查找该结点的位置。
若找到,输出结点的位置;若找不到,则显示“找不到”。
(3)从键盘输入两个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在i位置上,输出链表所有结点值,观察输出结果。
(4)从键盘输入一个整数,表示欲删除结点的位置,删除该结点,然后输出链表所有结点值,观察输出结果。
(5)要求程序通过一个主菜单进行控制,在主菜单界面通过选择菜单项的序号来调用各功能函数。
14、单链表按给定规则合并[问题描述]设线性表A=(a1,a2,…,am),B=(b1,b2,…,bn),试编写一个按下列规则合并A,B 为线性表C的算法,使得C=(a1,b1,a2,b2,…,am,bm,bm+1,…,bn)或C=(a1,b1,a2,b2,…,an,bn,an+1,…,am)线性表C均以单链表为存储结构,C表利用A,B表的节点空间构成。
链表的长度均为显示存储。
[基本要求及提示](1)首先编写单链表的初始化函数、单链表创建函数及输出函数。
(2)再编写合并函数。
(3)在主函数中调用其它函数进行调试运行。
15、多项式的奇偶项的分解[问题描述]将一个用循环链表表示的稀疏多项式分解成两个多项式,使这两个多项式各自仅含有奇数项或偶数项,并要求用原链表中的结点空间来构成这两个循环链表。
[基本要求及提示](1)首先编写循环链表的初始化函数、循环单链表创建函数(P63-2.21)及输出函数。
(2)再编写分解函数。
(3)在主函数中调用其它函数进行调试运行。
16、给定x值,求多项式P(x)的值[问题描述]多项式P(x)采用单链表存储,参见教材的类型定义,写一个算法,对给定x值,求多项式P(x)的值。
[基本要求及提示](1)首先编写单链表的初始化函数、单链表创建函数及输出函数。
(2)再编写求值函数,提示求出每一个结点的值,进行累加。
提示:结点p的值:p->coef*pow(x,p->exp)。
(3)在主函数中调用其它函数进行调试运行。
17、单链表转换[问题描述]已知有单链表(a1,a2,…,an),n为偶数,要求写出一个时间复杂度为O(n),辅助空间为O(1)的算法,将上述单链表转换成(an,an-2,…,a2,a1,a3,…,an-1)。
参见教材P75图2.24.[基本要求及提示](1)首先编写单链表的初始化函数、单链表创建函数及输出函数。
(2)再编写转换函数。
提示:指针p扫描单链表,依次将第2,4,6…,n结点删除,同时头插到本链表上。
p=L->next;while(p->next!=NULL){s=p->next;p->next=s->next; s->next=L->next;L->next=s; p=p->next;}(3)在主函数中调用其它函数进行调试运行。