所以,我一直在尝试使用数组实现字典(仍然没有编写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-&gt; 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;
}
答案 0 :(得分: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!");
}
这可以在没有那些一元*
的情况下工作,因为我们直接在结构实例上工作。
A->last
和(*A).last
不一样吗?是的。这就是为什么当你调用它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!");
}
答案 1 :(得分: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!");
}