7-1 单向链表2(15 分)

7-1 单向链表2(15 分)

编程实现:输入一个正整数 repeat (0<repeat<10),做 repeat 次下列运算: 输入一个正整数 n(0<n<=9)和一组(n个)整数,建立一个单向链表,再输入一个整数 x,将链表中最后一个与x相等的整数删除。

输入输出示例:括号内为说明

输入样例:

输出样例:

#由于是考试题目所以没办法直接复制#

代码:

#include <stdio.h>
#include <stdlib.h>
struct num
{
    int data;
    struct num *next;
};//首先创造结构体
int main(void)
{
    int n,i,s,z,j;
    struct num *head,*tail,*p,*q,*w=NULL,*y,*u;//这里用到了很多指针,以下介绍
    scanf("%d",&n);//n用于控制总循环次数,即repeat
    for(i=1;i<=n;i++)//进入循环
    {
        w=NULL;//w先指向NULL
        head=(struct num*)malloc(sizeof(struct num));尾插法创建有头节点
        head->next=NULL;tail=head;
        scanf("%d",&s);//s用于控制输入数据的个数
        for(z=1;z<=s;z++)//创建链表中
        {
            p=(struct num*)malloc(sizeof(struct num));
            scanf("%d",&p->data);
            p->next=NULL;
            tail->next=p;
            tail=p;
        }
        q=head->next;//之后要对链表进行遍历,因为head是空的,所以要下移一个节点并让q指向它
        scanf("%d",&j);//输入要进行删除的数据
        while(q)//开始遍历,注意这里有一个机制,当输入的数据不存在时,要让程序能区分这种情况,这里我用w作为一个标志性的指针,同时w也起查找作用
        {
            if(q->data==j)
                w=q;
            q=q->next;
        }//注意这里,如果数据查询成功,w就是目标数据数据所对应的节点,如果没有,w是空,这就是为什么w要一开始指向空的原因
        if(w!=NULL)//这里进行判断,如果w是空,就不进行之后的删除了
        {
            y=head->next;
            while(y->next!=w)
            y=y->next;
            y->next=w->next;
            free(w);
            u=head->next;
            printf("size=%d:",s-1);//删除程序
            while(u->next)
            {
                printf("%d ",u->data);
                u=u->next;
            }
            printf("%d",u->data);//输出程序
        }
    }
    return 0;
}

这个题是我在做模拟考试题时碰到的一个我觉得略难的题,我觉得有必要在这里进行一次分析,程序目前写的比较混乱,因为这是我的原始代码,只进行了思路梳理,我打算在再进行一次思路精简,让程序可读性更强一些。这个题我主要在判断数据是否存在时出了问题,以后在进行链表查找操作题时也要注意数据不存在的问题。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值