线性表的操作算法实验报告
- 格式:doc
- 大小:355.00 KB
- 文档页数:18
实验报告
2013学年第一学期 任课老师:
课程名称 数据结构 班级 学号 姓名
实验名称 实验一 线性表的操作算法 实验时间
实验环境
Visual C++ 6.0
实验目的和内容要求
实验一 线性表的操作算法
1.实验目的
用C/C++,Java程序实现课本中的有关算法,以达到对算法熟练的目的。
2.实验内容
分别用数组和链表作为存储结构,实现线性表的插入、删除、查找、排序、合并等操作。
实验过程记录
(学生写出实验步骤及中间的结果与现象,在实验中做了什么,怎么做,发生的现象和中间结果)
链表:
1. 在写主函数之前,先创建一个长度为n的链表
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
2. 建立链表的函数框架,根据实验要求完善功能
插入:
int ListInsert(LinkList &L, int i, int e) {
LinkList p=L;
int j=0;
while(p&&j
p=p->next; ++j;
}
if(!p ||j>i-1) return 0;
LinkList s = (LinkList)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
return 1;
}
删除:
int ListDelete(LinkList &L, int i, int &e) {
LinkList p=L;
int j=0;
while(p->next&&j
p=p->next; ++j;
}
if(!(p->next)||j>i-1) return 0;
LinkList q=p->next;
p->next=q->next;
e=q->data;
free(q);
cout<<"被删除的元素数据为"<
return 0;
}
查找:
int GetElem(LinkList &L,int i, int &e) {
LinkList p=L->next;
int j=1;
while (p && j
p=p->next; ++j;
}
if (!p||j>i) return 0;
e=p->data;
cout<<"该元素的值为"<
return 1;
}
排序:
LinkList Sort(LinkList L)
{ LinkList p,q;
int temp;
for(p=L;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->data>q->data)
{
temp=q->data;
q->data=p->data;
p->data=temp;
}
}
}
return L;
}
合并:
void MergeList_L(LinkList &L,LinkList &La,LinkList &Lb) {
LinkList p,pa,pb;
p=L->next;
pa=La->next;
Lb=pb=L; //用L的头结点作为Lb的头结点
while (p&&pa) {
if (p->data<=pa->data) {
pb->next=p;
pb=p;
p=p->next;
}
else {
pb->next=pa;
pb=pa;
pa=pa->next;
}
}
pb->next=p?p:pa;
free(La);
}
3. 完成函数框架后开始写主函数,先输入一个链表L,然后出现功能栏目,可供选择,此处应做一个循环,使其可不断对该链表L操作,用多支选择语句加上do…while循环。
int main()
{
LinkList L;
int n,s,e,i,f,g,h;
cout<<"输入链表长度n:";
cin>>n;
cout<<"请输入L中的元素:"<
CreateList( L, n);
cout<<"输入的链表为:"<<" ";
LNode *q=L->next;while(q){coutnext;}
cout<
int choice;
cout<<"请选择功能:"<
cout<<"1.插入元素"<
cout<<"2.删除元素"<
cout<<"3.查找元素"<
cout<<"4.给元素排序"<
cout<<"5.合并链表"<
cout<<"0.退出程序"<
cout<<"PS:若先排序再合并,可将得到新的排序后的合并链表。"<
do{
cout<
cout<<"请选择功能:"<
cin>>choice;
switch(choice)
{
case 1:
{
cout<<"输入插入的位置:";
cin>>s; cout<<"输入插入的数据元素:";
cin>>e;
ListInsert( L, s, e);
cout<<"插入后的链表:"<<"\n";
q=L->next;
while(q){
cout q=q->next; } break; } case 2: { cout<<"输入删除位置:"; cin>>g; ListDelete( L, g, h); cout<<"删除后的链表:"<<"\n"; q=L->next; while(q){ cout q=q->next; } break; } case 3: { cout<<"输入查找位置:"; cin>>i; GetElem( L, i, f); break; } case 4: { LinkList p; Sort(L); cout<<"排序后的链表为:"< q=L->next; while(q){ cout q=q->next; } break; } case 5: { LinkList La,Lb; int m; cout<<"请输入另一个链表La的长度m:"; cin>>m; cout<<"请输入La中的元素:"< CreateList(La,m); cout<<"输入的链表La为:"<<" "; LNode *q=La->next; while(q){ cout q=q->next; } Sort(La); MergeList_L(L,La,Lb); cout< cout<<"合并后的链表:"<<"\n"; q=L->next; while(q){ cout q=q->next; } break; } } } while(choice!=0); return 0; } 数组: 同理,代码附在报告后。 实验结果分析与总结 1、程序运行结果(请提供所完成的各道题运行结果界面截图): 2、在实验过程中遇到的问题与解决方法: 问题有很多,比如局部变量与全局变量的声明,常常顾此失彼,此处概念仍然不清。 数组的概念出从零开始的命名与使用者角度的转换也常常忘记,所以经常出现空出一位的表,那一位为系统随机赋值。 还有便是在值的传递上,思路不甚明确,导致常常断开,不能调用函数后改变表的值。 3、实验过程中的发现与收获,未解决或需进一步解决的问题: 在循环嵌套方面还是有些害怕,不能一次调试成功,常常需要加减来改变。 收获是学会了在写代码前画流程图来清晰思路,毕竟在算法这方面并不擅长,还需要更多的世间来适应并练习。 指导老师评阅意见 指导老师: 年 月 日 填写内容时,可把表格扩大。 附:实验源程序代码 顺序表(链表): // 线性表(链表) #include #include "malloc.h" #include using namespace std; typedef struct LNode{ int data; struct LNode *next; }LNode,*LinkList; //创建一个长度为n的链表 void CreateList(LinkList &L, int n) { L = (LinkList)malloc(sizeof(LNode)); L->next = NULL; for (int i=n; i>0; --i) { LinkList p = (LinkList)malloc(sizeof(LNode)); cin>>p->data; p->next = L->next; L->next = p; } } // 在链表L第i个元素之前插入元素e int ListInsert(LinkList &L, int i, int e) { LinkList p=L; int j=0;