zhenjen 发表于 2023-7-5 19:04:03

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“头文件”)
头文件的代码

豆嘉木 发表于 2023-7-5 19:09:22

函数返回值类型一致吗

歌者文明清理员 发表于 2023-7-5 19:11:07

where's your code?

zhenjen 发表于 2023-7-5 19:12:48

豆嘉木 发表于 2023-7-5 19:09
函数返回值类型一致吗zhizhi

一致

zhenjen 发表于 2023-7-5 19:13:56

报错: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

zhenjen 发表于 2023-7-5 19:19:18

歌者文明清理员 发表于 2023-7-5 19:11
where's your code?

发了发了

歌者文明清理员 发表于 2023-7-5 19:23:16

zhenjen 发表于 2023-7-5 19:19
发了发了

发在代码标签里
https://xxx.ilovefishc.com/forum/201812/27/131051dgwjh7dj7t7nanez.jpg
不然会冲突

zhenjen 发表于 2023-7-5 19:40:41

歌者文明清理员 发表于 2023-7-5 19:23
发在代码标签里

不然会冲突

好了

歌者文明清理员 发表于 2023-7-5 19:42:16

zhenjen 发表于 2023-7-5 19:40
好了

头文件呢limits.h

isdkz 发表于 2023-7-5 19:44:07

你的代码中主要有以下几个问题需要注意:

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 函数的实现不正确,它们不会保持堆的属性。你可能需要重新实现这两个函数以实现有效的堆数据结构。

zhenjen 发表于 2023-7-5 19:50:05

歌者文明清理员 发表于 2023-7-5 19:42
头文件呢limits.h

第一个

zhenjen 发表于 2023-7-5 19:50:27

zhenjen 发表于 2023-7-5 19:50
第一个

有函数声明的

zhenjen 发表于 2023-7-5 19:53:25

zhenjen 发表于 2023-7-5 19:50
有函数声明的

源文件是定义函数

zhenjen 发表于 2023-7-5 20:34:06

本帖最后由 zhenjen 于 2023-7-5 21:10 编辑

1

zhenjen 发表于 2023-7-5 20:38:55

isdkz 发表于 2023-7-5 19:44
你的代码中主要有以下几个问题需要注意:

1.#include"Header.h " 这行代码包含了一个不必要的空格,它 ...

为什么会不识别定义了?
页: [1]
查看完整版本: DEV 头文件和源文件