第九次作业_现在想将学生绩点组成一个链表。链表结点内容包括学生姓名,学号,绩点。 输入是一-程序员宅基地

技术标签: c语言  链表  

现在想将学生绩点组成一个链表。链表结点内容包括学生姓名,学号,绩点

输入是一组学生的姓名、学号和绩点,以链表形式存储。

删除绩点小于平均绩点的学生结点,成为一个新链表。

后按照输入的顺序,依序输出新链表的学生信息。

平均绩点是输入的所有学生绩点取算术平均值。

输入描述

输入包括若干行。 每行是一个学生的姓名、学号和绩点,以空格隔开。

最后一行是*.

输出描述

输出包括学生姓名。 每个学生姓名一行。

样例输入

sddv 005 3.6
jjjbjb 1465 1.5
jdsf 0156  2.8
scc 003 1.5
wzwa 008 4.2
*

样例输出

sddv
jdsf
wzwa

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct student {
    char name[20];
    char num[20];
    float score;
    struct student* next;
}stu, * mate;

int create(mate l)
{
    mate p, q;
    
    q = l;
    while (1)
    {
        p = (mate)malloc(sizeof(stu));
        scanf("%s", &p->name);
        if (!strcmp(p->name, "*"))
        {
            break;
        }
        scanf("%s", &p->num);
        scanf("%f", &p->score);
        q->next = p;
        q = p;
       

    }
    q->next = NULL;
    return 0;
}
void dele(mate l)
{
    mate p, temp,q;
    float sum=0.0, aver;
    int i = 0;
    p = l->next;
    q = l;
    while (p)
    {
        
         sum += p->score;
        i++;
        p = p->next;
    }
    aver = (float)(sum / i);
    p = l; i = 0;
    while (q->next)
    {
        temp = q;
        p = q->next;
       
        
        if (p->score < aver)
        {
            temp->next = p->next;

            free(p);
        }
        else { q = q->next; }
        
        
    }
}


int main()
{
    mate l;
    l = (mate)malloc(sizeof(stu));
    create(l);
    dele(l);
    l = l->next;
    while (l)
    {
        if(l->score!=0)
        printf("%s\n", l->name);
        l = l->next;
    }
    return 0;
}

struct Node{ int data; struct Node *next; }

编程实现:输入一个正整数 n (0<n<10),做 n 次下列运算: 输入若干个正整数(输入-1为结束标志),建立一个单向链表,将其中的奇数值结点删除后输出,若删除后链表为空则输出NULL。

输入描述

第一行一个正整数n表示有n组数据;

接下来n行,每一行输入若干个整数以-1位结束标志(-1不属于序列)

输出描述

输出删除奇数值结点后的链表

样例输入

2
1 2 3 4 5 6 7 -1
1 3 5 6 -1

样例输出

2 4 6
6

#include <stdio.h>
#include <stdlib.h>

struct ListNode {
    int data;
    struct ListNode *next;
}a[10];
struct ListNode *createlist();
struct ListNode *deleteeven( struct ListNode *head );

void printlist( struct ListNode *head )
{
     struct ListNode *p = head;
     if(p==NULL){
         printf("NULL");
     }else{
            while (p) {
            printf("%d ", p->data);
            p = p->next;
        }
     }
     printf("\n");
}

void main()
{
    struct ListNode *head;
    int n;
    scanf("%d",&n);
    head = a;
    while(n != 0){
        head = createlist();
        head = deleteeven(head);
        printlist(head);
        n = n - 1;
    }
}

struct ListNode *createlist(){
    struct ListNode* head,*p,*tail;
    head = (struct ListNode *)malloc(sizeof(struct ListNode *));
    head->next = NULL;
    head->data = 0;
    tail = head;
    int num;
    while(1){
        scanf("%d",&num);
        if(num==-1) break;
        p = (struct ListNode *)malloc(sizeof(struct ListNode *));
        p->data = num;
        p->next = NULL;
        tail->next = p;
        tail = p;
    }
    return head;
}

struct ListNode *deleteeven( struct ListNode *head ){
    struct ListNode* temp,*p;
    temp = head;
    while(temp->next !=NULL){
        if((temp->next->data)%2!=0){
            p = temp->next;
            temp->next = temp->next->next;
            free(p);
        }
        else
            temp = temp->next;
    }
    return head->next;
}

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。

输入描述

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出描述

在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL

