九度OJ 1178:复数集合 (插入排序)

来源:互联网 发布:bt种子编辑器 for mac 编辑:程序博客网 时间:2024/05/18 01:10

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:8393

解决:1551

题目描述:

    一个复数(x+iy)集合,两种操作作用在该集合上:

    1、Pop 表示读出集合中复数模值最大的那个复数,如集合为空 输出  empty  ,不为空就输出最大的那个复数并且从集合中删除那个复数,再输出集合的大小SIZE;

    2 Insert a+ib  指令(a,b表示实部和虚部),将a+ib加入到集合中 ,输出集合的大小SIZE;

    最开始要读入一个int n,表示接下来的n行每一行都是一条命令。

输入:

输入有多组数据。
每组输入一个n(1<=n<=1000),然后再输入n条指令。

输出:

根据指令输出结果。

样例输入:
3PopInsert 1+i2Pop
样例输出:
emptySIZE = 11+i2SIZE = 0
提示:

模相等的输出b较小的复数。

a和b都是非负数。

来源:
2011年北京邮电大学网院研究生机试真题

思路:

定义一个复数结构体,同时定义比较操作,对结构体数组进行插入排序。

我写的代码有点复杂了,没必要非要用链表。


代码:

#include <stdio.h>#include <stdlib.h> #define N 1000 struct node {    int x;    int y;    struct node *next;}; int size; int squareSum(int x, int y){    return x*x+y*y;} struct node *insert(struct node *head, int x, int y){    if (head == NULL)    {        head = (struct node *)malloc(sizeof(struct node));        head->x = x;        head->y = y;        head->next = NULL;        printf("SIZE = %d\n", ++size);        return head;    }    struct node *p = head, *p0;    p0 = p;    while (p && squareSum(p->x, p->y) <= squareSum(x, y))    {        if (squareSum(p->x, p->y) == squareSum(x, y) && p->x > x)            break;        p0 = p;        p = p->next;    }    struct node *pnew = (struct node *)malloc(sizeof(struct node));    pnew->x = x;    pnew->y = y;    pnew->next = p;    printf("SIZE = %d\n", ++size);    if (p == head)        return pnew;    p0->next = pnew;    return head;}struct node * pop(struct node *head, int *x, int *y){    if (head == NULL)    {        printf("empty\n");        return head;    }    if (head->next == NULL)    {        printf("%d+i%d\n", head->x, head->y);        printf("SIZE = %d\n", --size);        return NULL;    }    struct node *p=head, *p0;    do {        p0 = p;        p = p->next;    } while (p->next != NULL);    printf("%d+i%d\n", p->x, p->y);    printf("SIZE = %d\n", --size);    p0->next = NULL;    return head;} int main(void){    int n, i, x, y;    struct node *head;    char command[N];     while (scanf("%d", &n) != EOF)    {        head = NULL;        size = 0;        for(i=0; i<n; i++)        {            scanf("%s", command);            if (command[0] == 'P')            {                head = pop(head, &x, &y);            }            else            {                scanf("%d+i%d", &x, &y);                head = insert(head, x, y);            }        }    }         return 0;}/**************************************************************    Problem: 1178    User: liangrx06    Language: C    Result: Accepted    Time:10 ms    Memory:912 kb****************************************************************/


0 0
原创粉丝点击