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

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

编程实现:输入一个正整数 repeat (0

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

输入样例:

7-1 单向链表2(15 分)_第1张图片

输出样例:

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

代码:

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

你可能感兴趣的:(C/C++,习题)