C中的稀疏和密集数组

时间:2018-03-27 09:33:02

标签: c

如何打印稀疏和密集的数组? 更确切地说,如果我有一个带有pozitions的数组:

> (pozition, value) = [(2,4)(3,5),(4,5)] must print
> [(0,0)(1,0)(2,4)(3,5)(4,5)]?

或如果数组[[(0,0)(1,0)(2,4)(3,5)(4,5)]应打印[(2,4)(3,5),(4,5)]? 我从结构开始:

struct arr
{
    int position;
    int value;
    struct arr *next;
};

对于给定的值和位置,我该怎么办?我试图打印,工作,但我不知道是否正确。

typedef struct arr *ARR;

ARR term(int poz, int val)
{
    ARR w;
    w=(ARR)malloc(sizeof(struct arr));
    w->position=poz;
    w->value=val;
    return w;
}

ARR oneterm(int val,int poz, ARR nextarr) ///create term
{
    ARR w;
    w=term(poz,val;
    w->next =nextarr;
    return w;
}
ARR create(int poz[],int val[],int n)
{
    ARR w=NULL;
    for(n--;n>=0;n--)
        w=oneterm(poz[n],val[n],w);
    return w;
}
void print(struct arr p, char *text)
{
    printf("\n%s",text);
    for(; p; p=p->next)
    printf("(%d , %d)",p->value,p->position);
}

这就是我的主要内容:

ARR a=NULL;
int c[] = {2,7,11,12};
int b[]= {4,3,1,0};
a=createvect(b,c,4);

我的问题是:如何打印稀疏和密集的数组?

1 个答案:

答案 0 :(得分:0)

这两个问题是相似的,但第二个问题更容易实现。两者都可以在线性时间内完成。

第二个问题:

[(0,0), (1,0), (2,4), (3,5), (4,5)] -> [(2,4), (3,5), (4,5)]

只需迭代输入列表并输出第二个元素为非零的对。

第一个问题:

[(2,4), (3,5), (4,5)] -> [(0,0), (1,0), (2,4), (3,5), (4,5)]

假设输入列表始终是有序的,输出列表应该从0到输入列表的最大第一个元素。

创建一个循环,使索引从0开始,同时迭代列表。如果索引与列表中的索引匹配,则输出该索引并在列表中前进。否则,输出一对零作为第二个元素。当你找到列表的末尾时停止。