rsZheng4916 2021-12-27 22:40 采纳率: 60%
浏览 41
已结题

implicit declaration of function 'GetLength'


#include<stdio.h>
#include<stdlib.h>

// int GetLength(DuLinkList L);

typedef int ElemType;
typedef struct DuLNode{
    ElemType data;
    struct DuLNode *prior,*next;
}DuLNode,*DuLinkList;

/**
 * @brief 初始化一个空的带头结点的双向链表
 * @return DuLinkList 双向链表
 */
DuLinkList InitDuList(){
    DuLinkList L = (DuLinkList)malloc(sizeof(DuLNode));
    if(L == NULL){
        printf("---Init failure---");
        exit(1);
    }
    L->prior = NULL;
    L->next = NULL;
    return L;
}

/**
 * @brief 插入结点
 * @param L 双向链表
 * @param length 插入的个数
 */
void InsertList(DuLinkList L,int length){
    DuLinkList p = L;
    for (int i = 0; i < length; i++) {
         // 1.创建临时结点
        DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode));
        temp->next = NULL;
        temp->prior = NULL;
        temp->data = i;
        // 2.为结点建立双向链表关系
        // ①.temp是p的后继
        p->next = temp;
        // ②.temp的前驱是p
        temp->prior = p;
        // ③.记录最后的结点位置
        p = temp;
    }
}

/**
 * @brief 指定[逻辑]位置插入结点
 * @param L 双向链表
 * @param index 逻辑位置
 * @param elem 插入结点的值
 */
void InsertElem(DuLinkList L,int index,ElemType elem){
    DuLinkList p = L;
    // 判断插入位置
    if(index < 1){
        printf("InsertElem: index is illegal!\n");
        exit(1);
    }
    // 新建结点
    DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode));
    temp->data = elem;
    temp->prior = NULL;
    temp->next = NULL;
    // 查找index位置的结点
    int i = 1;
    for(i = 1;i < index&&p;i++){
        p = p->next;
    }
    // 插入位置超过链表长度
    if(p == NULL){
        printf("InsertElem: index is more than LinkList!\n");
        exit(1);
    }
    // 判断插入位置是否为链表尾部
    if(p->next == NULL){
        p->next = temp;
        temp->prior = p;
    }else{
        p->next->prior = temp;
        temp->next = p->next;
        p->next = temp;
        temp->prior = p;
    }
}

/**
 * @brief 删除指定[逻辑]位置的结点
 * @param L 双向链表
 * @param index 逻辑位置
 * @param elem 待删结点的元素值
 * @return int 返回待删结点的元素值类型
 */
int DeleteNode(DuLinkList L,int index,ElemType *elem){
    DuLinkList p = L;
    // 判断链表是否为空
    if(L == NULL){
        exit(1);
    }
    // 移动指针到待删结点之前
    int k = 1;
    while(k<index && p!=NULL){
        p = p->next;
        k++;
    }
    // 如果k>index或者p==NULL
    if(k>index || p==NULL){
        exit(1);
    }
    // 创建临时指针指向待删结点,并将待删结点的data赋值给*elem
    DuLinkList delTemp = p->next;
    *elem = delTemp->data;
    // p->next等于待删结点的下一个结点
    p->next = delTemp->next;
    // 如果删除结点的下一个结点不为空,则将删除结点的前驱指向p
    if(delTemp->next != NULL){
        delTemp->next->prior = p;
    }
    // 释放delTemp结点
    free(delTemp);
    printf("Delete Node No.%d,it's data is %d!\n",index,*elem);
}

/**
 * @brief 删除指定元素值的结点
 * @param L 双向链表
 * @param elem 元素值
 */
void DeleteVal(DuLinkList L,int elem){
    DuLinkList p = L;
    while(p){
        // 判断结点的数据域与etlem是否相等
        if(p->data == elem){
            p->prior->next = p->next;
            if(p->next != NULL)
                p->next->prior = p->prior;
            // 释放被删除结点
            free(p);
            break;
        }
        // 没有找到结点,继续移动指针
        p = p->next;
    }
}

/**
 * @brief 遍历双向链表
 * @param L 双向链表
 */
void Display(DuLinkList L){
    DuLinkList s = L->next;
    if(s == NULL)
        printf("Display: LinkList is Null!\n");
    else{
        printf("Display: ");
        while(s){
            printf("%d  ",s->data);
            s = s->next;
        }
        printf("\n");
    }
}

/**
 * @brief Get the Element object 按位查找
 * 根据逻辑位置的序号查找其元素值
 * @param L 双向链表
 * @param position 逻辑位置的序号
 */
void GetElement(DuLinkList L,int position){
    int len = GetLength(L);
    if(position<1 || position > len){
        printf("GetElem: position error!\n");
    }else{
        int count = 0;
        while(count < position){
            L = L->next;
            count++;
        }
        printf("GetElement: position %d's data is %d!\n",position,L->data);
    }
}

/**
 * @brief Get the Length object 获取双向链表的长度
 * @param L 双向链表
 * @return int 长度
 */
int GetLength(DuLinkList L){
    int length = 0;
    DuLinkList p = L->next;
    while(p){
        length++;
        p = p->next;
    }
    return length;
}

int main(){
    DuLinkList L = InitDuList();
    int elem;

    InsertList(L,3);
    Display(L);
    printf("length is: %d!\n",GetLength(L));
    // DeleteNode(L,3,&elem);
    // DeleteVal(L,1);
    GetElement(L,2);
    Display(L);
    printf("length is: %d!\n",GetLength(L));
}

大家好,我是初学者,请问为什么我的程序中方法都没有做声明,然后只有GetLength这个方法提示我需要做声明呢。

  • 写回答

2条回答 默认 最新

  • 书山客 2021-12-28 09:25
    关注

    img


    图中两个函数位置换一下,如果没有在前面写函数的申明的话,函数的实现就要在函数调用之前

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 1月1日
  • 已采纳回答 1月1日
  • 创建了问题 12月27日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度