DEV 头文件和源文件
本帖最后由 zhenjen 于 2023-7-5 19:40 编辑#include <limits.h>
#include <stdlib.h>
#include<stdio.h>
#ifndef HEAP
#define HEAP
#defineCap 20
struct Heap;
typedef struct Heap *H;
H Initialize (H heap );
int Isfull (H heap);
int Isempty( H heap);
void Insert (H heap ,int num);
void DeleteMin(H heap);
void printf_all (H heap);
#endif
struct Heap
{
int Capacity; //数组容量
int Size; //当前数量
int* List;
};
HInitialize (H heap)
{
if(!heap)
return heap;
heap =(H)malloc(sizeof(struct Heap));
if(!heap)
{
perror("malloc error") ;
exit(EXIT_FAILURE);
}
heap->List=(int*)malloc((Cap+1)*sizeof(int));
if(!heap->List)
{
perror("malloc error") ;
exit(EXIT_FAILURE);
}
else
{
heap->Capacity=Cap;
heap->Size=0;
heap->List=INT_MIN;
}
return heap;
}
int Isempty (H heap)
{
return !!(heap->Size==0);
}
int Isfull(H heap)
{
return !!(heap->Capacity==Cap);
}
void Insert (H heap, int num)
{
int i;
if(!heap)
{
perror("heap is empty") ;
exit(EXIT_FAILURE);
}
for(i=heap->Size+1;heap->List>num;i/=2)
heap->List=heap->List;
heap->List=num;
}
void DeleteMin(H heap)
{
int i,child;
int Min,Max;
if(!heap)
{
perror("heap is empty") ;
exit(EXIT_FAILURE);
}
Min=heap->List;
Max=heap->List;
for(i=1;i*=2<=heap->Size;i=child)
{
child=i*2;
if(heap->Size>child&&heap->List>heap->List)
child++;
if(Max>heap->List)
heap->List=heap->List;
else
break;
}
heap->List=Max;
}
void printf_all (H heap)
{
for(int i=1;(heap->Size+1)>i;i++)
printf("1");
}
#include"Header.h "
int main()
{
struct Heap *heap=NULL;
heap=Initialize(heap);
int n=0;
while(scanf("%d",&n)==1)
{
Insert(heap,n);
}
printf_all(heap);
}
头文件进行函数声明;(一个头文件二个源文件)
其中一个源文件进行函数定义;(文件中有#include“头文件”)
问题在包含main()函数源文件报错:函数未定义(#include“头文件”)
头文件的代码
函数返回值类型一致吗 where's your code? 豆嘉木 发表于 2023-7-5 19:09
函数返回值类型一致吗zhizhi
一致
报错:E:\c编程练习\数据算法\main.o In function `main':
18 E:\c编程练习\数据算法\main.c undefined reference to `Initialize'
22 E:\c编程练习\数据算法\main.c undefined reference to `Insert'
24 E:\c编程练习\数据算法\main.c undefined reference to `printf_all'
E:\c编程练习\数据算法\collect2.exe ld returned 1 exit status
26 E:\c编程练习\数据算法\Makefile.win recipe for target '6.2.exe' failed
歌者文明清理员 发表于 2023-7-5 19:11
where's your code?
发了发了
zhenjen 发表于 2023-7-5 19:19
发了发了
发在代码标签里
https://xxx.ilovefishc.com/forum/201812/27/131051dgwjh7dj7t7nanez.jpg
不然会冲突 歌者文明清理员 发表于 2023-7-5 19:23
发在代码标签里
不然会冲突
好了
zhenjen 发表于 2023-7-5 19:40
好了
头文件呢limits.h 你的代码中主要有以下几个问题需要注意:
1.#include"Header.h " 这行代码包含了一个不必要的空格,它可能阻止编译器正确找到头文件。你应该使用 #include "Header.h" 。
2. 你在定义 struct Heap 之前就已经开始使用了这个类型,这可能会导致编译器报告未定义类型的错误。你需要先定义类型,然后再使用。
3. 在你的 Insert 函数中,当 heap->List>num 为 false 时,会跳出循环,但此时 i 已经被除以2,这可能会导致数组越界错误。你需要在分配值给 heap->List] 之前修复 i 。
4. 在 DeleteMin 函数中, heap->Size-1 会越过数组边界,如果 heap->Size 是0,那么结果是一个负数,这在C中是未定义的行为。
5. 你的代码中,heap的实例化在 Initialize 函数中发生,而你在main函数中传入的heap是 NULL ,这不是一个好的实践。你可以直接在 Initialize 函数中创建heap,无需在函数外部创建。
以下是修改后的代码:
Header.h
#ifndef HEAP
#define HEAP
#defineCap 20
struct Heap {
int Capacity; //数组容量
int Size; //当前数量
int* List;
};
typedef struct Heap *H;
H Initialize();
int Isfull(H heap);
int Isempty(H heap);
void Insert(H heap, int num);
void DeleteMin(H heap);
void printf_all(H heap);
#endif
Heap.c
#include <limits.h>
#include <stdlib.h>
#include<stdio.h>
#include "Header.h"
H Initialize() {
H heap;
heap =(H)malloc(sizeof(struct Heap));
if(!heap) {
perror("malloc error");
exit(EXIT_FAILURE);
}
heap->List=(int*)malloc((Cap+1)*sizeof(int));
if(!heap->List) {
perror("malloc error") ;
exit(EXIT_FAILURE);
} else {
heap->Capacity=Cap;
heap->Size=0;
heap->List=INT_MIN;
}
return heap;
}
int Isempty (H heap) {
return heap->Size == 0;
}
int Isfull(H heap) {
return heap->Size == Cap;
}
void Insert (H heap, int num) {
int i;
if(!heap) {
perror("heap is empty") ;
exit(EXIT_FAILURE);
}
for(i=heap->Size+1;heap->List>num;i/=2)
heap->List=heap->List;
heap->List=num;
heap->Size++;
}
void DeleteMin(H heap) {
int i,child;
int Min,Max;
if(!heap) {
perror("heap is empty") ;
exit(EXIT_FAILURE);
}
Min=heap->List;
Max=heap->List;
for(i=1;i*2<=heap->Size;i=child) {
child=i*2;
if(child != heap·>Size && heap->List > heap->List)
child++;
if(Max > heap->List)
heap->List=heap->List;
else
break;
}
heap->List=Max;
heap->Size--;
}
void printf_all(H heap) {
for(int i=1;i<=heap->Size;i++)
printf("%d\n", heap->List);
}
main.c
#include <stdio.h>
#include "Header.h"
int main() {
H heap = Initialize();
int n=0;
while(scanf("%d",&n)==1) {
Insert(heap,n);
}
printf_all(heap);
return 0;
}
注意,这些代码不会实现一个有效的堆数据结构,因为 Insert 和 DeleteMin 函数的实现不正确,它们不会保持堆的属性。你可能需要重新实现这两个函数以实现有效的堆数据结构。 歌者文明清理员 发表于 2023-7-5 19:42
头文件呢limits.h
第一个 zhenjen 发表于 2023-7-5 19:50
第一个
有函数声明的 zhenjen 发表于 2023-7-5 19:50
有函数声明的
源文件是定义函数 本帖最后由 zhenjen 于 2023-7-5 21:10 编辑
1 isdkz 发表于 2023-7-5 19:44
你的代码中主要有以下几个问题需要注意:
1.#include"Header.h " 这行代码包含了一个不必要的空格,它 ...
为什么会不识别定义了?
页:
[1]