数据结构(C语言版)(第3版)实验2

这篇实验报告详细介绍了如何在不带头结点的单链表中进行各种操作,包括删除第一个指定值的节点、链表的原地反转、在有序链表中插入元素以及删除所有指定值的节点。通过不同测试用例展示了这些操作的实现和效果,强调了动态链表结构和算法设计的重要性。
摘要由CSDN通过智能技术生成

计算机信息工程学院学生实验报告

课程名称

数据结构

实验室名称

实验名称

不带头结点的单链表

指导教师

成绩

  1. 实验目的
  1. 熟练掌握动态链表结构及有关算法的设计方法
  2. 理解不带头结点的单链表的特点,掌握其基本操作。
  3. 熟练掌握运用不带头结点链表表示特定形式的数据的方法,并设计出有关算法。

一、

实验内容

编写函数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;
}

调试过程及运行结果

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值