样例输入

1 2 5 -1
2 4 5 8 10 -1

样例输出

2 5

#include<stdio.h>

#include<stdlib.h>

typedef struct list *List;

struct list{

    int data;

    List next;

};

int main()

{

    int i,n,flag = 0;

    List s1,s2,s3,t,S1,S2,S3;

    S1 = (List)malloc(sizeof(struct list));

    S2 = (List)malloc(sizeof(struct list));

    S3 = (List)malloc(sizeof(struct list));

    S3->next = NULL;

    s1 = S1;

    s2 = S2;

    s3 = S3;

    /* 往s1里输入数据 */

    while(1){

        scanf("%d",&n);

        if(n == -1) break;

        t = (List)malloc(sizeof(struct list));

        t->data = n;

        t->next = NULL;

        s1->next = t;

        s1 = s1->next;

    }

   

    /* 往s2里输入数据 */

    while(1){

        scanf("%d",&n);

        if(n == -1) break;

        t = (List)malloc(sizeof(struct list));

        t->data = n;

        t->next = NULL;

        s2->next = t;

        s2 = s2->next;

    }

    s1 = S1;

    s2 = S2;

    /* 判断交集并输入进s3 */

    while(s1->next != NULL && s2->next != NULL){

        if(s1->next->data == s2->next->data){

            s3->next = s1->next;

            s1 = s1->next;

            s2 = s2->next;

            s3 = s3->next;

        }else if(s1->next->data > s2->next->data){

            s2 = s2->next;

        }else{

            s1 = s1->next;

        }

    }

   

    /* 输出 */

    s3 = S3;

    if(s3->next == NULL){

        printf("NULL");

        return 0;

    }

    while(s3->next != NULL){

        if(!flag){

            flag = 1;

            printf("%d",s3->next->data);

        }else{

            printf(" %d",s3->next->data);

        }

        s3 = s3->next;

    }

}

链表是数据结构中一种最基本的数据结构,它是用链式存储结构实现的线性表。它较顺序表而言在插入和删除时不必移动其后的元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素,会在其中某些时候让你查找某个元素或者输出当前链表中所有的元素。

下面给你基本的算法描述:

图1:链表类型的定义以及获得链表元素的算法描述

图2:链表的插入算法描述

图3:链表的删除算法描述

图4:链表的创建算法描述

输入描述

输入数据只有一组,第一行有n+1个整数,第一个整数是这行余下的整数数目n,后面是n个整数。这一行整数是用来初始化列表的,并且输入的顺序与列表中的顺序相反,也就是说如果列表中是1、2、3那么输入的顺序是3、2、1。

第二行有一个整数m,代表下面还有m行。每行有一个字符串,字符串是“get”,“insert”,“delete”,“show”中的一种。如果是“get”或者“delete”,则其后跟着一个整数a,代表获得或者删除第a个元素;如果是“insert”,则其后跟着两个整数a和e,代表在第a个位置前面插入e;“show”之后没有整数。

输出描述

如果获取成功,则输出该元素;如果删除成功则输出“delete OK”;如果获取失败或者删除失败,则输出“get fail”以及“delete fail”。如果插入成功则输出“insert OK”,否则输出“insert fail”。如果是“show”则输出列表中的所有元素,如果列表是空的,则输出“Link list is empty”。注:所有的双引号均不输出。

提示

提示:

1、因为输入数据中含有大量的插入和删除操作(不管你信不信,反正我信了),所以必须使用链表,否则很可能会超时。这也是考查链表的特性吧。

2、初始化链表的元素是倒序的,这个使用题目中创建列表的方法(从头部插入)就可以了。

总结:

这题考查的是链表的特性。顺序表中,怎样判断何时使用顺序表何时使用链表呢?就要看它们的特点了。顺序表的特点是随机存取、随机访问,也就是说如果存取和查询比较频繁的话使用顺序表比较合适;链表的特点是插入和删除时不必移动其后的节点,如果插入和删除操作比较频繁的话使用链表比较合适

样例输入

3 3 2 1
21
show
delete 1
show
delete 2
show
delete 1
show
delete 2
insert 2 5
show
insert 1 5
show
insert 1 7
show
insert 2 5
show
insert 3 6
show
insert 1 8
show
get 2

样例输出

