数据结构与算法线性表练习题.docx
- 文档编号:11661520
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:55
- 大小:35.25KB
数据结构与算法线性表练习题.docx
《数据结构与算法线性表练习题.docx》由会员分享,可在线阅读,更多相关《数据结构与算法线性表练习题.docx(55页珍藏版)》请在冰豆网上搜索。
数据结构与算法线性表练习题
三、写一个算法合并两个已排序的线性表。
(用两种方法:
数组表示的线性表(顺序表)和指针表示的线性表(链表))
要求:
1、定义线性表节点的结构,并定义节点的型和位置的型。
2、定义线性表的基本操作
3、在1,2的基础上,完成本题。
4、在main函数中进行测试:
先构建两个有序的线性表,然后合并这两个线性表。
四、已知一个单向链表,试给出复制该链表的算法。
要求:
1、定义线性表的节点的结构以与节点的型和位置的型。
2、定义线性表的基本操作
3、在1,2的基础上,完成本题。
4、在main函数中进行测试:
先构建一个线性表,并定义一个空线性表,然后进行复制。
五、写出从一个带表头的单链表中删除其值等于给定值x的结点的算法函数:
intdelete(LIST&L,intx);如果x在该链表中,则删除对应结点,并返回其在链表中的位置(逻辑位置,第一个结点的逻辑位置为1),否则返回-1。
要求:
1、定义线性表的节点的结构以与节点的型和位置的型。
2、定义线性表的基本操作
3、在1,2的基础上,完成本题。
4、在main函数中进行测试:
先构建一个线性表,然后调用函数删除值等于给定值的节点。
六、写出一个将两个静态链表(属于同一个存储池)合并的算法函数:
voidMerge(cursorM,cursorN);合并的方法是将N链表中的所有结点添加到M链表的后面,并将N链表的表头结点添加到空闲结点链表中。
要求:
1、定义静态链表的结点的结构以与结点的型SPACE以与位置(position)和游标(cursor)的型。
2、定义静态链表的基本操作:
voidInitialize();初始化,将所有存储池中的结点设置为空闲;cursorGetNode();从空闲链中获取一个结点;voidFreeNode(cursorq);将结点q加入到空闲链;voidInsert(elementtypex,positionp,cursorM);在链表M中的位置为p的元素后面添加一个值为x的结点;voidDelete(cursorM,positionp);在链表M中删除位置为p的元素的后一个元素。
3、在1、2的基础上完成本题。
4、在main函数中进行测试:
先构建一个存储池,然后在该存储池中创建两个静态表,最后将这两个静态表合并。
七、利用指针表示的线性表(链表)表示一个多项式,并实现两个多项式的相加和相乘运算。
假设多项式形式为:
其中,系数ai≠0,指数ei满足em>em-1>…>e2>e1>=0。
要求:
1、定义多项式每一项的结构。
2、定义两个多项式的相加和相乘运算函数。
3、在main函数中,构建两个多项式,并测试相加和相乘运算。
八、试编写一个整数进制转换的通用函数convert(intnum,STACKS,intn),要求将整数m转换为n进制数,n进制数的各位依次存放在栈S中。
并在主函数中进行测试。
要求:
1、定义栈以与栈的型。
2、定义栈的各种操作。
3、实现函数convert。
4、在main函数中,通过调用函数convert将num的n进制数存放到一个栈中,并通过出栈的方法输出该n进制数
九、设有一个循环队列Queue,只有头指针front,不设尾指针,另设一个含有元素个数的计数器count,试写出相应的判断队列空、判断队列满、出队算法和入队算法。
要求:
1、定义相应的循环队列的型(只有头指针,没有尾指针,但有一个元素个数的计数器);
2、定义该队列的四个算法:
判断队列空、判断队列满、出队算法和入队算法;
3、在main函数验证算法的正确性。
十、设主串T=“abcaabbabcabaacbacba“,模式为p=“abcabaa”。
1、计算模式p的nextval函数值
2、不写算法,只画出利用KMP算法进行模式匹配时,每一趟的匹配过程。
要求:
1、写出模式p的nextval值;
2、画出KMP算法的每一趟匹配过程(可参照教材P61从第8行开始的容);
3、不需要编写程序。
十一、假设表达式中允许包含三种括号:
圆括号、方括号和大括号。
设计一个算法采用顺序栈(用数组表示的栈)判断表达式中的括号是否正确配对。
要求:
1、定义栈以与栈的型,栈中所存放元素的类型为字符型,定义枚举类型Boolean,其中两个元素分别为TRUE和FALSE。
2、定义栈的各种操作。
3、定义函数Booleancheck(char*s);判断s中的括号是否正确配对,如果正确配对,返回TRUE,否则返回FALSE。
4、在主函数中验证所编写函数的正确性。
十二、设有一个带头结点的双向链表h,设计一个算法用于查找第一个元素之为x的结点,并将其与其前驱结点进行交换。
要求:
1、定义带头结点的双向链表的型DLIST。
2、定义双向链表DLIST的基本操作。
3、定义函数intswap(elementtypex,DLIST&h),查找第一个元素之为x的结点,如果在链表中存在元素值为x的结点,并其与其前驱结点进行交换,并返回1,否则返回0。
4、在主函数中测试所编写函数的正确性。
十三、试编写一个求三元组顺序表示的稀疏矩阵对角线元素之和的算法
十四、当具有一样行值和列值的稀疏矩阵A和B均以三元组顺序表方式存储时,试写出矩阵相加的算法,其结果存放在以行逻辑顺序表方式存储的矩阵C中。
十五、设有一个稀疏矩阵:
1、写出三元组顺序表存储表示
2、写出十字链表存储的顺序表示
十六、画出广义表LS=((),(e),(a,(b,c,d)))的头尾链表存储结构(类似于教材P70图2-27.9)。
要求:
按照教材中的事例画出相应的图形,不需要编程。
t
其中第一个节点如下:
十七、试编写求广义表中原子元素个数的算法。
要求:
1、定义广义表的节点的型;
2、定义广义表的基本操作;
3、定义本题要求的函数intelements(listpointerL);函数返回值为广义表中原子的个数。
例如,广义表(a,b,c,d)原子的个数为4,而广义表(a,(a,b),d,e,((i,j),k))中院子的个数为3。
提示:
先利用基本操作Cal(L)获得表头,判断表头是不是原子,再利用基本操作Cdr(L)获得除第一个元素外的其他元素所形成的表L1,利用递归的方法求L1中原子的个数。
要求:
1、上述作业要求在单独完成;
2、完成后,于规定期限提交到ftp服务器的相应目录中中,注意,在提交时将所编写的程序统一拷贝到一个Word文件中,文件名格式为“学号+”
三(数组表示)
#include
usingnamespacestd;
#definemaxlength100
typedefintposition;
typedefintElementtype;
structLIST{
Elementtypeelements[maxlength];
intlast;
};
positionEnd(LISTL)//线性表长度
{
return(L.last+1);
}
voidInsert(Elementtypex,positionp,LIST&L)
{
positionq;
if(L.last>=maxlength-1)
cout<<"listisfull"< elseif((p>L.last+1)||(p<1)) cout<<"positiondoesnotexit"< else { for(q=L.last;q>=p;q--) { L.elements[q+1]=L.elements[q]; } L.last=L.last+1; L.elements[p]=x; } } voidDelete(positionp,LIST&L) { positionq; if((p>L.last)||(p<1)) cout<<"positiondoesnotexist"< else { L.last=L.last-1; for(q=p;q<=L.last;q++) L.elements[q]=L.elements[q+1]; } } positionLocate(Elementtypex,LISTL) { positionq; for(q=1;q<=L.last;q++) if(L.elements[q]==x) returnq; return(L.last+1); } voidmerge(LIST&L,LIST&L1,LIST&L2) { positionp=0,p1,p2; positionlen1=End(L1); positionlen2=End(L2); L.last=len1+len2-1; for(p1=0;p1 { L.elements[p]=L1.elements[p1]; p++; } p--; for(p2=0;p2 { L.elements[p]=L2.elements[p2]; p++; } p--; } voidread(LIST&L) { cout< cout<<"请输入线性表长度"< cin>>L.last; for(inti=0;i { cin>>L.elements[i]; } } voidwrite(LIST&L) { for(inti=0;i { cout< } cout< } intmain() { LISTL,L1,L2; read(L1); write(L1); read(L2); write(L2); merge(L,L1,L2); write(L); } 数据结构三(指针) #include usingnamespacestd; typedefintElementtype; structcelltype{ Elementtypeelement; celltype*next; }; typedefcelltype*LIST; typedefcelltype*position; positionEnd(LISTL) { positionp; p=L; while(p->next! =NULL) { p=p->next; } returnp; } voidInsert(Elementtypex,positionp) { positionq; q=newcelltype; q->element=x; q->next=p->next; p->next=q; } voidDelete(positionp)//删除p的下一个节点 { positionq; if(p->next! =NULL) { q=p->next; p->next=q->next; deleteq; } } positionLocate(Elementtypex,LISTL) { positionp; p=L; while(p->next! =NULL) { if(p->next->element==x) returnp; else p=p->next; } returnp; } positionMakeNull(LIST&L) { L=newcelltype; L->next=NULL; returnL; } voidmerge(LIST&L,LIST&L1,LIST&L2) { positionp,p1,p2; for(p1=L1;p1;p1=p1->next) { p=newcelltype; p->element=p1->element; if(L==0) { L=p; p2=p; } else { p2->next=p; p2=p; } } p2->next=NULL; for(p1=L2;p1;p1=p1->next) { p=newcelltype; p->element=p1->element; if(L==0) { L=p; p2=p; } else { p2->next=p; p2=p; } } p2->next=NULL; } voidRead(LIST&L) { positionp1,p2; //p1=newcelltype; cout<<"请输入数据以-1结束"< for(;;) { p1=newcelltype; cin>>p1->element; if(p1->element==-1) break; if(L==0) { L=p1; p2=p1; } else { p2->next=p1; p2=p1; } } p2->next=NULL; } voidwrite(LIST&L) { positionp; p=L; for(;p;p=p->next) { cout< } cout< } intmain() { LISTL=NULL,L1=NULL,L2=NULL; Read(L1); write(L1); Read(L2); write(L2); merge(L,L1,L2); write(L); } 数据结构四 #include usingnamespacestd; typedefintElementtype; structcelltype{ Elementtypeelement; celltype*next; }; typedefcelltype*LIST; typedefcelltype*position; positionEnd(LISTL) { positionp; p=L; while(p->next! =NULL) { p=p->next; } returnp; } voidInsert(Elementtypex,positionp)//节点插p节点之后 { positionq; q=newcelltype; q->element=x; q->next=p->next; p->next=q; } voidDelete(positionp)//删除P节点的下一个节点 { positionq; if(p->next! =NULL) { q=p->next; p->next=q->next; deletep; } } positionLocate(Elementtypex,LISTL) { positionp; p=L; while(p->next! =NULL) { if(p->next->element==x) returnp; else p=p->next; } returnp; } positionMakeNull(LIST&L) { L=newcelltype; L->next=NULL; returnL; } voidCopy(LIST&L1,LIST&L2) { positionp1,p2,p3; for(p2=L2;p2;p2=p2->next) { p1=newcelltype; p1->element=p2->element; if(L1==0) { L1=p1; p3=p1; } else { p3->next=p1; p3=p1; } } p3->next=NULL; } voidRead(LIST&L) { positionp1,p2; p1=newcelltype; cout<<"请输入数据以-1结束"< for(;;) { p1=newcelltype; cin>>p1->element; if(p1->element==-1) break; if(L==0) { L=p1; p2=p1; } else { p2->next=p1; p2=p1; } } p2->next=NULL; } voidWrite(LIST&L) { positionp=L; for(;p;p=p->next) { cout< } cout< } intmain() { LISTL1=NULL,L2=NULL; Read(L2); Write(L2); Copy(L1,L2); Write(L1); } 数据结构五 #include usingnamespacestd; typedefintElementtype; structcelltype{ Elementtypeelement; celltype*next; }; typedefcelltype*LIST; typedefcelltype*position; positionEnd(LISTL) { positionp; p=L; while(p->next! =NULL) p=p->next; returnp; } voidInsert(Elementtypex,positionp)//插入到P后面的一个节点 { positionq; q->element=x; q->next=p->next; p->next=q; } voidDelete(positionp)//删除P后面一个节点 { positionq; if(p->next! =NULL) { q=p->next; p->next=q->next; deleteq; } } intDelete(LIST&L,intx) { positionp=L; intcount=1; if(p->element==x) { returncount; p=p->next; } while(p->next! =NULL) { count++; if(p->next->element==x) { if(p->next->next! =NULL) { positionq; q=p->next; p->next=q->next; deleteq; returncount; } else { deletep->next; p->next=NULL; returncount; } } else p=p->next; } return-1; } positionLocate(Elementtypex,LISTL) { positionp=L; while(p->next! =NULL) { if(p->next->element==x) { returnp; } else p=p->next; } returnp; } positionMakeNull(LIST&L) { L=newcelltype; L->next=NULL; returnL; } voidRead(LIST&L) { positionp1,p2; p1=newcelltype; cout<<"请输入数据以-1结束"< for(;;) { p1=newcelltype; cin>>p1->element; if(p1->element==-1) break; if(L==0) { L=p1; p2=p1; } else { p2->next=p1; p2=p1; } } p2->next=NULL; } voidWrite(LIST&L) { positionp=L; for(;p;p=p->next) { cout< } cout< } intmain() { LISTL1=NULL; Read(L1); Write(L1); cout< cout< Write(L1); } 数据结构六 #include usingnamespacestd; #definemaxsize100 typedefintElementtype; typedefstruct{ Elementtypeelement; intnext; }spacestr;//节点类型 spacestrSPACE[maxsize];//存储池 typedefintposition,cursor; cursoravailable;//游标变量,标识线性表 voidInitialize() { intj; for(j=0;j { SPACE[j].next=j+1;//池中节点 } SPACE[j].next=-1; available=0;//标识线性表,将所有存储池中的节点设置为空闲,avaailable为头节点不利用 } cursorGetNode()//从空闲链中获取一个节点 { positionp; if(SPACE[available].next==-1) p=-1; else { p=SPACE[available].next; SPACE[available].next=SPACE[p].next; } returnp; } voidFr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 线性 练习题