计算机信息工程学院学生实验报告
课程名称 | 数据结构 | 实验室名称 | |
实验名称 | 不带头结点的单链表 | ||
指导教师 | 成绩 |
- 实验目的
- 熟练掌握动态链表结构及有关算法的设计方法
- 理解不带头结点的单链表的特点,掌握其基本操作。
- 熟练掌握运用不带头结点链表表示特定形式的数据的方法,并设计出有关算法。
一、
实验内容
编写函数slnklist delx(linklist head, datatype x),删除不带头结点单链表head中第一个值为x 的结点。并构造测试用例进行测试。
算法描述及实验步骤
特殊处理第一个节点,如果head->info==x,头节点后移,其次遍历其他节点,用两个指针找到x直接把后指针连着前指针的后一个。
linklist delx(linklist head,datatype x){
linklist p,pre;
p=head;
if(head->info==x){
head=head->next;
return head;
}
p=p->next;
pre=head;
while(p){
if(p->info==x){
pre->next=p->next;
free(p);
return head;
}
else{
pre=p;
p=p->next;
}
}
return head;
}
调试过程及运行结果
删除数在中间
删除数在开头
删除数在最后
二、
实验内容
假设线性表(a1,a2,a3,…an)采用不带头结点的单链表存储,
请设计算法函数linklist reverse1(linklist head)和void reverse2(linklist *head)将不带头结点的单链表head就地倒置,
使表变成(an,an-1,…a3.a2,a1)。并构造测试用例进行测试。
linklist reverse1(linklist head){
linklist p=head;
int i=0,a[100];
while(p){
a[i++]=p->info;
p=p->next;
}
p=head;
while(p){
p->info=a[--i];
p=p->next;
}
return head;
}
算法描述及实验步骤
把链表中的的数都放进数组里在倒过来给链表赋值。
调试过程及运行结果
三、
实验内容
假设不带头结点的单链表head是升序排列的,设计算法函数linklist insert(linklist head,datatype x),将值为x的结点插入到链表head中,并保持链表有序性。分别构造插入到表头、表中和表尾三种情况的测试用例进行测试。
算法描述及实验步骤
先考虑插在表头前面把head更新再返回,其次考虑中间和尾巴都一样处理,用两个指针前面的判断插入的位置一旦比x大就插在他前面,用后面的指针的下一个指着新建节点,新建节点指着前面的指针。
linklist insert(linklist head ,datatype x)
{
linklist p=head;
if(p->info>x){
linklist q=(node*)malloc(sizeof(node));
q->info=x;
q->next=head;
return q;
}
while(p->next->next){
if(p->next->info>x){
linklist q=(node*)malloc(sizeof(node));
q->info=x;
q->next=p->next;
p->next=q;
return head;
}
else
p=p->next;
}
linklist q=(node*)malloc(sizeof(node));
q->info=x;
q->next=NULL;
p->next->next=q;
return head;
}
调试过程及运行结果
插在最前面
插在中间
插在最后面
四、
实验内容
编写算法函数linklist delallx(linklist head, int x),删除不带头结点单链表head中所有值为x的结点。
算法描述及实验步骤
先处理除开头节点,用两个指针一前一后,前面的判断是否是x在一一进行删除,直到前面指针等于空指针。再回头处理头节点看看是否是x进行删除。
linklist delallx(linklist head,int x){
linklist p,pre;
p=head->next;
pre=head;
while(p){
if(p->info==x){
pre->next=p->next;
p=pre->next;
}
else{
pre=p;
p=p->next;
}
}
if(head->info==x)
head=head->next;
return head;
}
调试过程及运行结果