1 2 3
delete OK
2 3
delete OK
2
delete OK
Link list is empty
delete fail
insert fail
Link list is empty
insert OK
5
insert OK
7 5
insert OK
7 5 5
insert OK
7 5 6 5
insert OK
8 7 5 6 5
7

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct lnode {
    int data;
    struct lnode* next;
}lnode, * linklist;

void create(linklist l, int n)
{
    linklist p;
    int i;
    p = (linklist)malloc(sizeof(lnode));
    p->next = NULL;
    for (i = n; i > 0; i--)
    {
        p = (linklist)malloc(sizeof(lnode));
        scanf("%d", &p->data);
        p->next = l->next;
        l->next = p;
    }
}

int get(linklist l, int i)
{
    linklist p;
    p = l->next;
    int j = 1;
    while (p && j < i)
    {
        p = p->next;
        j++;
    }
    if (!p || j-1 == i)
        return 0;
    int e = p->data;
    return e;
}

int insert(linklist l, int i, int e)
{
    linklist p, s;
    int j = 0;
    p = l;
    while (p->next && j < i-1)
    {
        p = p->next;
        j++;

    }
    if(i!=1)
    if (!(p->next)||i < j)
        return 0;
    s = (linklist)malloc(sizeof(lnode));
    s->next = p->next;
    s->data = e;
    p->next = s;
    return 1;
}

int dele(linklist l, int i)
{
    linklist p, q;
    int j = 0;
    p = l;
    while (p->next && j < i-1)
    {
        p = p->next;
        j++;
    }
    if (!(p->next) || j > i)
        return 0;
    q = p->next;
    p->next = q->next;

    free(q);
    return 1;
}

int show(linklist l)
{
    linklist p = l->next;
    if (l->next == NULL)
    {
        printf("Link list is empty\n"); return 0;
    }
    while (p)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
    return 0;
}

