第九次作业

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

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

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

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

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

输入描述

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

最后一行是*.

输出描述

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

样例输入

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);
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值