解题思路:一步一步来,先创建,然后删除,然后输出即可,别急

注意事项:注意代码中的指针的运用

参考代码:

#include <stdio.h>

#include <stdlib.h>

typedef struct student

{

    int score;

    struct student*next;

}Node,*node;

node create(int n);//创建链表

node delete_num(node head,int m);//删除链表中的元素

void output( node l );//输出链表



void main()

{

    int n,m;

    node head;//定义头指针

    scanf("%d",&n);//输入链表元素个数

    head=create(n);

    scanf ("%d",&m);//输入需要删除的元素

    delete_num( head, m);

    output(head);

}

node create(int n)

{

    node h;//定义头结点

    h=(node)malloc(sizeof(Node));//创建头结点

    h->next=NULL;//让头指针的指针域赋空

    node q=h;//定义一个指针q,指向头结点

    node p;//定义一个变化的指针p

    int i;

    for (i=0;i<n;i++)

    {

        p=(node)malloc(sizeof(Node));//为p开辟空间

        scanf("%d",&(*p).score);//输入学生的得分

        q->next=p;//让q指针指向p

        q=p;//把p赋值给q,此时q就是p

        q->next=NULL;//让q指针指向空,后插法


    }

    return(h);//返回头结点


}

node delete_num(node head,int m)

{

    node p,q;


    p=head->next;//定义指针p指向头结点

    while (p->next)

    {

        if (p->score!=m)

        {

             while(p->score!=m&&p->next)//当p不等于m,且有下一个值

                 {

                        q=p;

                        p=p->next;//让p指针指向后一个值,实现p的变化

                  }

        }

         if (p->score==m)

         {

             q->next=p->next;//让q的next指向p的后一个,从而实现删除

             free(p);//释放p,p值不存在了


         }

         p=q->next;//赋值新的p是q的next


    }

    return head;

}

void output(node l)

{

    l=l->next;//指针l指向next

    node q;////用于释放结点

    while(l!=NULL)

    {

        printf("%d ",l->score);

        q=l;

        l=l->next;//跳跃到下一个

        free(q);//释放,q不存在了

    }

}


点赞(0)
 

0.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 2 条评论

皇后怪 9月前 回复TA
存在一个问题:如果被删除元素是第一个或者只有最后一个元素需要被删除,会失效
皇后怪 9月前 回复TA
good