int main()
{
    int n;
    scanf("%d", &n);
    linklist l;
    l = (linklist)malloc(sizeof(lnode));
    l->next = NULL;
    create(l, n);
    int m;
    scanf("%d", &m);
    for (int i = 0; i < m; i++)
    {
        char a[100]; int j;
        scanf("%s", a);
        if (!strcmp(a, "get"))
        {
            scanf("%d", &j);
            int num = get(l, j);
            if (!num)
            {
                printf("get fail\n"); continue;
            }
            printf("%d\n", num);
        }
        else if (!strcmp(a, "insert"))
        {
            scanf("%d %d", &j, &n);
            int num = insert(l, j, n);
            if (!num)
            {
                printf("insert fail\n"); continue;
            }
            printf("insert OK\n");
        }
        else if (!strcmp(a, "delete"))
        {
            scanf("%d", &j);
            int num = dele(l, j);
            if (!num)
            {
                printf("delete fail\n"); continue;
            }
            printf("delete OK\n");
        }
        else if (!strcmp(a, "show"))
        {
            show(l);
        }

    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xwdlu/article/details/122239267

智能推荐

oracle 12c 集群安装后的检查_12c查看crs状态-程序员宅基地

文章浏览阅读1.6k次。安装配置gi、安装数据库软件、dbca建库见下:http://blog.csdn.net/kadwf123/article/details/784299611、检查集群节点及状态:[root@rac2 ~]# olsnodes -srac1 Activerac2 Activerac3 Activerac4 Active[root@rac2 ~]_12c查看crs状态

解决jupyter notebook无法找到虚拟环境的问题_jupyter没有pytorch环境-程序员宅基地

文章浏览阅读1.3w次,点赞45次,收藏99次。我个人用的是anaconda3的一个python集成环境,自带jupyter notebook,但在我打开jupyter notebook界面后,却找不到对应的虚拟环境,原来是jupyter notebook只是通用于下载anaconda时自带的环境,其他环境要想使用必须手动下载一些库:1.首先进入到自己创建的虚拟环境(pytorch是虚拟环境的名字)activate pytorch2.在该环境下下载这个库conda install ipykernelconda install nb__jupyter没有pytorch环境

国内安装scoop的保姆教程_scoop-cn-程序员宅基地

文章浏览阅读5.2k次,点赞19次,收藏28次。选择scoop纯属意外,也是无奈,因为电脑用户被锁了管理员权限,所有exe安装程序都无法安装,只可以用绿色软件,最后被我发现scoop,省去了到处下载XXX绿色版的烦恼,当然scoop里需要管理员权限的软件也跟我无缘了(譬如everything)。推荐添加dorado这个bucket镜像,里面很多中文软件,但是部分国外的软件下载地址在github,可能无法下载。以上两个是官方bucket的国内镜像,所有软件建议优先从这里下载。上面可以看到很多bucket以及软件数。如果官网登陆不了可以试一下以下方式。_scoop-cn

Element ui colorpicker在Vue中的使用_vue el-color-picker-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏3次。首先要有一个color-picker组件 <el-color-picker v-model="headcolor"></el-color-picker>在data里面data() { return {headcolor: ’ #278add ’ //这里可以选择一个默认的颜色} }然后在你想要改变颜色的地方用v-bind绑定就好了,例如:这里的:sty..._vue el-color-picker

迅为iTOP-4412精英版之烧写内核移植后的镜像_exynos 4412 刷机-程序员宅基地

文章浏览阅读640次。基于芯片日益增长的问题,所以内核开发者们引入了新的方法,就是在内核中只保留函数,而数据则不包含,由用户(应用程序员)自己把数据按照规定的格式编写,并放在约定的地方,为了不占用过多的内存,还要求数据以根精简的方式编写。boot启动时,传参给内核,告诉内核设备树文件和kernel的位置,内核启动时根据地址去找到设备树文件,再利用专用的编译器去反编译dtb文件,将dtb还原成数据结构,以供驱动的函数去调用。firmware是三星的一个固件的设备信息,因为找不到固件,所以内核启动不成功。_exynos 4412 刷机

Linux系统配置jdk_linux配置jdk-程序员宅基地

文章浏览阅读2w次,点赞24次,收藏42次。Linux系统配置jdkLinux学习教程,Linux入门教程(超详细)_linux配置jdk

随便推点

matlab(4):特殊符号的输入_matlab微米怎么输入-程序员宅基地

文章浏览阅读3.3k次,点赞5次,收藏19次。xlabel('\delta');ylabel('AUC');具体符号的对照表参照下图:_matlab微米怎么输入

C语言程序设计-文件(打开与关闭、顺序、二进制读写)-程序员宅基地

文章浏览阅读119次。顺序读写指的是按照文件中数据的顺序进行读取或写入。对于文本文件,可以使用fgets、fputs、fscanf、fprintf等函数进行顺序读写。在C语言中,对文件的操作通常涉及文件的打开、读写以及关闭。文件的打开使用fopen函数,而关闭则使用fclose函数。在C语言中,可以使用fread和fwrite函数进行二进制读写。‍ Biaoge 于2024-03-09 23:51发布 阅读量:7 ️文章类型:【 C语言程序设计 】在C语言中,用于打开文件的函数是____,用于关闭文件的函数是____。

Touchdesigner自学笔记之三_touchdesigner怎么让一个模型跟着鼠标移动-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏13次。跟随鼠标移动的粒子以grid(SOP)为partical(SOP)的资源模板,调整后连接【Geo组合+point spirit(MAT)】,在连接【feedback组合】适当调整。影响粒子动态的节点【metaball(SOP)+force(SOP)】添加mouse in(CHOP)鼠标位置到metaball的坐标,实现鼠标影响。..._touchdesigner怎么让一个模型跟着鼠标移动

【附源码】基于java的校园停车场管理系统的设计与实现61m0e9计算机毕设SSM_基于java技术的停车场管理系统实现与设计-程序员宅基地

文章浏览阅读178次。项目运行环境配置:Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。项目技术:Springboot + mybatis + Maven +mysql5.7或8.0+html+css+js等等组成,B/S模式 + Maven管理等等。环境需要1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。_基于java技术的停车场管理系统实现与设计

Android系统播放器MediaPlayer源码分析_android多媒体播放源码分析 时序图-程序员宅基地

文章浏览阅读3.5k次。前言对于MediaPlayer播放器的源码分析内容相对来说比较多,会从Java-&amp;amp;gt;Jni-&amp;amp;gt;C/C++慢慢分析,后面会慢慢更新。另外,博客只作为自己学习记录的一种方式,对于其他的不过多的评论。MediaPlayerDemopublic class MainActivity extends AppCompatActivity implements SurfaceHolder.Cal..._android多媒体播放源码分析 时序图

java 数据结构与算法 ——快速排序法-程序员宅基地

文章浏览阅读2.4k次,点赞41次,收藏13次。java 数据结构与算法 ——快速排序法_快速排序法