c中字典实现的问题

问题描述 投票:0回答:2

所以,我一直在尝试使用数组实现一个字典(仍然没有编写DiDelete函数,现在不相关),但是出现了两个问题,这里是代码:

#include <stdio.h>
#include <stdlib.h>
#define MAX 1000

typedef int elementtype;

typedef struct{
    int last;
    elementtype elements[MAX];
}Dictionary;

void DiMakeNull(Dictionary *A)
{
    (*A).last = -1;
}

int DiMember(elementtype x, Dictionary A)
{
    int f,m,l;
    f = 0;
    l = A.last;
    m = (f+l)/2;
    while(f <= l )
    {
        if( A.elements[m] == x) return 1;
        else if( A.elements[m] < x) f = m+1;
        else l = m-1;

        m = (f+l)/2;
    }
    return 0;
}

void DiInsert(elementtype x, Dictionary *A)
{
    int i = 0,j;
    elementtype temp;
    while( ((*A).elements[i] < x) && ((*A).last >= i) )
    {
        i++;
    }
    for(j = i ; j <= (*A).last; j++)
    {
        (*A).elements[j+1] = (*A).elements[j];
    }

    (*A).elements[i] = x;
    (*A).last++;
}

int DiEmpty(Dictionary A)
{
    if(A.last == -1) return 1;
    return 0;
}

void DiPrint(Dictionary A)
{
    int i;
    printf("Dict:\n");
    for(i = 0; i <= A.last; i++)
        printf("%d\n",A.elements[i]);
    printf("End!");
}

问题1:为什么DiPrint不起作用?在给出一个带有已确认数字的字典后,它的'元素数组中打印出随机数。看起来相当简单,我不明白我在那里错了!

问题2:为什么当一个函数是例如

void function(Dictionary *A)

我不能使用符号A-> last,而是我必须使用(* A).last

提前致谢!

编辑:主程序看起来像这样:

#include <stdio.h>
#include <stdlib.h>
#include "atp_dictionary_pomocu_liste.c"

int main()
{
    Dictionary A;
    DiMakeNull(&A);
    DiInsert(4,&A);
    DiInsert(3,&A);
    DiInsert(32,&A);
    DiPrint(A);
    return 0;
}
c dictionary
2个回答
2
投票

好吧,我会告诉你我是如何调试的。我喜欢我的编译器所以我编译了代码。

 error: could not convert '& A' from 'Dictionary*' to 'Dictionary'
     DiPrint(&A);
               ^

它告诉我,我在DiPrint()有类型不匹配。

然后三个变化,它的工作。

void DiPrint(Dictionary* A)
{
    int i;
    printf("Dict:\n");
    for(i = 0; i <= (*A).last; i++)
        printf("%d\n",(*A).elements[i]);
    printf("End!");
}

并且在回答您的问题时,为什么我们需要在使用之前取消引用它?因为我们传递了结构的地址。除非我们取消引用它,否则我们不会得到struct实例。


从评论我再次不得不回滚代码,我们需要直接传递结构实例,所以我们做了

DiPrint(A);

void DiPrint(Dictionary A)
{
    int i;
    printf("Dict:\n");
    for(i = 0; i <= A.last; i++)
        printf("%d\n",A.elements[i]);
    printf("End!");
}

这将在没有那些一元*的情况下工作,因为我们直接在结构实例上工作。

Isn't A->last and (*A).last the same thing?

对,他们是。这就是为什么当你称之为DiPrint(&A)时,这个功能也会起作用。

void DiPrint(Dictionary* A)
{
    int i;
    printf("Dict:\n");
    for(i = 0; i <= A->last; i++)
        printf("%d\n",A->elements[i]);
    printf("End!");
}

0
投票

您的代码中有错误;在DiPrint(Dictionary A)中,你的函数需要类型Dictionary而不是类型Dictionary *,你需要在你的代码中修改这个调用函数部分,所以它将是:

DiPrint(A);

DiPrint(&A);

或者另一个解决方案是修改你的函数以接受指针,所以它将是:

void DiPrint(Dictionary* A)
{
    int i;
    printf("Dict:\n");
    for(i = 0; i <= (*A).last; i++)
        printf("%d\n",(*A).elements[i]);
    printf("End!");
}
© www.soinside.com 2019 - 2024. All rights reserved.