线性表的操作算法实验报告Word文档格式.docx
《线性表的操作算法实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《线性表的操作算法实验报告Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
}
if(!
p||j>
i-1)return0;
LinkLists=(LinkList)malloc(sizeof(LNode));
s->
data=e;
next=p->
p->
next=s;
return1;
}
删除:
intListDelete(LinkList&
L,inti,int&
e){
while(p->
next&
(p->
next)||j>
LinkListq=p->
next=q->
e=q->
data;
free(q);
cout<
<
"
被删除的元素数据为"
e<
\n"
;
return0;
查找:
intGetElem(LinkList&
L,inti,int&
e){
LinkListp=L->
intj=1;
while(p&
j<
i){
if(!
p||j>
i)return0;
e=p->
该元素的值为"
排序:
LinkListSort(LinkListL)
{LinkListp,q;
inttemp;
for(p=L;
p!
=NULL;
p=p->
next)
{
for(q=p->
q!
q=q->
next)
{
if(p->
data>
q->
data)
{
temp=q->
q->
data=p->
p->
data=temp;
}
}
returnL;
合并:
voidMergeList_L(LinkList&
L,LinkList&
La,LinkList&
Lb){
LinkListp,pa,pb;
p=L->
pa=La->
Lb=pb=L;
//用L的头结点作为Lb的头结点
while(p&
pa){
if(p->
data<
=pa->
data){
pb->
next=p;
pb=p;
p=p->
}
else{
next=pa;
pb=pa;
pa=pa->
pb->
next=p?
p:
pa;
free(La);
3.完成函数框架后开始写主函数,先输入一个链表L,然后出现功能栏目,可供选择,此处应做一个循环,使其可不断对该链表L操作,用多支选择语句加上do…while循环。
intmain()
{
LinkListL;
intn,s,e,i,f,g,h;
输入链表长度n:
cin>
>
n;
请输入L中的元素:
endl;
CreateList(L,n);
输入的链表为:
"
LNode*q=L->
while(q){cout<
intchoice;
请选择功能:
1.插入元素"
2.删除元素"
3.查找元素"
4.给元素排序"
5.合并链表"
0.退出程序"
PS:
若先排序再合并,可将得到新的排序后的合并链表。
do{
cout<
cin>
choice;
switch(choice)
{
case1:
{
cout<
输入插入的位置:
s;
输入插入的数据元素:
e;
ListInsert(L,s,e);
插入后的链表:
q=L->
while(q){
q=q->
}
break;
}
case2:
输入删除位置:
g;
ListDelete(L,g,h);
删除后的链表:
cout<
break;
case3:
输入查找位置:
i;
GetElem(L,i,f);
case4:
LinkListp;
Sort(L);
排序后的链表为:
case5:
LinkListLa,Lb;
intm;
请输入另一个链表La的长度m:
cin>
m;
请输入La中的元素:
CreateList(La,m);
输入的链表La为:
LNode*q=La->
while(q){
cout<
q=q->
Sort(La);
MergeList_L(L,La,Lb);
合并后的链表:
while(choice!
=0);
return0;
数组:
同理,代码附在报告后。
实验结果分析与总结
1、程序运行结果(请提供所完成的各道题运行结果界面截图):
2、在实验过程中遇到的问题与解决方法:
问题有很多,比如局部变量与全局变量的声明,常常顾此失彼,此处概念仍然不清。
数组的概念出从零开始的命名与使用者角度的转换也常常忘记,所以经常出现空出一位的表,那一位为系统随机赋值。
还有便是在值的传递上,思路不甚明确,导致常常断开,不能调用函数后改变表的值。
3、实验过程中的发现与收获,未解决或需进一步解决的问题:
在循环嵌套方面还是有些害怕,不能一次调试成功,常常需要加减来改变。
收获是学会了在写代码前画流程图来清晰思路,毕竟在算法这方面并不擅长,还需要更多的世间来适应并练习。
指导老师评阅意见
指导老师:
年月日
填写内容时,可把表格扩大。
附:
实验源程序代码
顺序表(链表):
//线性表(链表)
#include<
stdio.h>
#include"
malloc.h"
iostream>
usingnamespacestd;
//创建一个长度为n的链表
voidCreateList(LinkList&
L,intn){
L=(LinkList)malloc(sizeof(LNode));
L->
next=NULL;
for(inti=n;
i>
0;
--i)
{
LinkListp=(LinkList)malloc(sizeof(LNode));
p->
next=L->
next=p;
//在链表L第i个元素之前插入元素e
}
//在链表L中删除第i个元素,并由e返回其值
//查找第i个元素,并由e返回其值
//让链表L中的元素按从小到大的顺序排列
//归并L和La得到新的单链性表Lb
顺序表(数组):
//顺序表(数组).cpp
//#include"
stdafx.h"
#include<
#defineLIST_INIT_SIZE100
#defineLISTINCREMENT10
structS{
int*p;
intlength;
intlistsize;
};
//构造一个空的线性表L
intInitList(S&
L){
L.p=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
L.p)return0;
L.length=0;
L.listsize=LIST_INIT_SIZE;
//在表中第i个位置之前插入新的元素e
intListInsert(S&
L,inti,inte){
if(i<
1||i>
L.length+1)return0;
if(L.length>
=L.listsize)
{int*newbase=(int*)realloc(L.p,(L.listsize+LISTINCREMENT)*sizeof(int));
newbase)return0;
L.p=newbase;
L.listsize+=LISTINCREMENT;
int*q=&
(L.p[i-1]);
for(int*y=&
(L.p[L.length-1]);
y>
=q;
--y)*(y+1)=*y;
*q=e;
++L.length;
//在表中删除第i个元素,并用e返回其值
intListDelete(S&
L,inti,int&
e){
if((i<
1)||(i>
L.length))return0;
int*k=&
e=*k;
int*q=L.p+L.length-1;
for(++k;
k<
++k)*(k-1)=*k;
--L.length;
//在表中查找某位置上的元素
intGetElem(S&
returne;
//给表中元素按从小到大的顺序排序
/*SLSort(S&
L){
intn,t;
for(intj=0;
n-1;
j++){
for(intk=0;
n-j-1;
k++){
if(p[k]>
p[k+1]){
t=p[k+1];
p[k+1]=p[k];
p[k]=t;
}
}
for(inti=0;
i<
i++)
p[i]<
}*/
//与另一个表La合并成为新的表Lb
//voidMergeList_L(S&
L,S&
La,S&
//}
voidLSort(S&
L)
inta=L.p[0];
for(inti=1;
L.length;
++i)
if(L.p[i]<
L.p[i-1])
L.p[0]=L.p[i];
for(intj=i-1;
L.p[0]<
L.p[j];
--j)
L.p[j+1]=L.p[j];
L.p[j+1]=L.p[0];
L.p[0]=a;
Smerge(S&
La)
{
structSLb;
int*p=L.p;
int*pa=La.p;
Lb.length=L.length+La.length;
int*pb=Lb.p=(int*)malloc(Lb.length*sizeof(int));
int*p_last=p+L.length-1;
int*pa_last=pa+La.length-1;
while(p<
=p_last&
pa<
=pa_last)
if(*p<
=*pa)
*pb++=*p++;
else
*pb++=*pa++;
=p_last)
while(pa<
returnLb;
{intn;
structSlist;
InitList(list);
=n-1;
i++)
{cin>
list.p[i];
list.length++;
};
for(ints=0;
s<
s++)
list.p[s]<
0.退出程序